Android官方开发文档Training系列课程中文版:打印内容之HTML文档打印

原文地址:http://android.xsoftlab.net/training/printing/html-docs.html

在Android中打印内容要比打印照片要复杂一些,它要求将文本与图像整合到一个文档中。不过Android框架提供了一种实现方式,这种方式需要使用HTML来整合文档并打印,实现这个过程仅需要少量的代码。

在Android 4.4及以上的版本中,类WebView也开始可以打印HTML内容。这个类允许你加载本地的HTML资源或者从web上下载一个页面,并可以创建一个打印工作然后将工作传递给Android的打印服务。

这节课展示了如何快速构建一个包含了文本及图像的HTML文档,然后通过WebView将它打印出来。

加载HTML文档

通过WebView打印HTML文档会涉及到加载HTML资源或者构建一个字符串形式的HTML文档。这一小节描述了如何构建HTML的字符串并且通过WebView将其加载并打印出来。

这个View对象可以作为activity布局的典型用法。然而,如果你的程序没有使用WebView,那么你可以创建一个这个类的实例,然后专门用于打印。创建自定义打印的主要步骤有:

  • 1 .创建一个WebViewClient,它用于在HTML资源加载完毕之后启动打印工作。
  • 2 .加载HTML资源到WebView对象中。

下面的代码演示了如何创建一个简要的WebViewClient,以及如何加载动态创建的HTML文档:

private WebView mWebView;
private void doWebViewPrint() {// Create a WebView object specifically for printingWebView webView = new WebView(getActivity());webView.setWebViewClient(new WebViewClient() {public boolean shouldOverrideUrlLoading(WebView view, String url) {return false;}@Overridepublic 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 PrintManagermWebView = webView;
}

Note: 要确保所产生的打印工作是在WebViewClient的onPageFinished()方法中被调用的。如果没有等到页面加载完毕,那么所打印出的内容可能是不完整或者空白的,甚至可能会完全失败。

Note: 上面的示例代码保持了一个WebView对象的引用,所以在打印工作创建之前不会被垃圾回收器回收。要确保在你自己的实现中做了相同的工作,否则打印进程可能会失败。

如果你想在这个页面中包含图像,请将图像文件放置到工程的assets/目录下,然后在loadDataWithBaseURL()方法的第一个参数中指定这个图像的URL,就像下面的代码展示的那样:

webView.loadDataWithBaseURL("file:///android_asset/images/", htmlBody,"text/HTML", "UTF-8", null);

你也可以加载一个Web页来打印,不过这里不是使用loadDataWithBaseURL(),而是使用loadUrl(),就像下面这样:

// Print an existing web page (remember to request INTERNET permission!):
webView.loadUrl("http://developer.android.com/about/index.html");

当使用WebView来创建打印文档时,你应该意识到以下这些限制:

  • 不能为文档添加页眉、页脚,包括页码。
  • HTML文档的打印选项不包括打印页码范围的能力,举个例子:要打印10页文档的第2页到第4页,这时就不支持了。
  • 在同一时间只能有一个WebView的实例处理打印工作。
  • 一个HTML文档会包含CSS打印属性,比如横向打印属性,这并不支持。
  • 不能使用HTML文档内部的JavaScript来启动打印。

Note: 布局中所包含的WebView的内容在加载完文档之后可以被打印一次。

如果你想创建一个有更多选项的打印及打印页上完整的控制功能,请参见下节课程: Printing a Custom Document.

创建打印工作

在创建WebView并加载完毕HTML文档之后,你的程序几乎完成了打印所要做的所有工作。下面的步骤就需要访问PrintManager,创建一个打印适配器,到最后创建一个打印工作。下面的代码演示了如何执行这些步骤:

private void createWebPrintJob(WebView webView) {// Get a PrintManager instancePrintManager printManager = (PrintManager) getActivity().getSystemService(Context.PRINT_SERVICE);// Get a print adapter instancePrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter();// Create a print job with name and adapter instanceString jobName = getString(R.string.app_name) + " Document";PrintJob printJob = printManager.print(jobName, printAdapter,new PrintAttributes.Builder().build());// Save the job object for later status checkingmPrintJobs.add(printJob);
}

