安卓开发适配HP打印机实现静默打印【一】
关键词【安卓开发】【USB打印机】【惠普打印机】【静默打印】
客户反馈需要在RK3288平台适配HP多型号USB打印机,花了几周调研了市面上的安卓打印方法并测试,最终选择了移植Cups+hplip
,不过在此之前我会介绍一下目前常用的一些打印方法。
⚠️注意:这篇blog是介绍移植cups在安卓开发板上去打印,而不是调用别的设备的cups去打印
1.安装HP官方打印插件
需要安装惠普自己的软件,然后需要配置打印机参数,很繁琐,如果遇到需要静默打印的客户,这个方案直接pass
2.使用Mopria打印服务
需要安装Mopria打印服务,这个打印起来很方便,但是不支持静默打印,有Mopria的LOGO和数据分析上传,可以反编译修改掉但是静默打印这个难度太大,没修改成功。
3.趣打印
支持PDF、Office文档、图片、网页等格式打印,兼容惠普、爱普生、佳能等主流品牌打印机。
支持Wi-Fi、蓝牙、USB及远程打印,免费版限制20页远程打印,高级版无限制。
可打印云端文件(如Google Drive、Dropbox),支持老式联网打印机。
这个软件做的很好,市面上大部分打印机都通杀了,安装完成后需要下载厂商打印驱动,需要软件拉起趣打印并打印,如果遇到需要静默打印的客户,这个方案直接pass
4.ghostscript+ foo2zjs
ghostscript : gs 本身主要是一个文件转换器 ,对打印机的支持比较有限,需要借助其他filter
如 hpijs foo2zjs,这个支持静默打印,但是支持的打印机型号有限,参考下图,系统工程师给我的测试命令行:
gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE -sPAPERSIZE=a4 -r600x600 -sDEVICE=pbmraw -sOutputFile=/mnt/sdcard/test.pbm /mnt/sdcard/demo.pdf
foo2zjs -z3 -p9 -r600x600 /mnt/sdcard/test.pbm > /dev/usb/lp0
- 支持的打印机型号
- Konica Minolta magicolor 2430 DL
- Minolta/QMS 2300 DL
- Minolta/QMS 2200 DL
- HP LaserJet P2035
- HP LaserJet M1319 MFP
- HP LaserJet Pro P1606dn
- HP LaserJet Pro P1566
- HP LaserJet Pro P1102
- HP LaserJet Pro CP1025nw
- HP LaserJet 1022
- HP LaserJet 1020
- HP LaserJet 1018
- HP LaserJet 1005
- HP LaserJet 1000
我手里的HP Deskjet1212 执行后只会闪烁指示灯,不会打印
执行下述命令,依然毫无反应,这个方案彻底放弃,如果你的打印机在上述型号中,可以尝试使用
adb shell
su
cat sihp1020.dl > /dev/usb/lp0
foo2zjs -z1 -p9 -r600x600 test.pbm > /dev/usb/lp0
5.ghostscript+ hpijs
老方案,新打印机很多都不支持 ,hpijs 被合并到hplip中已经不再更新。
进入惠普官网下载最新的HPLIP,里面包含了HPIJS的所有代码,花了一天将hpijs通过交叉编译移植后,兴致勃勃的导入开发板就去测试了,执行下述打印命令
gs -sDEVICE=ijs -sIjsServer=hpijs -dIjsUseOutputFD -sDeviceManufacturer="HEWLETT-PACKARD" -sDeviceModel="DESKJET 1212" -dNOPAUSE -dBATCH -dPARANOIDSAFER -dQUIET -sOutputFile="/dev/usb/lp0" /mnt/sdcard/test.pbm
毫无反应,后面才发现HPIJS支持的型号也不是很多,需要查看hplip的源代码
-sDeviceModel=“DESKJET 825”
这就是配置具体打印机型号的参数,在交叉编译之前,我认为hpijs肯定支持,这下踩坑了,又浪费了时间,建议在编译之前先去查一下源代码中是否支持对应的打印机。
HPIJS移植参考链接:android7.1 打印机 (ghostscript+hpijs - hplip)-CSDN博客
本篇部分内容参考了上述的博客
6.移植CUPS+CUPS-FILTER+HPLIP
介绍一下这几个库的功能作用
1. CUPS (Common Unix Printing System)
- 角色: 打印系统的核心和大脑。 它是一个开源的、跨平台的打印系统,现在是绝大多数 Linux 发行版和 macOS 的默认打印系统(苹果公司是其原始开发者,后开源)。
- 主要功能:
- 打印队列管理: 接收来自应用程序的打印作业,将其放入队列,并按顺序或优先级发送给打印机。
- 打印机管理: 发现本地(USB, Parallel)和网络打印机(IPP, LPD, Samba, JetDirect),配置打印机连接、选项(纸张大小、双面、分辨率等)。
- 作业调度: 管理作业的状态(等待、处理中、已完成、错误)、暂停/继续/取消作业。
- 协议支持: 理解并处理多种网络打印协议(IPP, HTTP, LPD, SMB/CIFS, socket)。
- 提供 API 和接口:
- Web 管理界面: 通过
http://localhost:631
访问,进行大部分管理操作。 - 命令行工具:
lpadmin
(管理打印机),lpstat
(查看状态),lp
/lpr
(提交作业),cancel
(取消作业)。 - IPP API: 应用程序(如 LibreOffice, Firefox)通过 IPP 协议与 CUPS 通信来提交打印作业。
- Web 管理界面: 通过
- 关键点: CUPS 本身不负责将应用程序的数据(如 PDF, PostScript, 纯文本)转换成打印机能够理解的特定语言(如 PCL, ESC/P, PostScript)。它主要负责作业的接收、排队、路由和管理。转换工作由过滤器完成。
2. CUPS-Filters
- 角色: 文档格式转换的“翻译官”和“流水线”。 这是一个由 OpenPrinting 项目维护的软件包,包含了一系列的过滤器程序和支撑库。
- 主要功能:
- 格式转换链: 提供一个灵活的框架,将 CUPS 接收到的各种输入格式(application/pdf, application/postscript, image/jpeg, text/plain 等)转换成打印机最终需要的格式(通常是 application/vnd.cups-postscript, application/vnd.cups-raster, 或打印机原生语言如 PCL)。
- 处理流程: 当一个打印作业提交到 CUPS 后,CUPS 会根据打印机的 PPD 文件(包含打印机能力描述)确定需要哪些过滤器。CUPS-Filters 提供了这些过滤器,它们像管道一样串联起来工作。例如:
- 一个 PDF 作业可能需要:
pdftopdf
(处理 PDF 选项如 N-up) ->pdftops
或pdftoraster
(将 PDF 转换为 PostScript 或 Raster) ->rastertopclm
(如果需要最终输出为 PCL) -> 发送给打印机后端(如 USB 后端usb
或网络后端ipp
)。
- 一个 PDF 作业可能需要:
- 提供重要工具:
driverless
/ippeveprinter
: 支持 AirPrint 和 IPP Everywhere 标准,允许驱动程序较少的打印。foomatic-rip
: 处理基于 Foomatic/OpenPrinting 数据库的打印机驱动(通常用于较老的或 GDI 打印机)。bannertopdf
,texttopdf
,imagetopdf
,imagetoraster
等:处理特定输入格式的转换。cups-browsed
: 自动发现和配置网络打印机(特别是通过 DNS-SD/mDNS 和 CUPS 共享)。
- 关键点: CUPS-Filters 是现代 CUPS 安装的必备组件。它处理了 CUPS 核心功能之外最关键的部分:将通用的打印数据转换成打印机能够理解的特定格式。它独立于特定打印机品牌。
3. HPLIP (HP Linux Imaging and Printing)
- 角色: 惠普(HP)打印机在 Linux 上的官方驱动和工具包。
- 主要功能:
- 提供驱动程序: 包含针对大量惠普喷墨和激光打印机的优化驱动(PostScript 和 PCL 版本)。这些驱动通常比 CUPS 自带的通用
hp
驱动或foomatic
驱动提供更好的性能、功能支持和可靠性。 - 提供 CUPS 后端: 包含与 CUPS 集成的后端程序
hpfax
(用于传真) 和hp
(用于打印和扫描通信)。 - 提供扫描支持: 包含 SANE 后端 (
hpaio
),使惠普多功能一体机 (MFP) 的扫描功能能在 Linux 上使用(通过simple-scan
,xsane
等扫描程序)。 - 提供图形化管理工具:
hp-toolbox
/hp-setup
提供了一个用户友好的图形界面来安装、配置、管理惠普打印机/一体机,进行状态监控、墨水量查看、维护任务(清洗打印头)等。 - 提供命令行工具:
hp-*
系列命令(如hp-info
,hp-levels
,hp-clean
,hp-plugin
)用于查询状态、查看墨水量、维护打印机、安装必要插件(如某些型号需要的二进制 blob)。
- 提供驱动程序: 包含针对大量惠普喷墨和激光打印机的优化驱动(PostScript 和 PCL 版本)。这些驱动通常比 CUPS 自带的通用
- 关键点:
- 品牌特定: 专为 HP 打印机设计。
- 超越基本驱动: 不仅提供 CUPS 驱动(PPD 文件),还提供与打印机深度交互的工具和扫描支持。
- 与 CUPS/CUPS-Filters 协作: HPLIP 安装的打印机驱动(PPD)会被 CUPS 识别和使用。当 CUPS 处理发送给 HPLIP 打印机的作业时,它会调用 CUPS-Filters 中的过滤器(如
pdftops
)或 HPLIP 自己的过滤器(如hpps
)来进行必要的格式转换(例如 PDF -> PostScript/PCL),然后通过 HPLIP 提供的hp
后端发送给打印机。HPLIP 的扫描功能则通过 SANE 框架独立工作。
上面我让AI给我总结了一下,大概就是这样,下一节我们的目标是移植CUPS到 运行 Android 操作系统 的 ARM 架构处理器 的设备上.