การพิมพ์เอกสาร HTML

การพิมพ์เนื้อหานอกเหนือจากรูปภาพธรรมดาบน Android จำเป็นต้องใช้การเขียนข้อความและกราฟิกใน พิมพ์เอกสาร เฟรมเวิร์ก Android มอบวิธีใช้ HTML เพื่อเขียนเอกสารและ ให้พิมพ์ด้วยรหัสขั้นต่ำ

ใน Android 4.4 (API ระดับ 19) คลาส WebView ได้รับการอัปเดตเป็น เปิดใช้งานการพิมพ์เนื้อหา HTML ชั้นเรียนอนุญาตให้คุณโหลดทรัพยากร HTML ในเครื่องหรือดาวน์โหลด 1 หน้าจากเว็บ สร้างงานพิมพ์และส่งต่อให้กับบริการพิมพ์ของ Android

บทเรียนนี้จะแสดงวิธีการสร้างเอกสาร HTML ที่มีข้อความและกราฟิกอย่างรวดเร็ว ใช้ WebView เพื่อพิมพ์

โหลดเอกสาร HTML

การพิมพ์เอกสาร HTML ด้วย WebView เกี่ยวข้องกับการโหลด HTML หรือการสร้างเอกสาร HTML เป็นสตริง ส่วนนี้จะอธิบายวิธีสร้างสตริง HTML และโหลดลงใน WebView สำหรับการพิมพ์

ตามปกติแล้วออบเจ็กต์มุมมองนี้จะใช้เป็นส่วนหนึ่งของเลย์เอาต์กิจกรรม อย่างไรก็ตาม หากแอปพลิเคชันของคุณ ไม่ได้ใช้ WebView คุณสามารถสร้างอินสแตนซ์ของชั้นเรียน เพื่อการพิมพ์โดยเฉพาะ ขั้นตอนหลักในการสร้างมุมมองการพิมพ์ที่กำหนดเองนี้มีดังนี้

  1. สร้าง WebViewClient ที่เริ่มต้นงานพิมพ์หลังจาก ทรัพยากร HTML จะโหลดขึ้น
  2. โหลดทรัพยากร HTML ลงในออบเจ็กต์ WebView

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการสร้าง WebViewClient แบบง่ายและโหลดเอกสาร HTML ที่สร้างขึ้นในทันที

KotlinJava
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() ดังที่แสดงใน ตัวอย่างโค้ดต่อไปนี้

KotlinJava
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() ดังที่แสดงด้านล่าง

KotlinJava
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 สร้างอะแดปเตอร์สำหรับพิมพ์ และสุดท้ายก็สร้างรูปอัด งาน ตัวอย่างต่อไปนี้จะแสดงวิธีดำเนินการตามขั้นตอนเหล่านี้

KotlinJava
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 ไว้เพื่อให้แอปพลิเคชันใช้งาน ซึ่งไม่จําเป็น แอปพลิเคชันของคุณอาจใช้ออบเจ็กต์นี้เพื่อติดตามความคืบหน้าของ งานพิมพ์ที่กำลังดำเนินการ วิธีนี้มีประโยชน์เมื่อคุณต้องการตรวจสอบสถานะ ของงานพิมพ์ในใบสมัครเพื่อดำเนินการตามคำขอให้เสร็จสมบูรณ์ ความล้มเหลว หรือยกเลิกของผู้ใช้ การสร้าง ไม่จำเป็นต้องมีการแจ้งเตือนในแอป เนื่องจากเฟรมเวิร์กการพิมพ์จะสร้างระบบโดยอัตโนมัติ การแจ้งเตือนสำหรับงานพิมพ์