在 Linux 系统上,想要同时打印到物理打印机并生成 PDF 副本 ,可以使用 CUPS(通用 Unix 打印系统) 和 虚拟 PDF 打印机 结合的方式。以下是几种可行的方案:
方法 1:使用 CUPS 设置多个打印机(物理+PDF)
CUPS(Common Unix Printing System)是 Linux 默认的打印服务,支持同时向多个打印机发送任务。
步骤
-
安装 CUPS(如果未安装)
在大多数 Linux 发行版上,CUPS 默认已安装。如果没有,可以用以下命令安装:
sudo apt update && sudo apt install cups cups-pdf
或(RedHat 系):
sudo yum install cups cups-pdf
-
启用 CUPS 并设置开机启动
sudo systemctl enable cups sudo systemctl start cups
-
添加虚拟 PDF 打印机
lpadmin -p PDFPrinter -E -v cups-pdf:/ -m generic.ppd
-
添加物理打印机 (假设打印机名为
HP_LaserJet
):lpadmin -p HP_LaserJet -E -v ipp://192.168.1.100/ipp -m everywhere
-
创建 CUPS 打印类
-
CUPS 支持打印类(Printer Class),它允许一个打印任务被同时发送到多个打印机。
lpadmin -p MultiPrint -E -o printer-is-shared=true -v cups-pdf:/ -v ipp://192.168.1.100/ipp
-
-
设置默认打印机为"MultiPrint"
lpoptions -d MultiPrint
-
打印测试
lp /path/to/testfile.pdf
效果:
- 文档会被同时发送到HP_LaserJet 物理打印机 和PDF 虚拟打印机。
- 生成的 PDF 默认存放在
/var/spool/cups-pdf/USERNAME/
目录下。
方法 2:使用 lpr
命令同时打印
你可以使用 lpr
命令同时将文件发送到多个打印机:
lpr -P HP_LaserJet file.pdf
lpr -P PDFPrinter file.pdf
可以把它写入 Shell 脚本,使其自动执行:
#!/bin/bash
FILE="/path/to/document.pdf"
lpr -P HP_LaserJet "$FILE"
lpr -P PDFPrinter "$FILE"
然后赋予执行权限并运行:
chmod +x print_to_multiple.sh
./print_to_multiple.sh
适用场景:
- 适用于需要批量打印并生成 PDF 副本的情况。
方法 3:使用 CUPS-PDF
+ lp
命令
CUPS 提供了一个 CUPS-PDF
过滤器,可以自动生成 PDF 文件并打印。
-
安装 CUPS-PDF
sudo apt install cups-pdf
-
启动 CUPS 服务
sudo systemctl start cups
-
检查是否已添加
CUPS-PDF
lpstat -p
如果
CUPS-PDF
不存在,可以手动添加:lpadmin -p PDFPrinter -E -v cups-pdf:/ -m generic.ppd
-
同时打印到多个目标
lp -d HP_LaserJet /path/to/document.pdf lp -d PDFPrinter /path/to/document.pdf
默认 PDF 存放路径:
- Ubuntu/Debian:
~/PDF/
- RedHat 系:
/var/spool/cups-pdf/$USER/
方法 4:使用 pdftopdf
+ lp
自动备份
如果你已经有 PDF 文件,并且希望在打印时自动生成副本,可以手动复制文件:
FILE="/path/to/document.pdf"
cp "$FILE" "/path/to/backup/"
lp -d HP_LaserJet "$FILE"
适用场景:
- 适用于简单备份,无需虚拟打印机。
方法 5:使用 systemd
监视 /var/spool/cups
自动备份
如果你的打印机自动将任务缓存到 /var/spool/cups
,可以用 systemd
监听文件夹并自动备份 PDF:
-
创建 systemd 监听脚本
sudo nano /etc/systemd/system/printbackup.service
-
写入以下内容
[Unit] Description=Monitor CUPS Print Queue and Save Copies After=cups.service [Service] ExecStart=/bin/bash -c 'cp /var/spool/cups/d* /path/to/backup/' Restart=always [Install] WantedBy=multi-user.target
-
启用并启动服务
sudo systemctl enable printbackup sudo systemctl start printbackup
效果:
- 每当有打印任务时,
/var/spool/cups
目录中的打印任务会被复制到/path/to/backup/
,作为 PDF 副本保存。
总结
方法 | 适用情况 | 自动化程度 |
---|---|---|
CUPS 打印类 | 多台打印机(包括 PDF) | ✅ 完全自动 |
lpr 手动打印 | 适用于小型任务 | ❌ 需手动 |
CUPS-PDF + lp | 适用于有 PDF 需求的用户 | ✅ 自动化 |
手动复制 PDF | 适用于文件备份 | ❌ 需手动 |
systemd 监控打印队列 | 适用于后台自动备份 | ✅ 完全自动 |
如果你希望完全自动化,推荐:
- 使用 CUPS 打印类(方法 1)
- 使用
systemd
自动监听(方法 5)
如果只是偶尔打印,可以用:
lpr
命令手动打印(方法 2)- CUPS-PDF 生成 PDF(方法 3)