注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術(shù)一般,由于喜愛安卓而產(chǎn)生了翻譯的念頭,純屬個(gè)人興趣愛好。
原文鏈接: http://developer.android.com/training/printing/html-docs.html
在Android上要打印比一副照片更豐富的內(nèi)容,需要將文本和圖片組合在一個(gè)打印的文檔中。Android框架提供了一種使用HTML語(yǔ)言來(lái)組織一個(gè)文檔并打印的方法,它使用的代碼數(shù)量是很小的。
在Android 4.4(API Level 19),
WebView
類更新了,使得它可以打印HTML內(nèi)容。這個(gè)類允許你加載一個(gè)本地的HTML資源或者從一個(gè)網(wǎng)頁(yè)下載一個(gè)頁(yè)面,創(chuàng)建一個(gè)打印任務(wù),并把它交給Android打印服務(wù)。
這節(jié)課將向您展示如何快速地構(gòu)建一個(gè)HTML文檔,它包含文本和圖片,并使用 WebView 來(lái)打印它。
一). 加載一個(gè)HTML文檔
用 WebView 打印一個(gè)HTML文檔包含加載一個(gè)HTML資源或者以String的形式構(gòu)建一個(gè)HTML文檔。這一節(jié)將描述如果構(gòu)建一個(gè)HTML的字符串并將它加載到 WebView 中,以備打印。
這個(gè)View對(duì)象一般被用來(lái)作為一個(gè)activity布局的一部分。然而,如果你的應(yīng)用不使用一個(gè) WebView ,你可以創(chuàng)建一個(gè)該類的實(shí)例,目的是為了打印。創(chuàng)建該自定義打印界面的主要步驟是:
- 在HTML資源加載完畢后,創(chuàng)建一個(gè) WebViewClient 用來(lái)啟動(dòng)一個(gè)打印任務(wù)。
- 加載HTML資源至 WebView 對(duì)象。
下面的代碼展示了如何創(chuàng)建一個(gè)簡(jiǎn)單的 WebViewClient 并且加載一個(gè)動(dòng)態(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:
確保你所調(diào)用的生成打印的任務(wù)發(fā)生在在之前那一節(jié)所創(chuàng)建的 WebViewClient 中的 onPageFinished() 方法內(nèi)。如果你不等待頁(yè)面加載完畢后再打印,打印的輸出可能會(huì)不完整或空白,甚至可能會(huì)失敗。
Note:
上面的樣例代碼維護(hù)了一個(gè) WebView 對(duì)象實(shí)例,這樣就保證了它不會(huì)在打印任務(wù)創(chuàng)建之前就被垃圾回收器所回收。請(qǐng)確保你在你的實(shí)現(xiàn)中也同樣這么做,否則打印的進(jìn)程可能會(huì)無(wú)法繼續(xù)執(zhí)行。
如果你希望頁(yè)面中包含圖像,將這個(gè)圖像文件放置在你的工程的“ assets/ ”目錄,并指定一個(gè)基URL,作為 loadDataWithBaseURL() 方法的第一個(gè)參數(shù),就像下面所顯示的一樣:
webView.loadDataWithBaseURL("file:///android_asset/images/"
, htmlBody,
"text/HTML", "UTF-8",
null
);
你也可以加載一個(gè)網(wǎng)頁(yè)來(lái)打印,方法是將 loadDataWithBaseURL() 方法替換為 loadUrl() ,如下所示:
//
Print an existing web page (remember to request INTERNET permission!):
webView.loadUrl("http://developer.android.com/about/index.html");
當(dāng)使用 WebView 來(lái)創(chuàng)建一個(gè)打印文檔時(shí),你要注意下面的一些限制:
- 你不能為文檔添加頁(yè)眉和頁(yè)腳,包括頁(yè)號(hào)。
- HTML文檔的打印選項(xiàng)不包含選擇打印的頁(yè)數(shù)范圍,例如:對(duì)于一個(gè)10頁(yè)的HTMl文檔,只打印2到4頁(yè)是不可以的。
- 一個(gè) WebView 的實(shí)例只能在同一時(shí)間處理一個(gè)打印任務(wù)。
- 若一個(gè)HTML文檔包含CSS打印屬性,比如一個(gè)橫向?qū)傩裕遣恢С值摹?
- 你不能使用一個(gè)HTML文檔中的JavaScript來(lái)激活打印。
Note:
一旦 在布局中包含的 WebView 對(duì)象加載好了文檔,就可以打印 WebView 對(duì)象的內(nèi)容。
如果你希望創(chuàng)建一個(gè)更加自定義化的打印輸出并希望可以完全控制打印頁(yè)面上繪制的內(nèi)容,可以學(xué)習(xí)下一節(jié)課程: Printing a Custom Document 。 ?
二). 創(chuàng)建一個(gè)打印任務(wù)
在創(chuàng)建了 WebView 并加載了你的HTML內(nèi)容之后,你的應(yīng)用就基本完成了打印進(jìn)程的歸屬于它的部分的任務(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è)例子保存了應(yīng)用使用的 PrintJob 對(duì)象的實(shí)例,這是不必須的。你的應(yīng)用可以使用這個(gè)對(duì)象來(lái)跟蹤打印任務(wù)執(zhí)行時(shí)的進(jìn)度。當(dāng)你希望監(jiān)控你應(yīng)用中的打印任務(wù)是否完成,是否失敗或者是否被用戶取消, 這個(gè)方法非常有用。創(chuàng)建一個(gè)應(yīng)用內(nèi)置的通知并不必須,因?yàn)榇蛴】蚣軙?huì)自動(dòng)的創(chuàng)建一個(gè)該打印任務(wù)的系統(tǒng)通知。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

