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相关的知识。