تتطلب طباعة محتوى خارج نطاق صورة بسيطة على 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
لاستخدامه من خلال
تطبيقه، وهو أمر غير مطلوب. قد يستخدم تطبيقك هذا العنصر لتتبُّع مستوى تقدّم
مهمة الطباعة أثناء معالجتها. يكون هذا النهج مفيدًا عندما تريد تتبُّع حالة مهمة الطباعة في تطبيقك لمعرفة ما إذا كانت قد اكتملت أو تعذّر إكمالها أو تم إلغاؤها من قِبل المستخدم. إنشاء
لا يكون الإشعار داخل التطبيق مطلوبًا، لأنّ إطار عمل الطباعة ينشئ تلقائيًا نظامًا
لمهمة الطباعة.