درحال چاپ اسناد HTML

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

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

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

بار کردن سند HTML

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

این شیء نمای معمولاً به‌عنوان بخشی از چیدمان فعالیت استفاده می‌شود. بااین‌حال، اگر برنامه‌تان از 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/ پروژه‌تان قرار دهید و نشانی وب پایه‌ای را در پارامتر اول روش 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 شامل توانایی چاپ محدوده صفحه نمی‌شود، برای مثال: چاپ صفحه ۲ تا ۴ از سند HTML‏ ۱۰ صفحه‌ای پشتیبانی نمی‌شود.
  • یک نمونه از 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 را برای استفاده توسط برنامه ذخیره می‌کند که الزامی نیست. برنامه شما ممکن است از این شیء برای پیگیری پیشرفت کار چاپ درحین پردازش استفاده کند. این رویکرد زمانی مفید است که می‌خواهید وضعیت کار چاپ را در برنامه خود برای تکمیل، شکست، یا لغو کاربر نظارت کنید. ایجاد اعلان درون‌برنامه لازم نیست، زیرا چارچوب چاپ به‌طور خودکار اعلان سیستم برای کار چاپ ایجاد می‌کند.