HTML ডকুমেন্ট প্রিন্ট করা হচ্ছে

Android-এ সাধারণ ফটো ছাড়া অন্য কন্টেন্ট প্রিন্ট করতে হলে, প্রিন্ট ডকুমেন্টে টেক্সট ও গ্রাফিক্স কম্পোজ করতে হয়। Android ফ্রেমওয়ার্ক, HTML ব্যবহার করে ডকুমেন্ট কম্পোজ করার এবং ন্যূনতম কোড ব্যবহার করে তা প্রিন্ট করার সুবিধা প্রদান করে।

Android 4.4 (API লেভেল ১৯)-এ, HTML কন্টেন্ট প্রিন্ট করার সুবিধা চালু করতে WebView ক্লাস আপডেট করা হয়েছে। এই ক্লাস আপনাকে লোকাল HTML রিসোর্স লোড করতে বা ওয়েব থেকে কোনও পৃষ্ঠা ডাউনলোড করতে, প্রিন্ট জব তৈরি করতে এবং Android-এর প্রিন্ট পরিষেবায় তা হ্যান্ড-অফ করতে দেয়।

এই পাঠে আপনি শিখবেন কীভাবে টেক্সট ও গ্রাফিক্স সহ HTML ডকুমেন্ট দ্রুত তৈরি করতে হয় এবং WebView ব্যবহার করে তা প্রিন্ট করতে হয়।

HTML ডকুমেন্ট লোড করুন

WebView-এর মাধ্যমে HTML ডকুমেন্ট প্রিন্ট করার অর্থ হল HTML রিসোর্স লোড করা বা স্ট্রিং হিসেবে HTML ডকুমেন্ট তৈরি করা। এই বিভাগে HTML স্ট্রিং তৈরি করা এবং প্রিন্ট করার জন্য WebView-এ লোড করার পদ্ধতি বর্ণনা করা হয়েছে।

এই ভিউ অবজেক্ট সাধারণত অ্যাক্টিভিটি লেআউটের অংশ হিসেবে ব্যবহার করা হয়। তবে, আপনার অ্যাপ্লিকেশন WebView ব্যবহার না করলে, আপনি প্রিন্ট করার উদ্দেশ্যে বিশেষভাবে ক্লাসের ইনস্ট্যান্স তৈরি করতে পারবেন। এই কাস্টম প্রিন্ট ভিউ তৈরি করার প্রধান ধাপগুলি হল:

  1. এমন একটি WebViewClient তৈরি করুন যা HTML রিসোর্স লোড হওয়ার পরে প্রিন্ট জব শুরু করে।
  2. WebView অবজেক্টে HTML রিসোর্স লোড করুন।

নিম্নলিখিত কোড স্যাম্পেল থেকে বোঝা যায় যে কীভাবে একটি সহজ 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
}

জাভা

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() পদ্ধতির প্রথম প্যারামিটারে বেস URL উল্লেখ করুন, যেমনটি নিম্নলিখিত কোডের উদাহরণে দেখানো হয়েছে:

Kotlin

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() ব্যবহার করে আপনি প্রিন্ট করার জন্য ওয়েব পেজ লোড করতে পারবেন।

Kotlin

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-এর একটি ইনস্ট্যান্স একবারে শুধুমাত্র একটি প্রিন্ট জব প্রসেস করতে পারে।
  • CSS প্রিন্ট অ্যাট্রিবিউট, যেমন ল্যান্ডস্কেপ প্রপার্টি সহ HTML ডকুমেন্ট কাজ করে না।
  • প্রিন্টিং ট্রিগার করার জন্য আপনি 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
        }
    }
}

জাভা

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 অবজেক্টের একটি ইনস্ট্যান্স সেভ করা হয়, যা প্রয়োজনীয় নয়। প্রিন্ট জব প্রসেস হওয়ার সময় আপনার অ্যাপ্লিকেশন এই অবজেক্ট ব্যবহার করে প্রিন্ট জবের প্রগ্রেস ট্র্যাক করতে পারে। এই পদ্ধতিটি তখন উপযোগী হয় যখন আপনি প্রিন্ট জব সম্পূর্ণ, ব্যর্থ বা ব্যবহারকারী বাতিল করেছেন কিনা তা আপনার অ্যাপ্লিকেশনে মনিটর করতে চান। ইন-অ্যাপ বিজ্ঞপ্তি তৈরি করার প্রয়োজন নেই, কারণ প্রিন্ট ফ্রেমওয়ার্ক অটোমেটিক প্রিন্ট জবের জন্য সিস্টেম বিজ্ঞপ্তি তৈরি করে।