【Android Developers Training】 53. 打印HTML文档
注:本文翻译自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对象的实例,这是不必须的。你的应用可以使用这个对象来跟踪打印任务执行时的进度。当你希望监控你应用中的打印任务是否完成,是否失败或者是否被用户取消,这个方法非常有用。创建一个应用内置的通知并不必须,因为打印框架会自动的创建一个该打印任务的系统通知。
【Android Developers Training】 53. 打印HTML文档的更多相关文章
- 【Android Developers Training】 51. 序言:打印内容
		注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ... 
- 【Android Developers Training】 54. 打印自定义文档
		注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ... 
- 【Android Developers Training】 52. 打印照片
		注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ... 
- 【Android Developers Training】 2. 运行你的应用
		注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ... 
- 【Android Developers Training】 1. 创建一个Android项目工程
		注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ... 
- 【Android Developers Training】 75. 使用NSD
		注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ... 
- 【Android Developers Training】 9. 覆盖于布局之上的Action Bar
		注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ... 
- 【Android Developers Training】 8. 定义Action Bar风格
		注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ... 
- 【Android Developers Training】 7. 添加Action Buttons
		注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ... 
随机推荐
- WBS任务分解中前置任务闭环回路检测:有向图的简单应用(C#)
			1 场景描述 系统中用到了进度计划编制功能,支持从project文件直接导入数据,并能够在系统中对wbs任务进行增.删.改操作.wbs任务分解中一个重要的概念就是前置任务,前置任务设置确定了不同任务项 ... 
- SG函数学(hua)习(shui)记录
			---恢复内容开始--- 听说有一个东西叫SG函数 觉得自己好像原来是懂一些粗浅的应用但现在感觉要再深♂入一点呢 让我们先来介绍一下SG函数吧 这是某类满足下列条件的玄学博弈问题解法 双人.回合制: ... 
- MSSQL-Scripter,一个新的生成T-SQL脚本的SQL Server命令行工具
			这里向大家介绍一个新的生成T-SQL脚本的SQL Server命令行工具:mssql-scripter.它支持在SQL Server.Azure SQL DB以及Azure SQL DW中为数据库生成 ... 
- Robot Framework+Oracle
			本篇记录Robot Framework连接oracle数据库的安装 1.基础环境首先,robotframework的基础环境+DatabaseLibrary环境要准备好,这两个环境的搭建在前面已经讲过 ... 
- node--更新数据库问题
			昨天测试blog的comment功能,在新增comment相关的代码之后,重启应用,出现Cannot call method 'forEach' of undefined .反复核对代码,都没发现异常 ... 
- JS简单实现自定义右键菜单
			RT,一个简单的例子,仅仅讲述原理 <div id="menu" style="width: 0;height: 0;background: cadetblue;p ... 
- Zepto源码分析-event模块
			源码注释 // Zepto.js // (c) 2010-2015 Thomas Fuchs // Zepto.js may be freely distributed under the MIT l ... 
- Yii2项目实现Markdown功能 在线Markdown编辑器
			版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处. Yii中添加MarkDown编辑器 主要使用了两个网页Markdown编辑器,都带预览功能. 1,ijackua/yii2-lepture ... 
- Java web中常见编码乱码问题(二)
			根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析: 2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码, ... 
- 转发:Ubuntu软件卸载安装的命令
			说明:由于图形化界面方法(如Add/Remove... 和Synaptic Package Manageer)比较简单,所以这里主要总结在终端通过命令行方式进行的软件包安装.卸载和删除的方法. 一.U ... 
