การพิมพ์เนื้อหานอกเหนือจากรูปภาพธรรมดาบน Android จำเป็นต้องใช้การเขียนข้อความและกราฟิกใน พิมพ์เอกสาร เฟรมเวิร์ก Android มอบวิธีใช้ HTML เพื่อเขียนเอกสารและ ให้พิมพ์ด้วยรหัสขั้นต่ำ
ใน Android 4.4 (API ระดับ 19) คลาส WebView
ได้รับการอัปเดตเป็น
เปิดใช้งานการพิมพ์เนื้อหา HTML ชั้นเรียนอนุญาตให้คุณโหลดทรัพยากร HTML ในเครื่องหรือดาวน์โหลด
1 หน้าจากเว็บ สร้างงานพิมพ์และส่งต่อให้กับบริการพิมพ์ของ Android
บทเรียนนี้จะแสดงวิธีการสร้างเอกสาร HTML ที่มีข้อความและกราฟิกอย่างรวดเร็ว
ใช้ WebView
เพื่อพิมพ์
โหลดเอกสาร HTML
การพิมพ์เอกสาร HTML ด้วย WebView
เกี่ยวข้องกับการโหลด HTML
หรือการสร้างเอกสาร HTML เป็นสตริง ส่วนนี้จะอธิบายวิธีสร้างสตริง HTML และโหลดลงใน WebView
สำหรับการพิมพ์
ตามปกติแล้วออบเจ็กต์มุมมองนี้จะใช้เป็นส่วนหนึ่งของเลย์เอาต์กิจกรรม อย่างไรก็ตาม หากแอปพลิเคชันของคุณ
ไม่ได้ใช้ WebView
คุณสามารถสร้างอินสแตนซ์ของชั้นเรียน
เพื่อการพิมพ์โดยเฉพาะ ขั้นตอนหลักในการสร้างมุมมองการพิมพ์ที่กำหนดเองนี้มีดังนี้
- สร้าง
WebViewClient
ที่เริ่มต้นงานพิมพ์หลังจาก ทรัพยากร HTML จะโหลดขึ้น - โหลดทรัพยากร HTML ลงในออบเจ็กต์
WebView
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการสร้าง 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 }
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; }
หมายเหตุ: โปรดตรวจสอบว่าการเรียกการสร้างงานพิมพ์เกิดขึ้นในเมธอด onPageFinished()
ของ WebViewClient
ที่คุณสร้างไว้ในส่วนก่อนหน้านี้ หากคุณไม่รอจนกว่าจะถึงหน้า
การโหลดเสร็จสิ้นแล้ว เอาต์พุตการพิมพ์อาจไม่สมบูรณ์หรือว่างเปล่า หรืออาจล้มเหลวโดยสิ้นเชิง
หมายเหตุ: โค้ดตัวอย่างด้านบนมีอินสแตนซ์ของ
ออบเจ็กต์ WebView
รายการที่ไม่ใช่ขยะที่เก็บรวบรวมก่อนงานพิมพ์
แล้ว ตรวจสอบว่าคุณได้ดำเนินการแบบเดียวกันนี้ในการติดตั้งของคุณเอง มิเช่นนั้นกระบวนการพิมพ์
อาจล้มเหลวได้
หากคุณต้องการเพิ่มกราฟิกในหน้าเว็บ ให้วางไฟล์กราฟิกใน assets/
ของโครงการ และระบุ URL ฐานในพารามิเตอร์แรกของแท็ก
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 ไม่รวมความสามารถในการพิมพ์หน้า เช่น ระบบไม่รองรับการพิมพ์หน้า 2 ถึง 4 จากเอกสาร HTML 10 หน้า
- อินสแตนซ์
WebView
จะประมวลผลงานพิมพ์ได้ครั้งละ 1 งานเท่านั้น - เอกสาร HTML ที่มีแอตทริบิวต์การพิมพ์ CSS เช่น คุณสมบัติแนวนอน นั้นไม่ใช่ ที่รองรับ
- คุณไม่สามารถใช้ JavaScript ในเอกสาร 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 } } }
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
ไว้เพื่อให้แอปพลิเคชันใช้งาน ซึ่งไม่จําเป็น แอปพลิเคชันของคุณอาจใช้ออบเจ็กต์นี้เพื่อติดตามความคืบหน้าของ
งานพิมพ์ที่กำลังดำเนินการ วิธีนี้มีประโยชน์เมื่อคุณต้องการตรวจสอบสถานะ
ของงานพิมพ์ในใบสมัครเพื่อดำเนินการตามคำขอให้เสร็จสมบูรณ์ ความล้มเหลว หรือยกเลิกของผู้ใช้ การสร้าง
ไม่จำเป็นต้องมีการแจ้งเตือนในแอป เนื่องจากเฟรมเวิร์กการพิมพ์จะสร้างระบบโดยอัตโนมัติ
การแจ้งเตือนสำหรับงานพิมพ์