Linux系统上同时打印到物理打印机并生成PDF副本方法研究

Linux 系统上,想要同时打印到物理打印机并生成 PDF 副本 ,可以使用 CUPS(通用 Unix 打印系统)虚拟 PDF 打印机 结合的方式。以下是几种可行的方案:


方法 1:使用 CUPS 设置多个打印机(物理+PDF)

CUPS(Common Unix Printing System)是 Linux 默认的打印服务,支持同时向多个打印机发送任务。

步骤

  1. 安装 CUPS(如果未安装)

    在大多数 Linux 发行版上,CUPS 默认已安装。如果没有,可以用以下命令安装:

    复制代码
    sudo apt update && sudo apt install cups cups-pdf 

    或(RedHat 系):

    复制代码
    sudo yum install cups cups-pdf 
  2. 启用 CUPS 并设置开机启动

    复制代码
    sudo systemctl enable cups sudo systemctl start cups 
  3. 添加虚拟 PDF 打印机

    复制代码
    lpadmin -p PDFPrinter -E -v cups-pdf:/ -m generic.ppd 
  4. 添加物理打印机 (假设打印机名为 HP_LaserJet):

    复制代码
    lpadmin -p HP_LaserJet -E -v ipp://192.168.1.100/ipp -m everywhere 
  5. 创建 CUPS 打印类

    • CUPS 支持打印类(Printer Class),它允许一个打印任务被同时发送到多个打印机。

      lpadmin -p MultiPrint -E -o printer-is-shared=true -v cups-pdf:/ -v ipp://192.168.1.100/ipp

  6. 设置默认打印机为"MultiPrint"

    复制代码
    lpoptions -d MultiPrint 
  7. 打印测试

    复制代码
    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 文件并打印。

  1. 安装 CUPS-PDF

    复制代码
    sudo apt install cups-pdf 
  2. 启动 CUPS 服务

    复制代码
    sudo systemctl start cups 
  3. 检查是否已添加 CUPS-PDF

    复制代码
    lpstat -p 

    如果 CUPS-PDF 不存在,可以手动添加:

    复制代码
    lpadmin -p PDFPrinter -E -v cups-pdf:/ -m generic.ppd 
  4. 同时打印到多个目标

    复制代码
    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:

  1. 创建 systemd 监听脚本

    复制代码
    sudo nano /etc/systemd/system/printbackup.service 
  2. 写入以下内容

    复制代码
    [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 
  3. 启用并启动服务

    复制代码
    sudo systemctl enable printbackup 
    sudo systemctl start printbackup 

效果

  • 每当有打印任务时,/var/spool/cups 目录中的打印任务会被复制到 /path/to/backup/,作为 PDF 副本保存。

总结

方法 适用情况 自动化程度
CUPS 打印类 多台打印机(包括 PDF) ✅ 完全自动
lpr 手动打印 适用于小型任务 ❌ 需手动
CUPS-PDF + lp 适用于有 PDF 需求的用户 ✅ 自动化
手动复制 PDF 适用于文件备份 ❌ 需手动
systemd 监控打印队列 适用于后台自动备份 ✅ 完全自动

如果你希望完全自动化,推荐:

  1. 使用 CUPS 打印类(方法 1)
  2. 使用 systemd 自动监听(方法 5)

如果只是偶尔打印,可以用:

  • lpr 命令手动打印(方法 2)
  • CUPS-PDF 生成 PDF(方法 3)
相关推荐
wuicer11 分钟前
ubuntu 20.04 安装anaconda以及安装spyder
linux·运维·ubuntu
加班是不可能的,除非双倍日工资14 分钟前
css预编译器实现星空背景图
前端·css·vue3
wyiyiyi1 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
gnip1 小时前
vite和webpack打包结构控制
前端·javascript
excel2 小时前
在二维 Canvas 中模拟三角形绕 X、Y 轴旋转
前端
cui__OaO2 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
小狗爱吃黄桃罐头2 小时前
正点原子【第四期】Linux之驱动开发篇学习笔记-1.1 Linux驱动开发与裸机开发的区别
linux·驱动开发·学习
阿华的代码王国2 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
一条上岸小咸鱼2 小时前
Kotlin 基本数据类型(三):Booleans、Characters
android·前端·kotlin
Jimmy2 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程