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