列印 HTML 文件

想在 Android 裝置上列印文字以外的內容時,需要在 列印文件。Android 架構提供一種使用 HTML 編寫文件的方式, 您幾乎不需要編寫程式碼

在 Android 4.4 (API 級別 19) 中,WebView 類別已更新為 啟用列印 HTML 內容功能。此類別可讓您載入本機 HTML 資源或下載 網頁,建立列印工作,並傳送給 Android 的列印服務。

本課程將示範如何快速建立內含文字和圖片的 HTML 文件 使用 WebView 列印。

載入 HTML 文件

使用 WebView 列印 HTML 文件時,需要載入 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;
}

注意:請確認您用於產生列印工作的呼叫,是在您在上一節中建立的 WebViewClientonPageFinished() 方法中發生。如果您等到網頁 列印輸出完成,輸出輸出內容可能不完整、空白,或是可能完全失敗。

注意:上述範例程式碼會保留 WebView 物件的例項,因此不會在建立列印工作之前進行垃圾收集。請務必在實作時執行相同動作,否則列印程序 可能會失敗

如要在網頁中包含圖像,請將圖形檔案放在 assets/ 中。 ,然後在 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 文件的列印選項「並未」包含列印網頁的功能。 範圍,例如只列印 10 頁 HTML 文件中的第 2 到 4 頁。
  • WebView 的一個例項一次只能處理一個列印工作。
  • 系統不支援含有 CSS 列印屬性的 HTML 文件,例如橫向屬性。
  • 您無法在 HTML 文件中使用 JavaScript 觸發列印作業。

注意:版面配置中包含的 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 物件的執行個體,供 而不需要使用這個設定檔您的應用程式可能會使用這個物件來追蹤 表示正在處理的列印工作如要監控狀態,這個方法很實用 以瞭解列印工作的完成狀態,以便完成、失敗或使用者取消作業。建立 列印架構會自動建立系統,因此不需要應用程式內通知 接收列印工作通知。