چاپ اسناد HTML

چاپ محتوایی فراتر از یک عکس ساده در اندروید نیازمند نوشتن متن و گرافیک در یک سند چاپی است. چارچوب اندروید راهی برای استفاده از HTML برای نوشتن یک سند و چاپ آن با حداقل کد ارائه می دهد.

در Android 4.4 (سطح API 19)، کلاس WebView برای فعال کردن چاپ محتوای HTML به روز شده است. این کلاس به شما امکان می دهد یک منبع HTML محلی را بارگیری کنید یا یک صفحه را از وب بارگیری کنید، یک کار چاپ ایجاد کنید و آن را به خدمات چاپ Android تحویل دهید.

این درس به شما نشان می دهد که چگونه به سرعت یک سند HTML حاوی متن و گرافیک بسازید و از WebView برای چاپ آن استفاده کنید.

یک سند HTML را بارگیری کنید

چاپ یک سند HTML با WebView شامل بارگیری یک منبع HTML یا ساخت یک سند HTML به عنوان یک رشته است. این بخش نحوه ساخت یک رشته HTML و بارگذاری آن در WebView برای چاپ را توضیح می دهد.

این شی view معمولاً به عنوان بخشی از یک طرح‌بندی فعالیت استفاده می‌شود. با این حال، اگر برنامه شما از WebView استفاده نمی کند، می توانید نمونه ای از کلاس را به طور خاص برای اهداف چاپ ایجاد کنید. مراحل اصلی برای ایجاد این نمای چاپ سفارشی عبارتند از:

  1. یک WebViewClient ایجاد کنید که پس از بارگیری منبع HTML کار چاپ را شروع می کند.
  2. منبع HTML را در آبجکت WebView بارگیری کنید.

نمونه کد زیر نحوه ایجاد یک WebViewClient ساده و بارگذاری یک سند HTML ایجاد شده در پرواز را نشان می دهد:

کاتلین

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
}

جاوا

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() مشخص کنید، همانطور که در مثال کد زیر نشان داده شده است:

کاتلین

webView.loadDataWithBaseURL(
        "file:///android_asset/images/",
        htmlBody,
        "text/HTML",
        "UTF-8",
        null
)

جاوا

webView.loadDataWithBaseURL("file:///android_asset/images/", htmlBody,
        "text/HTML", "UTF-8", null);

همچنین می‌توانید با جایگزین کردن متد loadDataWithBaseURL() با loadUrl() یک صفحه وب را برای چاپ بارگذاری کنید.

کاتلین

webView.loadUrl("https://developer.android.com/about/index.html")

جاوا

// 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، مانند ویژگی های چشم انداز، پشتیبانی نمی شود.
  • شما نمی توانید از جاوا اسکریپت در یک سند HTML برای شروع چاپ استفاده کنید.

توجه: محتوای یک شی WebView که در یک طرح بندی گنجانده شده است نیز می تواند پس از بارگیری یک سند چاپ شود.

اگر می‌خواهید خروجی چاپ سفارشی‌تری ایجاد کنید و کنترل کاملی بر ترسیم محتوا در صفحه چاپ شده داشته باشید، به درس بعدی بروید: چاپ درس سند سفارشی .

پس از ایجاد یک WebView و بارگیری محتوای HTML، برنامه شما تقریباً با بخشی از فرآیند چاپ به پایان رسیده است. مراحل بعدی دسترسی به PrintManager ، ایجاد یک آداپتور چاپ و در نهایت ایجاد یک کار چاپی است. مثال زیر نحوه انجام این مراحل را نشان می دهد:

کاتلین

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
        }
    }
}

جاوا

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 را برای استفاده توسط برنامه ذخیره می کند که نیازی به آن نیست. برنامه شما ممکن است از این شیء برای ردیابی پیشرفت کار چاپ در حین پردازش استفاده کند. این رویکرد زمانی مفید است که می‌خواهید وضعیت کار چاپ را در برنامه خود برای تکمیل، شکست یا لغو کاربر نظارت کنید. ایجاد یک اعلان درون برنامه ای لازم نیست، زیرا چارچوب چاپ به طور خودکار یک اعلان سیستم برای کار چاپ ایجاد می کند.