树莓派使用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
2
3
4
5
6
7
8
sudo apt update
sudo apt install cups printer-driver-foo2zjs avahi-daemon qpdf

# 将pi用户增加到lpadmin 不这么做的话,添加打印机时会提示没有权限.
sudo usermod -aG lpadmin $USER

# 插上 USB 线,确认识别
lsusb | grep -i printer
软件包 作用
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
2
3
4
5
6
7
8
9
# 查找准确的 USB URI 和驱动名
lpinfo -v | grep -i 1025
lpinfo -m | grep -i 1025

# 示例(URI 以实际输出为准):
sudo lpadmin -p CP1025 \
-v "usb://HP/LaserJet%20Pro%20CP1025nw?serial=XXXXXX" \
-E -m "foo2zjs:0/ppd/foo2zjs/HP-LaserJet_Pro_CP1025nw.ppd"
sudo lpoptions -d CP1025

也可以直接用 Web 界面操作:浏览器访问 http://树莓派IP:631 → Administration → Add Printer,型号列表里选 **”HP LaserJet Pro CP1025nw Foomatic/foo2zjs-z3 (recommended)”**。

⚠️ 别选不带 Pro 的 CP1025 条目,那套驱动不好用。型号列表很长,”Pro” 开头的按字母序位置完全不同,要仔细往下翻。

解决颜色问题

  1. Debian 的 printer-driver-foo2zjs 包已把 hp-cp1025-rgb-392-bpp1.icm 装到 /usr/share/foo2zjs/icm/,配套 PPD 里的 ICM/色彩选项会自动挂上它。
  2. 打印测试页验证:CUPS Web 界面 → Printers → CP1025 → Maintenance → Print Test Page。
  3. 如果颜色仍不满意,在 CUPS Web 界面的「Set Default Options → Color」里调 ColorModel(RGB/CMYK)和 ICM 选项,逐项对比测试页。
  4. 若发行版包驱动的 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
2
3
4
5
6
7
8
9
10
11
sudo tee /etc/systemd/system/cups-raw9100.socket <<'EOF'
[Unit]
Description=Raw 9100 Print Socket (JetDirect style)

[Socket]
ListenStream=9100
Accept=yes

[Install]
WantedBy=sockets.target
EOF
1
2
3
4
5
6
7
8
9
10
sudo tee /etc/systemd/system/cups-raw9100@.service <<'EOF'
[Unit]
Description=Forward raw 9100 job to CUPS queue

[Service]
ExecStart=/usr/bin/lp -d HP_LaserJet_CP1025 -o raw
StandardInput=socket
User=lp
Group=lp
EOF

关键:-o raw 告诉 CUPS 不再过滤(Windows 驱动已渲染成打印机语言),纯排队透传。

2.3 启用与验证

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable --now cups-raw9100.socket
ss -ant | grep :9100

防火墙(如装了 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
2
3
4
5
6
7
8
9
10
11
12
sudo tee /etc/systemd/system/cups-lpd.socket <<'EOF'
[Unit]
Description=CUPS LPD Server Socket
PartOf=cups-lpd.service

[Socket]
ListenStream=515
Accept=yes

[Install]
WantedBy=sockets.target
EOF
1
2
3
4
5
6
7
8
9
10
11
sudo tee /etc/systemd/system/cups-lpd@.service <<'EOF'
[Unit]
Description=CUPS LPD Server Service
After=network.target

[Service]
ExecStart=-/usr/lib/cups/daemon/cups-lpd -n -o job-sheets=none,none -o document-format=application/octet-stream
StandardInput=socket
User=lp
Group=lp
EOF

参数说明:-n 跳过反向 DNS;document-format=application/octet-stream 强制自动检测格式(官方推荐)。

3.3 启用与验证

1
2
3
4
sudo systemctl daemon-reload
sudo systemctl enable --now cups-lpd.socket
systemctl status cups-lpd.socket
ss -ant | grep :515 # 应看到 0.0.0.0:515 LISTEN

防火墙(如装了 ufw):sudo ufw allow 515/tcp

3.4 Windows 11 客户端

  1. 安装可选功能:设置 → 应用 → 可选功能 → 查看功能 → 搜索 “LPR 端口监视器”(LPR Port Monitor)→ 安装(已 deprecated,未来 Windows 版本可能移除);
  2. 设置 → 打印机和扫描仪 → 添加设备 → 手动添加 → 使用 TCP/IP 地址或主机名添加;
  3. 地址填树莓派固定 IP,取消”查询打印机并自动选择驱动”;
  4. 协议选 LPR,队列名填 HP_LaserJet_CP1025;
  5. 装 HP CP1025 厂商驱动(Windows 本地渲染,只发指令流,这是快的原因);
  6. 打印机属性 → 端口 → 配置端口:**取消”启用 SNMP 状态”**;如打印截断再勾”LPR 字节计数”。

冲突说明

  • 515 / 631 / 9100 端口互不占用;三个 socket 单元均为按需拉起,平时零开销;
  • 所有任务汇入同一 CUPS 队列,cupsd 串行调度,三通道同时来任务也只会顺序打印;
  • lp 命令非旁路,与 cups-lpd 内部路径一致(客户端 → IPP → cupsd → 队列)。

附:IPP 通道关闭 TLS(解决 https 慢 + Windows 发现成 https)

/etc/cups/cupsd.conf:

1
2
DefaultEncryption Never
CreateSelfSignedCerts Off
1
2
3
sudo rm -f /etc/cups/ssl/RPIPD.*
sudo systemctl restart cups
avahi-browse -art | grep -i ipps # 应无输出

CUPS HTTPS 慢的根因:cupsd 在客户端名与证书 CN 不匹配时现场重新生成 RSA 证书(树莓派上数秒级阻塞),叠加 RFC 2817 Upgrade 协商与 DNS 解析超时。

Windows 手动添加 IPP 的坑:不要用”按名称选择共享打印机”+http://URL(会建成上古"Web 打印机”/Internet Printing Client)。正确做法:手动添加时设备类型选 **”IPP 设备”**,或 PowerShell:

1
2
Add-PrinterPort -Name "IPP_RPIPD" -PrinterHostAddress "192.168.x.x" -PortType IPP
Add-Printer -Name "RPi-IPP" -PortName "IPP_RPIPD" -DriverName "Microsoft IPP Class Driver"

验证:Get-Printer | Select Name, DriverName 应显示 Microsoft IPP Class Driver。