एचटीएमएल दस्तावेज़ प्रिंट करना

Android पर सामान्य फ़ोटो के अलावा कॉन्टेंट को प्रिंट करने के लिए, टेक्स्ट और ग्राफ़िक बनाना ज़रूरी है प्रिंट दस्तावेज़. Android फ़्रेमवर्क, एचटीएमएल का इस्तेमाल करके दस्तावेज़ बनाने और कम से कम कोड के साथ उसे प्रिंट करने का तरीका उपलब्ध कराता है.

Android 4.4 (एपीआई लेवल 19) में, WebView क्लास को इस पर अपडेट कर दिया गया है एचटीएमएल कॉन्टेंट प्रिंट करने की सुविधा चालू करनी होगी. क्लास से आपको लोकल एचटीएमएल संसाधन लोड करने या डाउनलोड करने में मदद मिलती है वेब पर किसी पेज पर जाने, प्रिंट जॉब बनाने, और उसे Android की प्रिंट सेवाओं को देने के लिए किया जा सकता है.

इस लेसन में आपको बताया गया है कि टेक्स्ट और ग्राफ़िक वाला एचटीएमएल दस्तावेज़ कैसे बनाएं और इसे प्रिंट करने के लिए WebView का इस्तेमाल करें.

कोई एचटीएमएल दस्तावेज़ लोड करें

WebView की मदद से एचटीएमएल दस्तावेज़ को प्रिंट करने के लिए, एचटीएमएल संसाधन लोड करना या एचटीएमएल दस्तावेज़ को स्ट्रिंग के तौर पर बनाना ज़रूरी है. इस सेक्शन में एचटीएमएल बनाने का तरीका बताया गया है स्ट्रिंग में बदलाव करें और प्रिंट करने के लिए उसे WebView में लोड करें.

इस व्यू ऑब्जेक्ट का इस्तेमाल आम तौर पर, ऐक्टिविटी लेआउट के हिस्से के तौर पर किया जाता है. हालांकि, अगर आपका ऐप्लिकेशन WebView का इस्तेमाल नहीं कर रहा है, तो आपके पास क्लास का इंस्टेंस बनाने का विकल्प है खास तौर पर प्रिंट करने के लिए. कस्टम प्रिंट व्यू बनाने के लिए, यह तरीका अपनाएं:

  1. ऐसा WebViewClient बनाएं जो इसके बाद प्रिंट जॉब शुरू करे एचटीएमएल रिसॉर्स लोड हो जाता है.
  2. एचटीएमएल रिसॉर्स को WebView ऑब्जेक्ट में लोड करें.

नीचे दिया गया कोड सैंपल, आसान WebViewClient बनाने और तुरंत बनाए गए एचटीएमएल दस्तावेज़ को लोड करने का तरीका बताता है:

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

ध्यान दें: पक्का करें कि प्रिंट जॉब जनरेट करने के लिए, आपका कॉल पिछले सेक्शन में बनाए गए WebViewClient के onPageFinished() तरीके से हो. अगर आपने पेज शुरू होने तक इंतज़ार नहीं किया लोड हो गया है, प्रिंट आउटपुट अधूरा या खाली हो सकता है या पूरी तरह से विफल हो सकता है.

ध्यान दें: ऊपर दिए गए उदाहरण में, WebView ऑब्जेक्ट ताकि यह प्रिंट जॉब से पहले इकट्ठा किया जाने वाला गै़रबिज़ न हो बनाया जाता है. पक्का करें कि आपने भी ऐसा ही किया हो, नहीं तो प्रिंट की प्रोसेस पूरी नहीं हो पाएगी.

अगर आपको पेज में ग्राफ़िक शामिल करने हैं, तो ग्राफ़िक फ़ाइलों को अपने प्रोजेक्ट की assets/ डायरेक्ट्री में डालें. साथ ही, 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 का इस्तेमाल करते समय, आपको इन बातों का ध्यान रखना चाहिए निम्न सीमाएं:

  • दस्तावेज़ में हेडर या फ़ुटर नहीं जोड़े जा सकते. इनमें पेज नंबर भी शामिल हैं.
  • एचटीएमएल दस्तावेज़ को प्रिंट करने के विकल्पों में, पेज की रेंज को प्रिंट करने की सुविधा शामिल नहीं है. उदाहरण के लिए: 10 पेज के एचटीएमएल दस्तावेज़ के पेज 2 से 4 को प्रिंट नहीं किया जा सकता.
  • WebView का एक इंस्टेंस, एक बार में सिर्फ़ एक प्रिंट जॉब को प्रोसेस कर सकता है.
  • लैंडस्केप प्रॉपर्टी जैसे सीएसएस प्रिंट एट्रिब्यूट वाले एचटीएमएल दस्तावेज़ को समर्थित हैं.
  • प्रिंट करना शुरू करने के लिए, एचटीएमएल दस्तावेज़ में JavaScript का इस्तेमाल नहीं किया जा सकता.

ध्यान दें: WebView ऑब्जेक्ट का वह कॉन्टेंट, जो इसमें शामिल है लेआउट को दस्तावेज़ लोड करने के बाद प्रिंट भी किया जा सकता है.

अगर आपको अपनी पसंद के मुताबिक प्रिंट आउट बनाना है और प्रिंट किए गए पेज पर मौजूद कॉन्टेंट पर पूरा कंट्रोल पाना है, तो अगले लेसन पर जाएं: पसंद के मुताबिक दस्तावेज़ प्रिंट करना लेसन.

WebView बनाने और अपना एचटीएमएल कॉन्टेंट लोड करने के बाद, ऐप्लिकेशन को करीब-करीब प्रिंट करने की प्रक्रिया के अपने हिस्से के साथ पूरा कर लिया जाता है. अगले चरण में इन्हें ऐक्सेस किया जा सकता है 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 ऑब्जेक्ट के एक इंस्टेंस को सेव करता है, ताकि उसका इस्तेमाल किया जा सके आवेदन की ज़रूरत नहीं है. आपका ऐप्लिकेशन, प्रिंट की प्रोसेस के दौरान, प्रिंट जॉब की प्रोग्रेस को ट्रैक करने के लिए, इस ऑब्जेक्ट का इस्तेमाल कर सकता है. यह तरीका तब काम आता है, जब आपको स्टेटस को मॉनिटर करना हो पूरा होने, विफल होने या उपयोगकर्ता के रद्द करने के अनुरोध के लिए आपके आवेदन में मौजूद प्रिंट जॉब. किसी इन-ऐप्लिकेशन सूचना की ज़रूरत नहीं है, क्योंकि प्रिंट फ़्रेमवर्क अपने-आप एक सिस्टम बना देता है प्रिंट जॉब के लिए सूचना पाएं.