W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
編寫: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打印該文檔。
用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的主要步驟是:
下面的代碼展示了如何創(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í),你要注意下面的一些限制:
如果希望創(chuàng)建一個(gè)更加自定義化的打印輸出并希望可以完全控制打印頁面上繪制的內(nèi)容,可以學(xué)習(xí)下一節(jié)課程:打印自定義文檔
在創(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)通知。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: