Android打印HTML文檔

2018-08-02 17:34 更新

編寫:jdneo - 原文:http://developer.android.com/training/printing/html-docs.html

如果要在Android上打印比一副照片更豐富的內(nèi)容,我們需要將文本和圖片組合在一個(gè)待打印的文檔中。Android框架提供了一種使用HTML語言來構(gòu)建文檔并進(jìn)行打印的方法,它使用的代碼數(shù)量是很小的。

WebView類在Android 4.4(API Level 19)中得到了更新,使得它可以打印HTML內(nèi)容。該類允許我們加載一個(gè)本地HTML資源或者從網(wǎng)頁下載一個(gè)頁面,創(chuàng)建一個(gè)打印任務(wù),并把它交給Android打印服務(wù)。

這節(jié)課將展示如何快速地構(gòu)建一個(gè)包含有文本和圖片的HTML文檔,以及如何使用WebView打印該文檔。

加載一個(gè)HTML文檔

WebView打印一個(gè)HTML文檔,會涉及到加載一個(gè)HTML資源,或者用一個(gè)字符串構(gòu)建HTML文檔。這一節(jié)將描述如何構(gòu)建一個(gè)HTML的字符串并將它加載到WebView中,以備打印。

該View對象一般被用來作為一個(gè)Activity布局的一部分。然而,如果應(yīng)用當(dāng)前并沒有使用WebView,我們可以創(chuàng)建一個(gè)該類的實(shí)例,以進(jìn)行打印。創(chuàng)建該自定義View的主要步驟是:

  1. 在HTML資源加載完畢后,創(chuàng)建一個(gè)WebViewClient用來啟動一個(gè)打印任務(wù)。
  2. 加載HTML資源至WebView對象中。

下面的代碼展示了如何創(chuàng)建一個(gè)簡單的WebViewClient并且加載一個(gè)動態(tài)創(chuàng)建的HTML文檔:

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;
}

Note: 請確保在WebViewClient)中的onPageFinished()方法內(nèi)調(diào)用創(chuàng)建打印任務(wù)的方法。如果沒有等到頁面加載完畢就進(jìn)行打印,打印的輸出可能會不完整或空白,甚至可能會失敗。

Note:在上面的樣例代碼中,保留了一個(gè)WebView對象實(shí)例的引用,這樣能夠確保它不會在打印任務(wù)創(chuàng)建之前就被垃圾回收器所回收。在編寫代碼時(shí)請務(wù)必這樣做,否則打印的進(jìn)程可能會無法繼續(xù)執(zhí)行。

如果我們希望頁面中包含圖像,將這個(gè)圖像文件放置在你的工程的“assets/”目錄中,并指定一個(gè)基URL(Base URL),并將它作為loadDataWithBaseURL()方法的第一個(gè)參數(shù),就像下面所顯示的一樣:

webView.loadDataWithBaseURL("file:///android_asset/images/", htmlBody,
        "text/HTML", "UTF-8", null);

我們也可以加載一個(gè)需要打印的網(wǎng)頁,具體做法是將loadDataWithBaseURL()方法替換為loadUrl(),如下所示:

// Print an existing web page (remember to request INTERNET permission!):
webView.loadUrl("http://developer.android.com/about/index.html");

當(dāng)使用WebView創(chuàng)建打印文檔時(shí),你要注意下面的一些限制:

  • 不能為文檔添加頁眉和頁腳,包括頁號。
  • HTML文檔的打印選項(xiàng)不包含選擇打印的頁數(shù)范圍,例如:對于一個(gè)10頁的HTMl文檔,只打印2到4頁是不可以的。
  • 一個(gè)WebView的實(shí)例只能在同一時(shí)間處理一個(gè)打印任務(wù)。
  • 若一個(gè)HTML文檔包含CSS打印屬性,比如一個(gè)landscape屬性,這是不被支持的。
  • 不能通過一個(gè)HTML文檔中的JavaScript腳本來激活打印。

Note:一旦在布局中包含的WebView對象將文檔加載完畢后,就可以打印WebView對象的內(nèi)容了。

如果希望創(chuàng)建一個(gè)更加自定義化的打印輸出并希望可以完全控制打印頁面上繪制的內(nèi)容,可以學(xué)習(xí)下一節(jié)課程:打印自定義文檔

創(chuàng)建一個(gè)打印任務(wù)

在創(chuàng)建了WebView并加載了我們的HTML內(nèi)容之后,應(yīng)用就已經(jīng)幾乎完成了屬于它的任務(wù)。接下來,我們需要訪問PrintManager,創(chuàng)建一個(gè)打印適配器,并在最后創(chuàng)建一個(gè)打印任務(wù)。下面的代碼展示了如何執(zhí)行這些步驟:

private void createWebPrintJob(WebView webView) {

    // Get a PrintManager instance
    PrintManager printManager = (PrintManager) getActivity()
            .getSystemService(Context.PRINT_SERVICE);

    // Get a print adapter instance
    PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter();

    // Create a print job with name and adapter instance
    String jobName = getString(R.string.app_name) + " Document";
    PrintJob printJob = printManager.print(jobName, printAdapter,
            new PrintAttributes.Builder().build());

    // Save the job object for later status checking
    mPrintJobs.add(printJob);
}

這個(gè)例子保存了一個(gè)PrintJob對象的實(shí)例,以供我們的應(yīng)用將來使用,當(dāng)然這是不必須的。我們的應(yīng)用可以使用這個(gè)對象來跟蹤打印任務(wù)執(zhí)行時(shí)的進(jìn)度。如果希望監(jiān)控應(yīng)用中的打印任務(wù)是否完成,是否失敗或者是否被用戶取消,這個(gè)方法非常有用。另外,我們不需要?jiǎng)?chuàng)建一個(gè)應(yīng)用內(nèi)置的通知,因?yàn)榇蛴】蚣軙詣拥膭?chuàng)建一個(gè)該打印任務(wù)的系統(tǒng)通知。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號