注:本文翻译自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,你可以创建一个该类的实例,目的是为了打印。创建该自定义打印界面的主要步骤是:

  1. 在HTML资源加载完毕后,创建一个WebViewClient用来启动一个打印任务。
  2. 加载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:

一旦在布局中包含的WebView对象加载好了文档,就可以打印WebView对象的内容。

如果你希望创建一个更加自定义化的打印输出并希望可以完全控制打印页面上绘制的内容,可以学习下一节课程: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文档的更多相关文章

  1. 【Android Developers Training】 51. 序言:打印内容

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. 【Android Developers Training】 54. 打印自定义文档

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. 【Android Developers Training】 52. 打印照片

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. 【Android Developers Training】 2. 运行你的应用

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. 【Android Developers Training】 1. 创建一个Android项目工程

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. 【Android Developers Training】 75. 使用NSD

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. 【Android Developers Training】 9. 覆盖于布局之上的Action Bar

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. 【Android Developers Training】 8. 定义Action Bar风格

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 【Android Developers Training】 7. 添加Action Buttons

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

随机推荐

  1. dedecms学习笔记

    终于弄懂了dedecms的架构和原理,然后搭建了人生中的第一个网站.网站名就不说了. dede的后台在dede中,这是后台代码 templets/default中放的是模板 article 里是文章内 ...

  2. 深入理解Struts2----数据校验

    在表现层的数据处理方面主要分为两种类型,一种是类型转换,这点我们上篇已经简单介绍过,另外一种则是我们本篇文章将要介绍的:数据校验.对于我们的web应用,我们经常需要和用户进行交互收集用户信息,那么无论 ...

  3. Configure Red Hat Enterprise Linux shared disk cluster for SQL Server——RHEL上的“类”SQL Server Cluster功能

    下面一步一步介绍一下如何在Red Hat Enterprise Linux系统上为SQL Server配置共享磁盘集群(Shared Disk Cluster)及其相关使用(仅供测试学习之用,基础篇) ...

  4. Mac iterm2 linux vim 语言问题

  5. 写给Android App开发人员看的Android底层知识(4)

    (八)App内部的页面跳转 在介绍完App的启动流程后,我们发现,其实就是启动一个App的首页. 接下来我们看App内部页面的跳转. 从ActivityA跳转到ActivityB,其实可以把Activ ...

  6. iOS UIAlertView 文字对其方式 文字大小 设置方法

    - (void) willPresentAlertView:(UIAlertView *)alertView { for (UIView *subViewin alertView.subviews) ...

  7. java 空指针异常造成的原因有哪些

    实际上 空指针异常   也就是你用了一个没有实际值的对象 1. 某一对象没有被实例化,就拿来使用,如调用此对象的方法,会抛空指针异常. 2. 获取从别的对象传过来的对象为空 3. 数据库查询方面的空指 ...

  8. 模拟实现简化版List迭代器&嵌入List

    1.迭代器(iterators)概念(1)迭代器是一种抽象的设计概念,其定义为:提供一种方法,使他能够按顺序遍历某个聚合体(容器)所包含的所有元素,但又不需要暴露该容器的内部表现方式. (2)迭代器是 ...

  9. 你为什么必须(从现在开始就)掌握linux

    写在前面 在我看来,人人都应该学习linux,但这不是本文探讨的重点.本文主要从软件测试人员的角度谈谈学习和掌握linux的重要性.必要性.紧迫性. 另外: 这里所说的linux系统,是unix系统和 ...

  10. javascript基础-HTML5

    跨文档消息(Web Messaging cross-document messaging) 原理 往有关联(同一框架/弹出)的文档传递数据. Message Channel在javascript基础- ...