注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術一般,由于喜愛安卓而產生了翻譯的念頭,純屬個人興趣愛好。
原文鏈接: http://developer.android.com/training/printing/html-docs.html
在Android上要打印比一副照片更豐富的內容,需要將文本和圖片組合在一個打印的文檔中。Android框架提供了一種使用HTML語言來組織一個文檔并打印的方法,它使用的代碼數量是很小的。
在Android 4.4(API Level 19),
WebView
類更新了,使得它可以打印HTML內容。這個類允許你加載一個本地的HTML資源或者從一個網頁下載一個頁面,創建一個打印任務,并把它交給Android打印服務。
這節課將向您展示如何快速地構建一個HTML文檔,它包含文本和圖片,并使用 WebView 來打印它。
一). 加載一個HTML文檔
用 WebView 打印一個HTML文檔包含加載一個HTML資源或者以String的形式構建一個HTML文檔。這一節將描述如果構建一個HTML的字符串并將它加載到 WebView 中,以備打印。
這個View對象一般被用來作為一個activity布局的一部分。然而,如果你的應用不使用一個 WebView ,你可以創建一個該類的實例,目的是為了打印。創建該自定義打印界面的主要步驟是:
- 在HTML資源加載完畢后,創建一個 WebViewClient 用來啟動一個打印任務。
- 加載HTML資源至 WebView 對象。
下面的代碼展示了如何創建一個簡單的 WebViewClient 并且加載一個動態創建的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() 方法內。如果你不等待頁面加載完畢后再打印,打印的輸出可能會不完整或空白,甚至可能會失敗。
Note:
上面的樣例代碼維護了一個 WebView 對象實例,這樣就保證了它不會在打印任務創建之前就被垃圾回收器所回收。請確保你在你的實現中也同樣這么做,否則打印的進程可能會無法繼續執行。
如果你希望頁面中包含圖像,將這個圖像文件放置在你的工程的“ assets/ ”目錄,并指定一個基URL,作為 loadDataWithBaseURL() 方法的第一個參數,就像下面所顯示的一樣:
webView.loadDataWithBaseURL("file:///android_asset/images/" , htmlBody, "text/HTML", "UTF-8", null );
你也可以加載一個網頁來打印,方法是將 loadDataWithBaseURL() 方法替換為 loadUrl() ,如下所示:
// Print an existing web page (remember to request INTERNET permission!): webView.loadUrl("http://developer.android.com/about/index.html");
當使用 WebView 來創建一個打印文檔時,你要注意下面的一些限制:
- 你不能為文檔添加頁眉和頁腳,包括頁號。
- HTML文檔的打印選項不包含選擇打印的頁數范圍,例如:對于一個10頁的HTMl文檔,只打印2到4頁是不可以的。
- 一個 WebView 的實例只能在同一時間處理一個打印任務。
- 若一個HTML文檔包含CSS打印屬性,比如一個橫向屬性,是不支持的。
- 你不能使用一個HTML文檔中的JavaScript來激活打印。
Note:
如果你希望創建一個更加自定義化的打印輸出并希望可以完全控制打印頁面上繪制的內容,可以學習下一節課程: Printing a Custom Document 。 ?
二). 創建一個打印任務
在創建了 WebView 并加載了你的HTML內容之后,你的應用就基本完成了打印進程的歸屬于它的部分的任務。下一步是訪問 PrintManager ,創建一個打印適配器,并在最后,創建一個打印任務。下面的代碼展示了如何執行這些步驟:
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); }
這個例子保存了應用使用的 PrintJob 對象的實例,這是不必須的。你的應用可以使用這個對象來跟蹤打印任務執行時的進度。當你希望監控你應用中的打印任務是否完成,是否失敗或者是否被用戶取消, 這個方法非常有用。創建一個應用內置的通知并不必須,因為打印框架會自動的創建一個該打印任務的系統通知。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
