এইচটিএমএল ডকুমেন্ট প্রিন্ট করা

অ্যান্ড্রয়েডে একটি সাধারণ ছবির বাইরে সামগ্রী মুদ্রণ করার জন্য একটি মুদ্রণ নথিতে পাঠ্য এবং গ্রাফিক্স রচনা করা প্রয়োজন৷ অ্যান্ড্রয়েড ফ্রেমওয়ার্ক একটি নথি রচনা করতে এবং ন্যূনতম কোড সহ এটি মুদ্রণ করতে HTML ব্যবহার করার একটি উপায় সরবরাহ করে।

অ্যান্ড্রয়েড 4.4 (এপিআই স্তর 19) এ, এইচটিএমএল সামগ্রী মুদ্রণ সক্ষম করতে WebView ক্লাস আপডেট করা হয়েছে। ক্লাসটি আপনাকে একটি স্থানীয় এইচটিএমএল রিসোর্স লোড করতে বা ওয়েব থেকে একটি পৃষ্ঠা ডাউনলোড করতে, একটি প্রিন্ট কাজ তৈরি করতে এবং এটিকে Android এর মুদ্রণ পরিষেবাগুলিতে হস্তান্তর করতে দেয়৷

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

একটি HTML নথি লোড করুন

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

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

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

নিম্নলিখিত কোড নমুনা দেখায় কিভাবে একটি সাধারণ 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;
}

দ্রষ্টব্য: নিশ্চিত করুন যে আপনার পূর্ববর্তী বিভাগে তৈরি করা WebViewClient এর onPageFinished() পদ্ধতিতে একটি প্রিন্ট জব তৈরি করার জন্য আপনার কল হয়েছে। আপনি যদি পৃষ্ঠা লোডিং শেষ না হওয়া পর্যন্ত অপেক্ষা না করেন, তাহলে প্রিন্ট আউটপুট অসম্পূর্ণ বা ফাঁকা হতে পারে বা সম্পূর্ণরূপে ব্যর্থ হতে পারে।

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

আপনি যদি পৃষ্ঠায় গ্রাফিক্স অন্তর্ভুক্ত করতে চান, তাহলে আপনার প্রকল্পের assets/ ডিরেক্টরিতে গ্রাফিক ফাইলগুলি রাখুন এবং loadDataWithBaseURL() পদ্ধতির প্রথম প্যারামিটারে একটি বেস URL নির্দিষ্ট করুন, যেমনটি নিম্নলিখিত কোড উদাহরণে দেখানো হয়েছে:

কোটলিন

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 নথির জন্য মুদ্রণের বিকল্পগুলিতে পৃষ্ঠার রেঞ্জগুলি মুদ্রণের ক্ষমতা অন্তর্ভুক্ত নয়, উদাহরণস্বরূপ: 10 পৃষ্ঠার HTML নথির 2 থেকে 4 নম্বর মুদ্রণ সমর্থিত নয়৷
  • WebView এর একটি উদাহরণ একবারে শুধুমাত্র একটি মুদ্রণ কাজ প্রক্রিয়া করতে পারে।
  • ল্যান্ডস্কেপ বৈশিষ্ট্যের মতো CSS মুদ্রণ বৈশিষ্ট্য সমন্বিত একটি HTML নথি সমর্থিত নয়।
  • প্রিন্টিং ট্রিগার করতে আপনি HTML নথিতে JavaScript ব্যবহার করতে পারবেন না।

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