这个例子在程序的内部保存了一个PrintJob对象的实例,不过这不是必须的。你的程序可能会在工作开始之后需要使用这个对象来追踪打印工作的进度。这适用于在程序内部监视打印工作的状态,比如完成、失败或者是用户取消。创建内置的通知并不是必须的,因为打印框架会为打印工作自动的创建一个系统通知。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AAAI21 | Seq2Seq模型成为“复读机”的原因找到了?

文 | 苏剑林编 | Sheryc_王苏单位 | 追一科技去年笔者写过博文《如何应对Seq2Seq中的"根本停不下来"问题&#xff1f;》[1]&#xff0c;里边介绍了一篇论文中对Seq2Seq解码不停止现象的处理&#xff0c;并指出那篇论文只是提了一些应对该问题的策略&#xff0c;并没有…

论文浅尝 | ICLR 2020 - 图神经网络的预训练策略

论文笔记整理&#xff1a;杨帆&#xff0c;浙江大学计算机学院。动机现有的用于图结构的预训练方法要么只关注node-level&#xff0c;导致在图表示空间没有区分度&#xff0c;要么只关注graph-level&#xff0c;导致在节点表示空间没有区分度。一种优质的节点表示应该保证不仅在…

常见的距离算法和相似度计算方法

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/138107999 首发于算法加油站写文章常见的距离算法和相似度计算方法奋发的菜鸟酱​华东师范大学 计算机技术博士在读91 人赞同了该文章注&#xff1a;不定时更新1.常见的距离算法1.1 欧几里得距离&#xff08;Euclidean Dista…

美团AI全景图:吃喝玩乐背后的黑科技

很多人都会发现日常生活已经越来越离不开美团了&#xff0c;这个互联网平台涵盖了吃、住、行、游、购、娱……能帮我们做很多事情&#xff0c;非常接地气。黄色的美团外卖骑手&#xff0c;橙色的摩拜单车&#xff0c;还有美团和大众点评的Logo……会不时出现在各个角落&#xf…

Android官方开发文档Training系列课程中文版:打印内容之自定义文档打印

原文地址&#xff1a;http://android.xsoftlab.net/training/printing/custom-docs.html 对于一些应用&#xff0c;比如绘图类APP&#xff0c;版面设计类APP以及其它APP&#xff0c;这些APP都关注图形的输出&#xff0c;有一个漂亮的打印页面是它们的关键特性。在这种情况下&a…

LeetCode 547. 朋友圈(图的遍历BFS DFS)

