树莓派使用CUPS搭建局域网打印机(二)
之前文章( 树莓派 + HP LaserJet CP1025 网络打印服务器方案 )提到过树莓派通过安装CUPS配置局域网共享打印机,但是对于CP1025这款打印机,当时的方案并不理想,存在官方驱动打印色彩偏差过大,发送打印机任务后打印机响应缓慢,http打印机虽然打印速度快,但是打印时没有任务队列等问题。经过一段时间总结经验,整理了一下几种方案。
一. 安装 CUPS 并使用 foo2zjs 驱动
CP1025 是主机端渲染(host-based)打印机,走 HP 的 ZjStream 数据流协议——打印机自己不做渲染,由电脑端驱动算好点阵数据发过去。HPLIP 的 hpcups 驱动对这台机器有长期已知问题:
- 黑色文字被拆成 CMY 三色混印 (浪费墨水、文字发虚,Launchpad 有正式报告)
- 照片偏暗、过饱和,HP Device Manager 里调 gamma/饱和度无效
foo2zjs 是社区为这类打印机写的开源 ZjStream 驱动,自带 HP 官方色彩文件 hp-cp1025-rgb-392-bpp1.icm,是 CP1025 在 Linux 下颜色正确的公认方案。
安装
1 | sudo apt update |
| 软件包 | 作用 |
|---|---|
| cups | 打印服务器核心:队列管理、任务落盘排队、调用驱动渲染、IPP 网络共享,自带 Web 管理界面(631 端口) |
| printer-driver-foo2zjs | CP1025 专用驱动,实现 ZjStream 协议,自带官方 ICM 色彩文件,颜色正确 |
| avahi-daemon | mDNS/Bonjour 网络发现服务,把打印机广播到局域网,iPhone/Mac 的 AirPrint 和 Windows 自动发现都靠它 |
| qpdf | PDF 命令行切分工具,仅可选的分批脚本环节使用 |
添加打印队列
也可以参考 树莓派 + HP LaserJet CP1025 网络打印服务器方案 文章添加打印机,Mode选择 foo2zjs/HP-LaserJet_Pro_CP1025nw即可。
关键是选对驱动型号——注意要选带 “Pro” 字样的那个条目:
1 | # 查找准确的 USB URI 和驱动名 |
也可以直接用 Web 界面操作:浏览器访问 http://树莓派IP:631 → Administration → Add Printer,型号列表里选 **”HP LaserJet Pro CP1025nw Foomatic/foo2zjs-z3 (recommended)”**。
⚠️ 别选不带 Pro 的 CP1025 条目,那套驱动不好用。型号列表很长,”Pro” 开头的按字母序位置完全不同,要仔细往下翻。
解决颜色问题
- Debian 的
printer-driver-foo2zjs包已把hp-cp1025-rgb-392-bpp1.icm装到/usr/share/foo2zjs/icm/,配套 PPD 里的 ICM/色彩选项会自动挂上它。 - 打印测试页验证:CUPS Web 界面 → Printers → CP1025 → Maintenance → Print Test Page。
- 如果颜色仍不满意,在 CUPS Web 界面的「Set Default Options → Color」里调
ColorModel(RGB/CMYK)和 ICM 选项,逐项对比测试页。 - 若发行版包驱动的 PPD 有问题(早年有人反馈过),备选方案是从 foo2zjs 官网源码编译安装;近年的 Debian 包一般没问题,先试包。
二.RAW-9100 方案 (推荐)
我最终选的这个方案,因为打印速度可以接受,foo2zjs打印质量也没问题,还能显示打印队列。
2.1 原理
CUPS 不监听 9100(自带 socket:// 仅为发送后端)。本方案用 systemd socket 监听 9100,把裸数据流管道给 lp 命令——lp 是 CUPS 官方客户端,经 /run/cups/cups.sock 走 IPP 提交任务,任务正常进队列,与 IPP/LPD 通道统一调度、不冲突。
不要用 p910nd:它绕开 CUPS 直写打印机设备文件,与 CUPS 队列抢设备。
2.2 创建 systemd 单元
先获取队列名(ExecStart 中 -d 参数要用到)。执行:
1 | lpstat -p |
输出形如:
1 | printer HP_LaserJet_CP1025 is idle. enabled since Mon 21 Sep 2026 20:16:04 CST |
printer 和 is 之间的词就是队列名,本例为 HP_LaserJet_CP1025(区分大小写)。
1 | sudo tee /etc/systemd/system/cups-raw9100.socket <<'EOF' |
1 | sudo tee /etc/systemd/system/cups-raw9100@.service <<'EOF' |
关键:-o raw 告诉 CUPS 不再过滤(Windows 驱动已渲染成打印机语言),纯排队透传。
2.3 启用与验证
1 | sudo systemctl daemon-reload |
防火墙(如装了 ufw):sudo ufw allow 9100/tcp
2.4 Windows 11 客户端
添加打印机 → 手动添加 → TCP/IP 设备 → 填树莓派 IP → 取消”查询打印机” → 协议选 Raw,端口 9100 → 装 HP CP1025 厂商驱动 → 端口配置里关 SNMP 状态。
三.LPD 方案(端口 515)
3.1 原理
cups-lpd 是 CUPS 自带的 LPD 迷你服务器(/usr/lib/cups/daemon/cups-lpd),把 LPD 协议(RFC 1179,控制文件 cf + 数据文件 df)翻译成 IPP 请求转发给本机 cupsd。它不常驻,由 systemd socket 按需拉起;不读 cupsd.conf 的访问控制。
注意:当前 Raspberry Pi OS 的 cups 包带二进制但不再附带 systemd 单元(/usr/lib/systemd/system/ 里没有),需手工创建。
3.2 创建 systemd 单元
1 | sudo tee /etc/systemd/system/cups-lpd.socket <<'EOF' |
1 | sudo tee /etc/systemd/system/cups-lpd@.service <<'EOF' |
参数说明:-n 跳过反向 DNS;document-format=application/octet-stream 强制自动检测格式(官方推荐)。
3.3 启用与验证
1 | sudo systemctl daemon-reload |
防火墙(如装了 ufw):sudo ufw allow 515/tcp
3.4 Windows 11 客户端
- 安装可选功能:设置 → 应用 → 可选功能 → 查看功能 → 搜索 “LPR 端口监视器”(LPR Port Monitor)→ 安装(已 deprecated,未来 Windows 版本可能移除);
- 设置 → 打印机和扫描仪 → 添加设备 → 手动添加 → 使用 TCP/IP 地址或主机名添加;
- 地址填树莓派固定 IP,取消”查询打印机并自动选择驱动”;
- 协议选 LPR,队列名填
HP_LaserJet_CP1025; - 装 HP CP1025 厂商驱动(Windows 本地渲染,只发指令流,这是快的原因);
- 打印机属性 → 端口 → 配置端口:**取消”启用 SNMP 状态”**;如打印截断再勾”LPR 字节计数”。
冲突说明
- 515 / 631 / 9100 端口互不占用;三个 socket 单元均为按需拉起,平时零开销;
- 所有任务汇入同一 CUPS 队列,cupsd 串行调度,三通道同时来任务也只会顺序打印;
lp命令非旁路,与 cups-lpd 内部路径一致(客户端 → IPP → cupsd → 队列)。
附:IPP 通道关闭 TLS(解决 https 慢 + Windows 发现成 https)
/etc/cups/cupsd.conf:
1 | DefaultEncryption Never |
1 | sudo rm -f /etc/cups/ssl/RPIPD.* |
CUPS HTTPS 慢的根因:cupsd 在客户端名与证书 CN 不匹配时现场重新生成 RSA 证书(树莓派上数秒级阻塞),叠加 RFC 2817 Upgrade 协商与 DNS 解析超时。
Windows 手动添加 IPP 的坑:不要用”按名称选择共享打印机”+http://URL(会建成上古"Web 打印机”/Internet Printing Client)。正确做法:手动添加时设备类型选 **”IPP 设备”**,或 PowerShell:
1 | Add-PrinterPort -Name "IPP_RPIPD" -PrinterHostAddress "192.168.x.x" -PortType IPP |
验证:Get-Printer | Select Name, DriverName 应显示 Microsoft IPP Class Driver。