تتطلب طباعة محتوى خارج نطاق صورة بسيطة على Android إنشاء نص ورسومات في وطباعة مستند. يوفر إطار عمل Android طريقة لاستخدام HTML لإنشاء مستند اطبعه بحد أدنى من التعليمات البرمجية.
وفي الإصدار Android 4.4 (المستوى 19 من واجهة برمجة التطبيقات)، تم تحديث الفئة WebView إلى
تمكين طباعة محتوى HTML. تتيح لك الفئة تحميل مورد HTML محلي أو تنزيله
صفحة من الويب وإنشاء مهمة طباعة وتسليمها إلى خدمات الطباعة في Android.
يوضح هذا الدرس كيفية إنشاء مستند HTML بسرعة يحتوي على نصوص ورسومات
يمكنك استخدام "WebView" لطباعته.
تحميل مستند HTML
تتضمّن طباعة مستند HTML باستخدام WebView تحميل ملف HTML.
أو إنشاء مستند HTML كسلسلة. يصف هذا القسم كيفية إنشاء ترميز HTML
سلسلة وتحميله في WebView للطباعة.
ويُستخدم عنصر طريقة العرض هذا عادةً كجزء من تخطيط النشاط. ومع ذلك، إذا كان طلبك
لا تستخدم WebView، يمكنك إنشاء مثيل للفئة
خصيصًا لأغراض الطباعة. الخطوات الأساسية لإنشاء عرض الطباعة المخصص هذا هي:
- إنشاء
WebViewClientتبدأ مهمة طباعة بعد تحميل مورد HTML. - تحميل مورد HTML إلى الكائن
WebView.
يوضح نموذج الرمز البرمجي التالي كيفية إنشاء رمز WebViewClient بسيط وتحميل مستند HTML تم إنشاؤه بشكل فوري:
Kotlin
private var mWebView: WebView? = null private fun doWebViewPrint() { // Create a WebView object specifically for printing val webView = WebView(activity) webView.webViewClient = object : WebViewClient() { override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest) = false override fun onPageFinished(view: WebView, url: String) { Log.i(TAG, "page finished loading $url") createWebPrintJob(view) mWebView = null } } // Generate an HTML document on the fly: val htmlDocument = "<html><body><h1>Test Content</h1><p>Testing, testing, testing...</p></body></html>" webView.loadDataWithBaseURL(null, htmlDocument, "text/HTML", "UTF-8", null) // Keep a reference to WebView object until you pass the PrintDocumentAdapter // to the PrintManager mWebView = webView }
Java
private WebView mWebView; private void doWebViewPrint() { // Create a WebView object specifically for printing WebView webView = new WebView(getActivity()); webView.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } @Override public void onPageFinished(WebView view, String url) { Log.i(TAG, "page finished loading " + url); createWebPrintJob(view); mWebView = null; } }); // Generate an HTML document on the fly: String htmlDocument = "<html><body><h1>Test Content</h1><p>Testing, " + "testing, testing...</p></body></html>"; webView.loadDataWithBaseURL(null, htmlDocument, "text/HTML", "UTF-8", null); // Keep a reference to WebView object until you pass the PrintDocumentAdapter // to the PrintManager mWebView = webView; }
ملاحظة: تأكَّد من أنّ الطلب لإنشاء مهمة طباعة يتم تنفيذه في طريقة onPageFinished() من WebViewClient التي أنشأتها في القسم السابق. إذا لم تنتظر حتى صفحة
اكتمل التحميل، أو قد يكون ناتج الطباعة غير مكتمل أو فارغًا، أو قد يتعذّر تمامًا.
ملاحظة: يشتمل المثال أعلاه على مثيل
كائن WebView بحيث لا يتم جمع البيانات غير الضرورية قبل مهمة الطباعة
يتم إنشاؤه. تأكد من تنفيذ الشيء ذاته في التنفيذ الخاص بك، وإلا في عملية الطباعة
وقد تفشل.
إذا كنت تريد تضمين الرسومات في الصفحة، ضع ملفات الرسومات في assets/.
مشروعك وتحديد عنوان URL أساسي في المعلمة الأولى من
loadDataWithBaseURL()، كما هو موضح في
مثال الرمز التالي:
Kotlin
webView.loadDataWithBaseURL( "file:///android_asset/images/", htmlBody, "text/HTML", "UTF-8", null )
Java
webView.loadDataWithBaseURL("file:///android_asset/images/", htmlBody, "text/HTML", "UTF-8", null);
يمكنك أيضًا تحميل صفحة ويب للطباعة من خلال استبدال
طريقة واحدة (loadDataWithBaseURL()) مع
loadUrl() كما هو موضح أدناه.
Kotlin
webView.loadUrl("https://developer.android.com/about/index.html")
Java
// Print an existing web page (remember to request INTERNET permission!): webView.loadUrl("https://developer.android.com/about/index.html");
عند استخدام WebView لإنشاء مستندات مطبوعة، يجب أن تكون على دراية
القيود التالية:
- لا يمكنك إضافة رؤوس أو تذييلات، بما في ذلك أرقام الصفحات، إلى المستند.
- لا تتضمن خيارات الطباعة لمستند HTML إمكانية طباعة الصفحة النطاقات، على سبيل المثال: طباعة الصفحة من 2 إلى 4 من مستند HTML مكون من 10 صفحات غير متاحة.
- يمكن لمثال
WebViewمعالجة مهمة طباعة واحدة فقط في كل مرة. - لا يُسمح باستخدام مستند HTML يحتوي على سمات طباعة CSS، مثل الخصائص الأفقية.
- لا يمكنك استخدام JavaScript في مستند HTML لتشغيل الطباعة.
ملاحظة: محتوى كائن WebView المضمّن في
يمكن أيضًا طباعة تخطيط بمجرد تحميله للمستند.
إذا كنت تريد إنشاء إخراج طباعة أكثر تخصيصًا والتحكّم بشكل كامل في المحتوى للرسم على الصفحة المطبوعة، انتقل إلى الدرس التالي: درس طباعة مستند مخصّص
إنشاء مهمة طباعة
بعد إنشاء WebView وتحميل محتوى HTML، لا
التطبيق على الانتهاء من الجزء الخاص به من عملية الطباعة. تتمثل الخطوات التالية في الوصول إلى
PrintManager، وإنشاء محوّل طباعة وأخيرًا إنشاء صورة
وظيفة. يوضح المثال التالي كيفية تنفيذ هذه الخطوات:
Kotlin
private fun createWebPrintJob(webView: WebView) { // Get a PrintManager instance (activity?.getSystemService(Context.PRINT_SERVICE) as? PrintManager)?.let { printManager -> val jobName = "${getString(R.string.app_name)} Document" // Get a print adapter instance val printAdapter = webView.createPrintDocumentAdapter(jobName) // Create a print job with name and adapter instance printManager.print( jobName, printAdapter, PrintAttributes.Builder().build() ).also { printJob -> // Save the job object for later status checking printJobs += printJob } } }
Java
private void createWebPrintJob(WebView webView) { // Get a PrintManager instance PrintManager printManager = (PrintManager) getActivity() .getSystemService(Context.PRINT_SERVICE); String jobName = getString(R.string.app_name) + " Document"; // Get a print adapter instance PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter(jobName); // Create a print job with name and adapter instance PrintJob printJob = printManager.print(jobName, printAdapter, new PrintAttributes.Builder().build()); // Save the job object for later status checking printJobs.add(printJob); }
يحفظ هذا المثال مثالاً على الكائن PrintJob لاستخدامه من خلال
تطبيقه، وهو أمر غير مطلوب. قد يستخدم التطبيق هذا الكائن لتتبع تقدم
مهمة الطباعة أثناء معالجتها. ويكون هذا الأسلوب مفيدًا عندما تريد مراقبة حالة
لمهمة الطباعة في طلبك لإكمالها أو عند حدوث إخفاق أو إلغاء من جانب المستخدم. إنشاء
لا يكون الإشعار داخل التطبيق مطلوبًا، لأنّ إطار عمل الطباعة ينشئ تلقائيًا نظامًا
لمهمة الطباعة.