【Android Developers Training】 53. 打印HTML

系统 1679 0

注:本文翻译自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文档


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论