Android-এ সাধারণ ফটো ছাড়া অন্য কন্টেন্ট প্রিন্ট করতে হলে, প্রিন্ট ডকুমেন্টে টেক্সট ও গ্রাফিক্স কম্পোজ করতে হয়। Android ফ্রেমওয়ার্ক, HTML ব্যবহার করে ডকুমেন্ট কম্পোজ করার এবং ন্যূনতম কোড ব্যবহার করে তা প্রিন্ট করার সুবিধা প্রদান করে।
Android 4.4 (API লেভেল ১৯)-এ, HTML কন্টেন্ট প্রিন্ট করার সুবিধা চালু করতে
WebView ক্লাস আপডেট করা হয়েছে। এই ক্লাস আপনাকে লোকাল HTML রিসোর্স লোড করতে বা ওয়েব থেকে কোনও পৃষ্ঠা ডাউনলোড করতে, প্রিন্ট জব তৈরি করতে এবং Android-এর প্রিন্ট পরিষেবায় তা হ্যান্ড-অফ করতে দেয়।
এই পাঠে আপনি শিখবেন কীভাবে টেক্সট ও গ্রাফিক্স সহ HTML ডকুমেন্ট দ্রুত তৈরি করতে হয় এবং
WebView ব্যবহার করে তা প্রিন্ট করতে হয়।
HTML ডকুমেন্ট লোড করুন
WebView-এর মাধ্যমে HTML ডকুমেন্ট প্রিন্ট করার অর্থ হল HTML রিসোর্স লোড করা
বা স্ট্রিং হিসেবে HTML ডকুমেন্ট তৈরি করা। এই বিভাগে HTML স্ট্রিং তৈরি করা এবং প্রিন্ট করার জন্য
WebView-এ লোড করার পদ্ধতি বর্ণনা করা হয়েছে।
এই ভিউ অবজেক্ট সাধারণত অ্যাক্টিভিটি লেআউটের অংশ হিসেবে ব্যবহার করা হয়। তবে, আপনার অ্যাপ্লিকেশন
WebView ব্যবহার না করলে, আপনি প্রিন্ট করার উদ্দেশ্যে
বিশেষভাবে ক্লাসের ইনস্ট্যান্স তৈরি করতে পারবেন। এই কাস্টম প্রিন্ট ভিউ তৈরি করার প্রধান ধাপগুলি হল:
- এমন একটি
WebViewClientতৈরি করুন যা HTML রিসোর্স লোড হওয়ার পরে প্রিন্ট জব শুরু করে। 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 অবজেক্টের একটি ইনস্ট্যান্স সেভ করা হয়,
যা প্রয়োজনীয় নয়। প্রিন্ট জব প্রসেস হওয়ার সময় আপনার অ্যাপ্লিকেশন এই অবজেক্ট ব্যবহার করে
প্রিন্ট জবের প্রগ্রেস ট্র্যাক করতে পারে। এই পদ্ধতিটি তখন উপযোগী হয় যখন আপনি প্রিন্ট জব সম্পূর্ণ, ব্যর্থ বা ব্যবহারকারী বাতিল করেছেন কিনা তা
আপনার অ্যাপ্লিকেশনে মনিটর করতে চান। ইন-অ্যাপ বিজ্ঞপ্তি তৈরি করার
প্রয়োজন নেই, কারণ প্রিন্ট ফ্রেমওয়ার্ক অটোমেটিক প্রিন্ট জবের জন্য সিস্টেম
বিজ্ঞপ্তি তৈরি করে।