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

简介: 原文地址:http://android.xsoftlab.net/training/printing/html-docs.html在Android中打印内容要比打印照片要复杂一些,它要求将文本与图像整合到一个文档中。

原文地址: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 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: 要确保所产生的打印工作是在WebViewClientonPageFinished()方法中被调用的。如果没有等到页面加载完毕,那么所打印出的内容可能是不完整或者空白的,甚至可能会完全失败。

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

目录
相关文章
|
25天前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
161 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
1月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
224 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
1月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
480 3
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
446 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
30天前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
100 0
|
2月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
166 19
|
2月前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
178 6
|
4月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
322 11
|
4月前
|
移动开发 Java 编译器
Kotlin与Jetpack Compose:Android开发生态的演进与架构思考
本文从资深Android工程师视角深入分析Kotlin与Jetpack Compose在Android系统中的技术定位。Kotlin通过空安全、协程等特性解决了Java在移动开发中的痛点,成为Android官方首选语言。Jetpack Compose则引入声明式UI范式,通过重组机制实现高效UI更新。两者结合不仅提升开发效率,更为跨平台战略和现代架构模式提供技术基础,代表了Android开发生态的根本性演进。
165 0
|
5月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
250 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡

热门文章

最新文章