打印 HTML 文档

如果要在 Android 上打印简单照片以外的内容,则需要以文本和图形的形式 打印文档。Android 框架提供了一种使用 HTML 来撰写文档和 只需极少的代码即可将其输出。

在 Android 4.4(API 级别 19)中,WebView 类已更新为 允许打印 HTML 内容。通过该类,您可以加载本地 HTML 资源或下载文件, 创建打印作业并将它交给 Android 的打印服务。

本课介绍如何快速构建包含文本、图形和 使用 WebView 进行输出。

加载 HTML 文档

使用 WebView 打印 HTML 文档涉及加载 HTML 或以字符串形式构建 HTML 文档。本部分介绍了如何构建 HTML 字符串并将其加载到 WebView 中进行输出。

此视图对象通常用作 Activity 布局的一部分。但是,如果您的应用 未使用 WebView,则可以创建该类的实例 尤其是用于打印目的创建此自定义打印视图的主要步骤如下:

  1. 创建在以下日期之后启动打印作业的 WebViewClient: HTML 资源是否已加载。
  2. 将 HTML 资源加载到 WebView 对象中。

以下代码示例演示了如何创建简单的 WebViewClient 并加载即时创建的 HTML 文档:

Kotlin

private var mWebView: WebView? = null

private fun doWebViewPrint() {
    // Create a WebView object specifically for printing
    val webView = WebView(activity)
    webView.webViewClient = object : WebViewClient() {

        override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest) = false

        override fun onPageFinished(view: WebView, url: String) {
            Log.i(TAG, "page finished loading $url")
            createWebPrintJob(view)
            mWebView = null
        }
    }

    // Generate an HTML document on the fly:
    val 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
}

Java

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;
}

注意:请确保用于生成打印任务的调用发生在上一部分中创建的 WebViewClientonPageFinished() 方法中。如果您没有等待页面显示 加载完成,则打印输出可能不完整或空白,或者可能完全失败。

注意:上面的示例代码存储了 WebView 对象,使其不会在打印作业之前进行垃圾回收 。请确保您在自己的实现中也这样做,否则打印流程 可能会失败

如果您想在页面中添加图形,请将图形文件放在 assets/ 中 目录中,并在 loadDataWithBaseURL() 方法,如 以下代码示例:

Kotlin

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

Java

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

您也可以通过将 loadDataWithBaseURL() 方法与 loadUrl()(如下所示)。

Kotlin

webView.loadUrl("https://developer.android.com/about/index.html")

Java

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

使用 WebView 创建打印文档时,请注意以下事项: 存在以下限制:

  • 您不能向文档中添加页眉或页脚,包括页码。
  • HTML 文档的打印选项不包括打印页面的功能 范围,例如:不支持打印 10 页 HTML 文档中第 2 至 4 页的内容。
  • WebView 的实例一次只能处理一个打印作业。
  • 包含 CSS 打印属性(例如横向属性)的 HTML 文档 支持。
  • 您不能在 HTML 文档中使用 JavaScript 触发打印作业。

注意WebView 对象中包含的 在布局加载文档后也可以打印它

想要创建自定义程度更高的打印输出并完全控制内容 在打印的页面上绘图,请转到下一课: 打印自定义文档课程。

创建 WebView 并加载 HTML 内容后, 应用的打印过程就快完成了。后续步骤是 PrintManager,创建打印适配器,最后创建打印 作业。以下示例说明了如何执行这些步骤:

Kotlin

private fun createWebPrintJob(webView: WebView) {

    // Get a PrintManager instance
    (activity?.getSystemService(Context.PRINT_SERVICE) as? PrintManager)?.let { printManager ->

        val jobName = "${getString(R.string.app_name)} Document"

        // Get a print adapter instance
        val printAdapter = webView.createPrintDocumentAdapter(jobName)

        // Create a print job with name and adapter instance
        printManager.print(
                jobName,
                printAdapter,
                PrintAttributes.Builder().build()
        ).also { printJob ->

            // Save the job object for later status checking
            printJobs += printJob
        }
    }
}

Java

private void createWebPrintJob(WebView webView) {

    // Get a PrintManager instance
    PrintManager printManager = (PrintManager) getActivity()
            .getSystemService(Context.PRINT_SERVICE);

    String jobName = getString(R.string.app_name) + " Document";

    // Get a print adapter instance
    PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter(jobName);

    // Create a print job with name and adapter instance
    PrintJob printJob = printManager.print(jobName, printAdapter,
            new PrintAttributes.Builder().build());

    // Save the job object for later status checking
    printJobs.add(printJob);
}

此示例保存了 PrintJob 对象的实例,以供 应用,这并非必需。您的应用可以使用此对象来跟踪 与正在处理的打印作业相关联。如果您想监控 。创建 不需要应用内通知,因为打印框架会自动创建一个系统 通知。