การพิมพ์เอกสาร 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 ที่สร้างขึ้นในทันที

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