文章目录1. 题目2. 解题2.1 BFS 广度优先2.2 DFS 深度优先1. 题目 问有几个连通网络 2. 解题 2.1 BFS 广度优先 参考图的数据结构 class Solution { public:int findCircleNum(vector<vector<int>>& M) {int n M.size(), groups 0, i;bool visited[n] …

开源开放 | 《大词林》开源 75 万核心实体和围绕核心实体的细粒度概念、关系列表...

1《大词林》简介《大词林》(http://101.200.120.155/)是由哈尔滨工业大学社会计算与信息检索研究中心推出&#xff0c;由我中心秦兵教授和刘铭副教授主持开发&#xff0c;是一个自动构建的大规模开放域中文知识库。自2014年11月推出第一版《大词林》&#xff0c;《大词林》共经…

推荐几个不错的CUDA入门教程(非广告)

文 | godweiyang最近因为项目需要&#xff0c;入坑了CUDA&#xff0c;又要开始写很久没碰的C了。对于CUDA编程以及它所需要的GPU、计算机组成、操作系统等基础知识&#xff0c;我基本上都忘光了&#xff0c;因此也翻了不少教程。这里简单整理一下&#xff0c;给同样有入门需求的…

logging.getLogger(logger)

https://www.cnblogs.com/bjdxy/archive/2012/12/03/2799322.html logging模块学习笔记&#xff1a;logger 对象、日志等级 logger&#xff1a;日志对象&#xff0c;logging模块中最基础的对象&#xff0c;用logging.getLogger(name)方法进行初始化&#xff0c;name可以不填。通…

Android官方开发文档Training系列课程中文版:高效显示位图之加载大位图

原文地址&#xff1a;http://android.xsoftlab.net/training/displaying-bitmaps/index.html 引言 学习如何使用一种常规的手段来处理及加载Bitmap对象&#xff0c;这种方式除了使用户界面是可响应的之外&#xff0c;还会避免超出内存的限制。如果你不小心点的话&#xff0c;…

美团DB数据同步到数据仓库的架构与实践

背景 在数据仓库建模中&#xff0c;未经任何加工处理的原始业务层数据&#xff0c;我们称之为ODS(Operational Data Store)数据。在互联网企业中&#xff0c;常见的ODS数据有业务日志数据&#xff08;Log&#xff09;和业务DB数据&#xff08;DB&#xff09;两类。对于业务DB数…

论文浅尝 | AAAI2020 - 基于生成对抗的知识图谱零样本关系学习

论文笔记整理&#xff1a;耿玉霞&#xff0c;浙江大学直博生。研究方向&#xff1a;知识图谱&#xff0c;零样本学习等。来源&#xff1a;AAAI2020论文链接&#xff1a;https://arxiv.org/pdf/2001.02332.pdf本文是发表在AAAI2020上的一篇基于生成对抗网络进行知识图谱零样本关…

LeetCode 1184. 公交站间的距离

1. 题目 环形公交路线上有 n 个站&#xff0c;按次序从 0 到 n - 1 进行编号。我们已知每一对相邻公交站之间的距离&#xff0c;distance[i] 表示编号为 i 的车站和编号为 (i 1) % n 的车站之间的距离。 环线上的公交车都可以按顺时针和逆时针的方向行驶。 返回乘客从出发点…

【python】详解类class的继承、__init__初始化、super方法

原文链接; https://blog.csdn.net/brucewong0516/article/details/79121179?utm_mediumdistribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_sourcedistribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control 通过之前…

追剧计划第三弹!UC Berkeley出品,全栈深度学习!

关注卖萌屋比较早的小伙伴&#xff0c;大概还记得2020年初时我们组织的斯坦福大学CS224N自然语言处理公开课追剧计划&#xff0c;以及后来的斯坦福大学CS520知识图谱公开课追剧活动。尽管活动已经结束很长一段时间&#xff0c;但是仍然有小伙伴后台问“什么时候开始下一波追剧哇…

Android官方开发文档Training系列课程中文版:高效显示位图之在非UI线程中处理图片

原文地址&#xff1a;http://android.xsoftlab.net/training/displaying-bitmaps/process-bitmap.html 我们在上节课Load Large Bitmaps Efficiently中讨论了BitmapFactory.decode*方法&#xff0c;说到了不应该在UI线程中执行读取数据的过程&#xff0c;尤其是从磁盘或者网络…

美团外卖iOS App冷启动治理

一、背景 冷启动时长是App性能的重要指标&#xff0c;作为用户体验的第一道“门”&#xff0c;直接决定着用户对App的第一印象。美团外卖iOS客户端从2013年11月开始&#xff0c;历经几十个版本的迭代开发&#xff0c;产品形态不断完善&#xff0c;业务功能日趋复杂&#xff1b;…

LeetCode 538. 把二叉搜索树转换为累加树(逆中序 根右左)

文章目录1. 题目2. 逆中序&#xff08;根右左&#xff0c;降序循环遍历&#xff09;1. 题目 给定一个二叉搜索树&#xff08;Binary Search Tree&#xff09;&#xff0c;把它转换成为累加树&#xff08;Greater Tree)&#xff0c;使得每个节点的值是原来的节点值加上所有大于…

应用实践 | 电商应用——一种基于强化学习的特定规则学习模型

本文转载自公众号&#xff1a;浙大KG。作者&#xff1a;汪寒&#xff0c;浙江大学硕士&#xff0c;主要研究方向为知识图谱和自然语言处理。应用场景在电商实际应用中&#xff0c;每个商品都会被挂载到若干个场景&#xff0c;以图结构中的节点形式存在。商品由结构化信息表示&a…

20W奖金+实习机会:阿里巴巴达摩院最新时间序列赛事来了!

Datawhale赛事 赛事&#xff1a;2021“AI Earth”人工智能挑战赛2021“AI Earth”人工智能创新挑战赛&#xff0c;由阿里巴巴达摩院联合南京信息工程大学、国家气候中心、国家海洋环境预报中心、安徽省气象局共同创办。大赛以“AI助力精准气象和海洋预测”为主题&#xff0c;聚…