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

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

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 का इस्तेमाल करते समय, आपको इन बातों का ध्यान रखना चाहिए निम्न सीमाएं:

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