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

  • Post author:
  • Post category:其他


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



版权声明:本文为wyl_tyrael原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。