zoukankan      html  css  js  c++  java
  • 安卓打印实现打印pdf文档

    先声明一下,此处的打印非pos打印机打印和蓝牙打印机打印,如果想查找打印小票的pos打印机请进入下面的传送门,蓝牙打印目前没做过,有做过的请指教。

    pos打印机传送门:

    1. https://www.cnblogs.com/LIANQQ/p/4587637.html

    2.https://www.ibm.com/developerworks/cn/java/j-lo-pos/index.html

    目前要实现的功能是类似于电脑上的文档打印,pdf、word、excel、ppt等,下面的例子仅实现了pdf。

    但是要注意一点,此种方案仅适用于android4.4以上版本,低于android4.4不支持。

    并且如果系统版本低于android9.0需要安装支持所使用打印机的print Service才可以打印,而android9.0以上设备可以不用安装。

    关于为什么要安装print service,请看传送门 https://juejin.im/post/5a24b18df265da432840afc9

    其中安卓也提供了一些用于实现打印服务的接口类,传送门https://developer.android.google.cn/reference/android/printservice/package-summary,如果你足够厉害,也可以做一个print service来兼容多种打印机,其实有公司做过,不过随着时间推移很多都不与现在的打印机兼容来,有兴趣的可以试试PrintShare等软件,如果不理想,那就还是下载打印机官方提供的 print service吧。

    由于目前的办公环境,我安装了两款打印服务插件,一个是惠普的,一个是佳能的。名称分别如图所示,我是从酷安下载的,当然你从别的地方下载也可以:

     

    安装完成后到系统设置--打印--找到对应的服务,如图

    点击对应的打印服务,有的可以直接扫描到局域网的打印机,直接添加,有的需要手动输入IP地址添加

    添加完成后打印的服务就算是有了,然后就是代码实现了。

    在所有打印机可以看到新添加的打印机:

    如果不确定这个添加好的打印机能不能打印,可以先下载一个wps,然后随便创建一个文档进行打印测试以下。

    wps打印按钮的位置如图

    好了,如果你不是开发者,看到这里你就可以用wps打印pdf、word、excel、ppt之类的文件了。

    但是作为开发者我们怎样才能在程序里调用这个系统打印服务呢?

    有人写好了pdf的,我也只是搬一下砖,具体连接在此:https://blog.csdn.net/tangxl2008008/article/details/78424867 

    文章写的很详细了,但是文章中介绍的 Mopria PrintService 已经不能用了,我简单介绍下:

    其实就是使用了安卓系统的PrintManager调用系统打印服务,不过传参数的时候有一个PrintDocumentAdapter需要自定义,这个adapter其实就是一个适配器抽象类,通过实现这个抽象类来达到打印不同格式的文档的目的(pdf、word、excel等)。具体这个类的使用方式见中文翻译:http://hukai.me/android-training-course-in-chinese/multimedia/printing/custom-docs.html

    调用过程可以移植到代码里,如下:

    1 private void doPdfPrint(String filePath) {
    2     PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE);
    3     MyPrintPdfAdapter myPrintAdapter = new MyPrintPdfAdapter(filePath);
    4     printManager.print("jobName", myPrintAdapter, null);
    5 }

    如果使用pdf打印的话可以直接使用这篇文章里的MyPrintPdfAdapter,如果想打印其他文档请自行继承PrintDocumentAdapter。

    既然写完了,测试是什么样子呢?

    点来打印后会直接出现下面的图,选择对应的打印机然后点那个绿色的打印按钮就可以了。

     

    好了,先总结到这,时间紧迫,又该搬砖去了,有问题请留言。

    更正一下,Mopria Print Service国内版搜索不可用,但是google play有对应版本,有能力上墙的请访问

    https://play.google.com/store/apps/details?id=org.mopria.printplugin&hl=zh

    更新

    由于我们的程序不仅要实现pdf打印,可能还要实现doc、xls、ppt的打印,以上方法可能就不试用了。

    下面的连接提供了几种方法,bitmap打印、view截图打印、webview内容打印,而我们显示doc等文档使用的是QQ的X5内核的webview,所以要打印文档,只需要支持webview显示即可。

    https://www.jianshu.com/p/d82bd61b11a4

    简单总结如下:

    bitmap打印使用PrintHelper

    PrintHelper photoPrinter = new PrintHelper(getActivity());  
     photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT);  
     Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.droids);  
     photoPrinter.printBitmap("droids.jpg - test print", bitmap); 

    webview打印使用PrintedPdfDocument

    PrintAttributes attributes = new PrintAttributes.Builder()
                                .setMediaSize(PrintAttributes.MediaSize.ISO_A4)
                                .setResolution(new PrintAttributes.Resolution("id", Context.PRINT_SERVICE, 300, 300))
                                .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
                                .setMinMargins(new PrintAttributes.Margins(0, 0, 0, 0))
                                .build();
         PdfDocument document = new PrintedPdfDocument(context, attributes);
        for (int i = 0; i < numberOfPages; i++) {
            int webMarginTop = i * letterSizeHeight;
    
            PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(webViewWidth, letterSizeHeight, i + 1).create();
            PdfDocument.Page page = document.startPage(pageInfo);
            page.getCanvas().translate(0, -webMarginTop);
            webView.draw(page.getCanvas());
    
            document.finishPage(page);
        }
        document.writeTo(getOutputStream());
        document.close();

     另外一种方式就是通过在线把office文件转pdf,然后通过webview加载pdf就可以实现office文件的浏览了,然后也可以通过转化成pdf来打印了

    在线转pdf连接 https://www.cnblogs.com/woider/p/7003481.html  

    我的github地址:https://github.com/dongweiq/

    欢迎关注,欢迎star o(∩_∩)o 。有什么问题请邮箱联系 dongweiqmail@gmail.com qq714094450

  • 相关阅读:
    RMQ(非log2储存方法)
    2016年5月份学习记录
    NOIP200504循环
    膜拜acm大牛 虽然我不会这题,但是AC还是没有问题的~(转自hzwer)
    最长公共子序列的长度
    菜鸟,大牛和教主三者的区别(转自hzwer)
    NOIP201205Vigenère密码
    NOIP200503采药
    公路乘车
    NOIP200902分数线划定
  • 原文地址:https://www.cnblogs.com/dongweiq/p/10374467.html
Copyright © 2011-2022 走看看