طباعة مستندات HTML

تتطلب طباعة محتوى خارج نطاق صورة بسيطة على Android إنشاء نص ورسومات في وطباعة مستند. يقدّم إطار عمل Android طريقة لاستخدام HTML لإنشاء مستند و طباعته باستخدام الحد الأدنى من الرموز البرمجية.

وفي الإصدار Android 4.4 (المستوى 19 من واجهة برمجة التطبيقات)، تم تحديث الفئة WebView إلى تمكين طباعة محتوى HTML. تتيح لك الفئة تحميل مورد HTML محلي أو تنزيله صفحة من الويب وإنشاء مهمة طباعة وتسليمها إلى خدمات الطباعة في Android.

يوضّح لك هذا الدرس كيفية إنشاء مستند HTML بسرعة يحتوي على نص ورسومات واستخدام WebView لطباعته.

تحميل مستند HTML

تتضمّن طباعة مستند HTML باستخدام WebView تحميل ملف HTML. أو إنشاء مستند HTML كسلسلة. يصف هذا القسم كيفية إنشاء ترميز HTML سلسلة وتحميله في WebView للطباعة.

ويُستخدم عنصر طريقة العرض هذا عادةً كجزء من تخطيط النشاط. ومع ذلك، إذا كان طلبك لا تستخدم WebView، يمكنك إنشاء مثيل للفئة خصيصًا لأغراض الطباعة. الخطوات الأساسية لإنشاء عرض الطباعة المخصص هذا هي:

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