Android使用惠普打印机,USB直连静默打印

Android在使用打印机打印东西的时候,往往会弹出预览设置界面,然后点击打印才能打印内容。

现在有个需求是:点击打印按钮之后,直接打印内容,不让跳出预览设置界面。

使用系统的api几行代码就能打印内容了,但是弹出的预览界面之丑,然后有使用惠普打印插件,预览界面依旧存在,反编译之后也没有发现什么新大陆。最后在惠普工作人员的帮助下,实现一键打印的功能,过程曲折离奇啊,记录如下:

打印机:HP Color LAserJet Pro M452 PCL6

android主板:4.4.4,已root

打印内容:PDF文档,可以将文字,图片,视图转成PDF文件。

静默打印其实就一句代码,使用的cp命令“cp 文件磁盘路径 /dev/usb/lp0”,比如“cp /mmt/sdcard/test.pdf /dev/usb/lp0

cp命令的含义就不解释了,mmt/sdcard/test.pdf 是要打印的pdf文件,/dev/usb/lp0是打印机在Android主板上显示的设备节点,由于使用的是惠普打印机,必须是这个节点,有的主板会获取到/dev/bus/usb/001之类的节点,usb下面的节点全是数字,比如001,002,获取设备Device信息也是打印机的相关信息,但是就是打印不了。必须生成/dev/usb/lp0这个节点才行,如果生成不了直接修改烧录内核源码,或者联系厂商修改。

假定设备能生成/dev/usb/lp0节点,使用命令的时候依旧出现了很多问题。

1、权限。

使用这个指令需要申请Root权限,也就是Android设备需要root才行

2、使用itextpdf生成pdf文档(官方api满足不了需求)

这里要注意引用的库版本,以及辅助库,否则报错不要太多!!!这里要注意引用的库版本,以及辅助库,否则报错不要太多!!!这里要注意引用的库版本,以及辅助库,否则报错不要太多!!!

implementation 'com.itextpdf:itextg:5.5.10'
implementation 'com.madgag:scprov-jdk15on:1.47.0.2'
implementation 'com.madgag:scpkix-jdk15on:1.47.0.2'

build里引用以上库便能正常生成pdf文档了。

3、生成的pdf文档,能打印内容,但是打印不了中文

需要给PDF文档嵌入支持中文的字体!什么给文档嵌入字体?第一次听到很懵逼有没有!!然后到itext官方去找相应的解决办法,这里解决了中文打印不出的问题https://itextpdf.com/en/resources/examples/itext-5/using-fonts

        Document document = new Document();//创建文档对象
        PdfWriter writer = null;
        String src= Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + "create_src.pdf";
        String pdf = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + "create_dest.pdf";

     
        try {
            writer = PdfWriter.getInstance(document, new FileOutputStream(src));
            writer.setPdfVersion(PdfWriter.VERSION_1_7);//设置版本
            document.open();
            Font font = FontFactory.getFont("assets/NotoSansCJKsc-Regular.otf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);//创建字体
            document.add(new Paragraph("创建PDF文档并打印!", font));
            document.add(new Paragraph("生成时间:" + mSimpleDateFormat.format(new Date(System.currentTimeMillis())), font));

            document.close();
            PdfUtil.write(src, dest);//将生产的pdf文件,加工处理成新的pdf文件
            PdfUtil.print(dest.getAbsolutePath());//打印加工后的pdf文件

        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
注意这个方法获取字体,FontFactory.getFont("字体名称/路径", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);用的字体是“NotoSansCJKsc-Regular.otf”,以上便能简单的打印含中文的pdf文档了。

4、打印等待时间过长

现在能打印了,但是点击打印之后,等待时间会超20-30s的时长,打印机会很快收到消息,但是差不多二三十秒后才开始响动,这个问题则是由PDF文件本身引起的,这就需要了解PDF的文档结构了https://blog.csdn.net/P876643136/article/details/79449060

PDF文档文件头和文件尾,需要添加一些设置信息,打印机才能快速识别到当前pdf文档是否接收完成,立即打印。其中涉及到PJL相关的知识。

demo下载

github链接:https://github.com/wylIwwg/PrintSDKSample.git

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值