一文详解 Linux下的开源打印系统CUPS(Common UNIX Printing System)

文章目录

  • 前言
  • [一、CUPS 简介](#一、CUPS 简介)
  • [二、CUPS 常用指令解析](#二、CUPS 常用指令解析)
    • [2.1 安装 CUPS](#2.1 安装 CUPS)
    • [2.2 启动/重启服务](#2.2 启动/重启服务)
    • [2.3 添加打印机(核心操作)](#2.3 添加打印机(核心操作))
    • [2.4 设置默认打印机](#2.4 设置默认打印机)
    • [2.5 打印文件](#2.5 打印文件)
    • [2.6 查看打印任务](#2.6 查看打印任务)
    • [2.7 取消打印任务](#2.7 取消打印任务)
    • [2.8 查看、移除已添加的打印机](#2.8 查看、移除已添加的打印机)
  • 三、调试与常见问题
    • [3.1 日志查看](#3.1 日志查看)
    • [3.2 驱动问题](#3.2 驱动问题)
    • [3.3 权限问题](#3.3 权限问题)
  • 四、注意事项

前言

本文基于Orange Pi CM4介绍了Linux下的开源打印系统CUPS(Common UNIX Printing System),文章内容涵盖CUPS的核心功能与常用操作指令解析,助力快速实现Linux系统打印功能的开发。


一、CUPS 简介

CUPS(Common UNIX Printing System)是 Linux/UNIX 系统下的开源打印系统。其通过IPP协议实现跨平台的打印任务管理,提供了队列调度、驱动兼容及多设备并行控制的功能。开发者可通过命令行操作或者Web界面快速配置打印机、监控任务状态并支持PDF/图像等格式解析,大大简化了打印功能的集成流程。

核心特性:

  • 支持本地和网络打印机(USB/Socket)
  • 提供 Web 管理界面(端口 631)
  • 兼容多种打印协议(IPP、Socket、USB)
  • 支持 PDF/PostScript/图像等格式转换
  • 提供 API 供开发者集成

CUPS 架构:

  • Scheduler(cupsd):核心守护进程,管理打印队列和任务分发。
  • Filters:格式转换模块(如 PDF 转 PostScript)。
  • Backends:与物理打印机通信的驱动接口。

二、CUPS 常用指令解析

2.1 安装 CUPS

bash 复制代码
sudo apt update
sudo apt install cups

2.2 启动/重启服务

bash 复制代码
sudo systemctl start cups    # 启动
sudo systemctl restart cups  # 重启

2.3 添加打印机(核心操作)

(1) 命令行添加(推荐)

基本语法:

bash 复制代码
sudo lpadmin -p [打印机名称] -v [设备URI] -m [驱动] -E

输出示例:

bash 复制代码
sudo lpadmin -p HP_LaserJet-v "ipp://192.168.1.100/ipp/print" -m everywhere -E

参数说明:

  • -p:指定打印机名称(自定义打印机名称,如 HP_LaserJet,建议用英文/数字,避免空格)。
  • -v:打印机设备地址(URI),取决于连接方式(如WiFi/USB/网络等)请看下文。
  • -m:指定打印机的驱动(PPD 文件)(或使用 -m everywhere 自动选择 IPP Everywhere 通用驱动)。
  • -E: 启用打印机。

设备 URI 是打印机的物理或网络地址,具体的格式取决于连接协议:

连接类型 URI 格式 示例 适用场景
IPP 协议 ipp://<IP地址>/ipp/print ipp://192.168.1.100/ipp/print 支持 IPP 的现代网络打印机
Socket socket://<IP地址>:<端口> socket://192.168.1.100:9100 传统网络打印机(如 HP JetDirect)
USB usb://<制造商>/<型号>?serial=XXX usb://HP/Deskjet-2130?serial=1234 直接连接的 USB 打印机
LPD lpd://<IP地址>/<队列名> lpd://192.168.1.100/LPT1 支持 LPD 协议的旧打印机

驱动选择:

驱动类型 参数示例 说明
通用驱动 -m everywhere 适用于大多数打印机,支持基础功能(推荐优先尝试)
厂商专用驱动 -m hp-laserjet.ppd 需提前安装驱动包(如 printer-driver-hpcups)
自定义 PPD 文件 -m /path/to/driver.ppd 手动指定驱动文件路径(需提前下载或生成)

(2) Web界面添加

你可以通过浏览器访问CUPS的Web管理界面,在CUPS配置页面将打印机添加到系统中:

  • 打开浏览器,输入 http://localhost:631 访问CUPS管理界面。
  • 选择 Administration。
  • 选择 Add Printer,在系统会显示网络中可用的打印机。
  • 选择你的打印机(根据打印机名称,如CanonCP910)。
  • 输入打印机的IP地址(192.168.176.236)并选择协议。通常选择 IPP 或 LPD。
  • 选择对应的打印机型号,或者手动下载并安装Canon的驱动程序。

2.4 设置默认打印机

CUPS提供了两种设置默认打印机的方法,分别是用户级别的 lpoptions 和系统级别的 lpadmin。

(1) lpoptions -d(用户级默认打印机)

基本语法:

bash 复制代码
lpoptions -d <打印机名称>
  • 功能:用于查看或设置用户级别的打印选项,包括默认打印机、纸张大小、打印质量等。
  • 用户级配置:设置保存在当前用户的 ~/.cups/lpoptions 文件中,仅对当前用户生效。
  • 无需管理员权限:普通用户可以直接使用,无需 sudo。

(2) lpadmin -d(系统级默认打印机)

基本语法:

bash 复制代码
sudo lpadmin -d <打印机名称>
  • 作用范围:设置系统全局默认打印机(影响所有未设置用户级默认的用户)。
  • 权限要求:需要管理员权限,需使用 sudo。

2.5 打印文件

基本语法:

bash 复制代码
lp [选项] <文件路径>

常用选项:

选项 作用
-d <打印机名称> 指定目标打印机(覆盖默认打印机)
-n <份数> 设置打印份数(例如 -n 2)
-o landscape 横向打印
-o media=A4 指定纸张大小(如 A4)
-o fit-to-page 自动缩放内容适应纸张

2.6 查看打印任务

(1) 列出所有打印队列中的任务:

bash 复制代码
lpstat -o

输出示例:

bash 复制代码
root@orangepicm4:~/jeff/orthocone-qt/build# lpstat -o
HPB0227A57280A-71       root            583680   Tue 29 Apr 2025 08:22:21 AM UTC
HPB0227A57280A-72       root            601088   Tue 29 Apr 2025 08:22:34 AM UTC
root@orangepicm4:~/jeff/orthocone-qt/build#

(2) 查看特定打印机的任务:

bash 复制代码
lpstat -o -P <打印机名称>

(3) 查看更详细的任务信息:

bash 复制代码
lpq -a

2.7 取消打印任务

(1) 取消单个任务:

bash 复制代码
cancel <任务ID>

输出示例:

bash 复制代码
root@orangepicm4:~/jeff/orthocone-qt/build# lpstat -o
HPB0227A57280A-77       root            601088   Tue 29 Apr 2025 08:28:49 AM UTC
root@orangepicm4:~/jeff/orthocone-qt/build# cancel HPB0227A57280A-77

(2) 取消所有任务(需管理员权限):

bash 复制代码
sudo cancel -a

(3) 取消某用户的所有任务:

bash 复制代码
cancel -u <用户名>

2.8 查看、移除已添加的打印机

(1) 查看当前已添加的打印机:

bash 复制代码
lpstat -p

输出示例:

bash 复制代码
root@orangepicm4:~/jeff/orthocone-qt/build# lpstat -p
printer CP9101c8df3 is idle.  enabled since Tue 29 Apr 2025 02:34:41 AM UTC
printer HPB0227A57280A is idle.  enabled since Tue 29 Apr 2025 08:28:59 AM UTC

(2) 移除指定打印机:

bash 复制代码
sudo lpadmin -x PrinterName

输出示例:

bash 复制代码
#查看当前系统所有的打印机
root@orangepicm4:~/jeff/orthocone-qt/build# lpstat -p
printer CP9101c8df3 is idle.  enabled since Tue 29 Apr 2025 02:34:41 AM UTC
printer HPB0227A57280A is idle.  enabled since Tue 29 Apr 2025 08:28:59 AM UTC
#移除指定打印机
root@orangepicm4:~/jeff/orthocone-qt/build# lpadmin -x CP9101c8df3
root@orangepicm4:~/jeff/orthocone-qt/build# lpstat -p
printer HPB0227A57280A is idle.  enabled since Tue 29 Apr 2025 08:28:59 AM UTC
root@orangepicm4:~/jeff/orthocone-qt/build# lpadmin -x HPB0227A57280A
root@orangepicm4:~/jeff/orthocone-qt/build# lpstat -p
lpstat: No destinations added.
root@orangepicm4:~/jeff/orthocone-qt/build#

(3) 打印机搜索(扩展):

在 Linux 系统中,命令 avahi-browse -rt _ipp._tcp 用于通过零配置网络(Zeroconf/mDNS) 发现并列出局域网内所有支持 IPP(Internet Printing Protocol) 协议的打印机或其他打印服务,我们可以通过此命令来搜索网络中所有支持IPP协议的打印机。

命令/参数 作用
avahi-browse Avahi 工具的命令,用于在网络中浏览和发现服务(基于 mDNS/DNS-SD 协议)。
-r 解析详细信息(Resolve),显示服务的完整配置(如 IP、端口等)。
-t 单次扫描并退出(Terminate),不持续监听,仅执行一次扫描。
_ipp._tcp 指定目标服务类型为 IPP 协议(用于网络打印)。

输出示例:

bash 复制代码
root@orangepicm4:~/jeff/orthocone-qt/build# avahi-browse -rt _ipp._tcp
+  wlan0 IPv4 CanonCP910                                    Internet Printer     local
+  wlan0 IPv4 HPB0227A57280A (HP Laser MFP 131 133 135-138) Internet Printer     local
=  wlan0 IPv4 HPB0227A57280A (HP Laser MFP 131 133 135-138) Internet Printer     local
   hostname = [HPB0227A57280A.local]
   address = [192.168.8.124]
   port = [631]
   txt = ["mopria-certified=2.0" "Staple=F" "Sort=F" "Punch=0" "PaperCustom=T" "Duplex=F" "Copies=T" "Color=F" "Collate=F" "Bind=F" "URF=CP255,FN3,IFU0,IS1-2-19,MT1-2-3-4,OB10,PQ4,RS300,V1.4,W8" "PaperMax=legal-A4" "Scan=T" "Fax=F" "kind=document,envelope,label" "print_wfds=T" "UUID=16a65700-007c-1000-bb49-b0227a57280a" "MDL=HP Laser MFP 136w" "MFG=HP" "usb_CMD=MFG:HP;CMD:SPL,URF,FWV,PIC,RDS,AMPV,PWGRaster,EXT;PRN:4ZB86A;MDL:HP Laser MFP 131 133 135-138;CLS:PRINTER;CID:HPLJPCLMSMV1;MODE:SCN,SPL3,R000105;" "usb_MDL=HP Laser MFP 136w" "usb_MFG=HP" "adminurl=http://HPB0227A57280A.local./sws/index.html?link=/sws/app/settings/network/AirPrint/AirPrint.html" "pdl=application/octet-stream,application/x-QPDL,image/urf,application/PCLm" "product=(HP Laser MFP 136w)" "priority=51" "qtotal=1" "rp=ipp/print" "ty=HP Laser MFP 131 133 135-138" "note=" "txtvers=1"]
=  wlan0 IPv4 CanonCP910                                    Internet Printer     local
   hostname = [CP9101c8df3.local]
   address = [192.168.8.177]
   port = [631]
   txt = ["note=" "kind=photo" "URF=W8,SRGB24,V1.3,RS300,IS7,MT11,PQ4,OB9,IFU0,OFU0,CP99" "Staple=F" "Sort=F" "Scan=F" "Punch=F" "PaperMax=<legal-A4" "PaperCustom=T" "Fax=F" "Duplex=F" "Copies=T" "Color=T" "Collate=F" "Bind=F" "TBCP=F" "Binary=F" "Transparent=F" "UUID=4d701b50-0439-4af1-a33d-d8492f1c8df3" "usb_CMD=URF" "usb_MDL=CP910_ipp" "usb_MFG=Canon" "adminurl=http://CP9101c8df3.local:8008/index.html" "pdl=image/urf,image/jpeg,application/octet-stream" "product=(Canon CP910_ipp)" "ty=Canon CP910_ipp" "priority=50" "qtotal=1" "rp=ipp/print" "txtvers=1"]
root@orangepicm4:~/jeff/orthocone-qt/build#

三、调试与常见问题

3.1 日志查看

bash 复制代码
tail -f /var/log/cups/error_log  # 实时监控错误日志

3.2 驱动问题

若打印机未识别,尝试安装 printer-driver-* 软件包:

bash 复制代码
sudo apt install printer-driver-gutenprint

3.3 权限问题

确保用户属于 lpadmin 组:

bash 复制代码
sudo usermod -aG lpadmin $USER

四、注意事项

  • 网络打印机需开放端口:确保防火墙允许 631(IPP)或 9100(Socket)。
  • ARM 架构兼容性:部分厂商驱动可能不支持 aarch64,优先使用通用驱动。
相关推荐
Yana.nice1 小时前
openssl将证书从p7b转换为crt格式
java·linux
AI逐月1 小时前
tmux 常用命令总结:从入门到稳定使用的一篇实战博客
linux·服务器·ssh·php
小白跃升坊1 小时前
基于1Panel的AI运维
linux·运维·人工智能·ai大模型·教学·ai agent
跃渊Yuey2 小时前
【Linux】线程同步与互斥
linux·笔记
舰长1152 小时前
linux 实现文件共享的实现方式比较
linux·服务器·网络
切糕师学AI2 小时前
ARM 架构中的复位(Reset)与复位流程
arm开发·单片机·嵌入式·复位
zmjjdank1ng2 小时前
Linux 输出重定向
linux·运维
路由侠内网穿透.2 小时前
本地部署智能家居集成解决方案 ESPHome 并实现外部访问( Linux 版本)
linux·运维·服务器·网络协议·智能家居
梵刹古音2 小时前
【C语言】 格式控制符与输入输出函数
c语言·开发语言·嵌入式
VekiSon2 小时前
Linux内核驱动——基础概念与开发环境搭建
linux·运维·服务器·c语言·arm开发