CUPS
CUPS 是由 OpenPrinting 开发的,基于标准的开源打印系统,适用于 Linux® 和其他类 Unix® 操作系统。
Arch Linux 打包的是 OpenPrinting CUPS 分支,而不是 Apple CUPS 分支。
安装
如果打算“打印”到 PDF 文档,可以选择性地安装 cups-pdf 包。默认情况下,PDF 文件存储在 /var/spool/cups-pdf/username/。可以在 /etc/cups/cups-pdf.conf 中更改位置。
然后启用并启动 cups.service,或者选择使用套接字激活,仅在程序需要使用该服务时才启动 CUPS。
打印步骤
了解 CUPS 的工作原理对于解决相关问题至关重要。
- 当选择“打印”时,应用程序会将 PDF 文件发送到 CUPS(如果应用程序发送的是其他格式,则会先转换为 PDF)。
- 然后,CUPS 会查看打印机的 PPD 文件(打印机描述文件),并确定需要使用哪些过滤器将 PDF 文件转换为打印机可以理解的语言(如 PJL、PCL、位图或原生 PDF)。
- 过滤器会将 PDF 文件转换为打印机可以理解的格式。
- 然后将其发送到后端。例如,如果打印机连接到 USB 端口,则使用 USB 后端。
连接接口
下面列出了针对各种连接接口的打印机检测的附加步骤。
USB
要查看您的 USB 打印机是否被检测到,请确保已安装 usbutils 包,然后
$ lsusb
(...) Bus 001 Device 007: ID 03f0:1004 Hewlett-Packard DeskJet 970c/970cse
并行端口
要使用并行端口打印机,需要 lp、parport 和 parport_pc 内核模块。
# dmesg | grep -i parport
parport0: Printer, Hewlett-Packard HP LaserJet 2100 Series lp0: using parport0 (polling)
网络
添加已知位置打印机
当打印机的地址已知时(例如通过打印机显示屏或其他网络扫描方法获得),不需要依赖于网络上的动态打印机发现(DNS-SD/mDNS)。可以为使用该打印机直接添加 CUPS 队列。使用 lpadmin 添加队列的文档可以在以下各节以及官方文档 设置打印机 中找到。
打印机发现
要发现、使用发现或共享的网络打印机,请使用 DNS-SD/mDNS,使用 .local 主机名解析配合 Avahi 进行设置,然后重启 cups.service。
avahi-daemon.service 来进行 SD(服务发现)本身。要与 Samba 共享打印机,例如,如果系统要充当 Windows 客户端的打印服务器,则需要 samba 包。
打印机驱动程序
大多数较新的打印机(2010 年以后)通过实现 AirPrint 和/或 IPP_Everywhere(参见下方)支持无驱动程序使用。
打印机的驱动程序可能来自以下任何来源。请参阅 CUPS/Printer-specific problems 以获取其他人设法使其正常工作的驱动程序的非完整列表。
要驱动打印机,CUPS 需要一个 PPD 文件,并且对于大多数打印机,还需要一些 过滤器。有关 CUPS 如何使用 PPD 和过滤器的详细信息,请参阅 [1]。
OpenPrinting 打印机列表提供了许多打印机的驱动程序建议。它还为每台打印机提供 PPD 文件,但大多数都可以通过 foomatic 或推荐的驱动程序包获得。
当向 CUPS 提供 PPD 文件时,CUPS 服务器将重新生成 PPD 文件并将其保存在 /etc/cups/ppd/ 中。
为了在创建 PKGBUILD 之前测试其是否工作,可以将 PPD 文件手动添加到 /usr/share/cups/model,在下次重启 cups 服务后即可使用该驱动程序。
AirPrint 和 IPP Everywhere
CUPS 支持 AirPrint 和 IPP Everywhere 打印机。如果 avahi-daemon.service 正在运行,这些打印机应该会自动发现,无需额外配置。
在 CUPS README 中描述了如何安装 IPP Everywhere 打印机。可以使用 lpadmin 命令完成。
示例
# lpadmin -p MyPrinter -E -v "ipp://11.22.33.44/ipp/print" -m everywhere
-p 选项指定打印机名称。-E 选项启用打印机并立即接受新的打印作业。-v 选项指定打印机的设备 URI,它告诉 CUPS 如何与打印机通信。-m 选项指定要使用的型号(驱动程序),在这种情况下是 IPP Everywhere(“everywhere”)驱动程序,它也用于 AirPrint 和 IPP Everywhere 打印机以及共享打印机和通过打印机应用程序支持的打印机。
可以使用 lpinfo -v 命令找到 USB 或网络设备 URI。
OpenPrinting CUPS 过滤器
Linux 基金会的 OpenPrinting 工作组提供了 cups-filters。这些是曾经属于 CUPS 但已被该项目删除的后端、过滤器和其他二进制文件。它们在 cups-filters 包中可用,该包是 cups 的依赖项。
非 PDF 打印机需要安装 ghostscript。对于 PostScript 打印机,可能还需要 gsfonts。
Foomatic
Linux 基金会的 OpenPrinting 工作组的 foomatic 为许多打印机驱动程序(包括免费和非免费的)提供了 PPD。有关 foomatic 功能的更多信息,请参阅 Foomatic from the Developer's View。
要使用 foomatic,请安装 foomatic-db-engine 以及以下至少一项:
- foomatic-db — 一组 XML 文件,foomatic-db-engine 使用这些文件生成 PPD 文件。
- foomatic-db-ppds — 预构建的 PPD 文件。
- foomatic-db-nonfree — 一组来自具有非免费许可证的打印机制造商的 XML 文件,foomatic-db-engine 使用这些文件生成 PPD 文件。
- foomatic-db-nonfree-ppds — 具有非免费许可证的预构建 PPD 文件。
foomatic PPD 可能需要额外的过滤器,例如 min12xxwAUR。
Gutenprint
Gutenprint 项目提供了用于 Canon、Epson、Lexmark、Sony、Olympus、Brother、HP、Ricoh、PCL 打印机以及一些通用打印机的驱动程序,供 CUPS 和 GIMP 使用。
安装 gutenprint 和 foomatic-db-gutenprint-ppds。
cups-genppdupdate 并重启 CUPS。cups-genppdupdate 将更新已配置打印机的 PPD 文件,有关详细信息,请参阅 cups-genppdupdate(8)。制造商特定驱动程序
许多打印机制造商提供自己的 Linux 驱动程序。这些通常在官方 Arch 存储库或 AUR 中提供。
其中一些驱动程序在 CUPS/Printer-specific problems 中有更详细的描述。
打印机 URI
以下列出了如果需要,手动生成 URI 的附加步骤。某些打印机或驱动程序可能需要一个特殊的 URI,具体请参阅 CUPS/Printer-specific problems。
USB
CUPS 应该能够自动为 USB 打印机生成 URI,例如 usb://HP/DESKJET%20940C?serial=CN16E6C364BH。
如果不能,请参阅 CUPS/Troubleshooting#USB printers 进行故障排除。
并行端口
URI 应采用 parallel:device 的形式。例如,如果打印机连接在 /dev/lp0 上,请使用 parallel:/dev/lp0。如果使用 USB 转并行端口适配器,请使用 parallel:/dev/usb/lp0 作为打印机 URI。
网络
如果您已按照 #Network 中的说明设置了 Avahi,CUPS 应该能检测到打印机 URI。您还可以使用 avahi-discover 来查找打印机的名称及其地址(例如,BRN30055C6B4C7A.local/10.10.0.155:631)。
也可以在不使用 Avahi 的情况下手动生成 URI。可在 CUPS 文档中找到网络打印机的可用 URI 方案列表。由于 URI 的具体细节因打印机而异,请查阅打印机手册或 CUPS/Printer-specific problems。
SMB 共享上的打印机 URI 在 smbspool(8) 手册页中有描述。
lpadmin: Bad device-uri 错误。例如,smb://BEN-DESKTOP/HP Color LaserJet CP1510 series PCL6 将变成 smb://BEN-DESKTOP/HP%20Color%20LaserJet%20CP1510%20series%20PCL6。
可以通过运行以下命令获得此结果字符串
$ python -c 'from urllib.parse import quote; print("smb://" + quote("BEN-DESKTOP/HP Color LaserJet CP1510 series PCL6"))'
可以通过 URI 形式 ipp://hostname:631/printers/queue_name 访问远程 CUPS 打印服务器。有关设置远程打印服务器的详细信息,请参阅 CUPS/Printer sharing#Printer sharing。
有关其他问题和解决方案,请参阅 CUPS/Troubleshooting#Networking issues。
用法
CUPS 可以通过 lp* 和 cups* 命令行工具完全控制。或者,可以使用 #Web 界面 或几个 #GUI 应用程序 中的一个。
- 队列名称是在系统上用于标识队列的简短但具有描述性的名称。此名称不应包含空格或任何特殊字符。例如,与 HP LaserJet 5P 对应的打印队列可以命名为“hpljet5p”。每个物理打印机可以关联一个以上的队列。
- 位置是打印机物理位置的描述(例如,“卧室”或“厨房”)。这是为了帮助维护多个打印机。
- 描述是打印队列的完整描述。常见用法是完整的打印机名称(如“HP LaserJet 5P”)。
命令行工具
有关命令行工具的更多技巧,请参阅 CUPS 本地文档。
使用 SNMP 查找 URI
$ /usr/lib/cups/backend/snmp ip_address
lp*
lpstat 命令。lpinfo 命令使用 -v 标志列出连接到您系统的打印机的 URI,并使用 -m 标志列出您系统上安装的所有可用驱动程序(或 CUPS 术语中的“型号”)。
lpadmin 工具使用 -p queue_name 创建新队列。添加到 -p 的 -E 标志将启用打印机并接受作业。-v 标志指定设备 URI。-m 标志指定要使用的驱动程序(或 CUPS 术语中的“型号”)或 PPD 文件。
您还可以使用 -x 标志删除打印机(请先阅读 #cups*)。
示例
# lpadmin -p HP_DESKJET_940C -E -v "usb://HP/DESKJET%20940C?serial=CN16E6C364BH" -m drv:///HP/hp-deskjet_940c.ppd.gz
对于无驱动程序队列(Apple AirPrint 或 IPP Everywhere)
# lpadmin -p AirPrint -E -v "ipp://10.0.1.25/ipp/print" -m everywhere
对于原始队列;无 PPD 或过滤器
# lpadmin -p SHARED_PRINTER -m raw
指定 PPD 而不是型号时
# lpadmin -p Test_Printer -E -v "ipp://10.0.1.3/ipp/print" -m pxlmono.ppd
- 指定 PPD 时,只需使用文件名而不是完整路径(例如,
pxlmono.ppd而不是/usr/share/ppd/cupsfilters/pxlmono.ppd)。或者,可以使用完整路径配合-P命令行开关。 - 截至 2021 年,许多较新的打印机支持无驱动程序打印设置,并且当如上面的第二个示例那样指定
-m everywhere时,打印机将被定义,并且通过查询网络上的打印机,会在/etc/cups/ppd/中创建一个 .ppd 文件。
lpq 工具检查队列。添加 -a 标志以检查所有队列。
lprm 工具清除队列。默认情况下,添加 - 而不是仅删除最后一个条目,以删除所有条目。
lpr 工具进行打印。使用 -# N 打印文件 N 次,使用 -p 标志添加标题。
使用 lpr 进行测试打印的示例
$ lpr /usr/share/cups/data/testprint $ echo 'Hello, world!' | lpr -p
lpstat 工具,配合 -s 标志,检查状态。-p 标志允许指定要检查的队列。
lpoptions 工具使用与上面所示的 lpadmin 相同的 -p queue_name 标志。使用 -l 标志,它列出选项。-d 标志将默认打印机设置为参数 queue_name。-o 标志将选项设置为一个值
$ lpoptions -p HP_DESKJET_940C -o PageSize=A4 $ lpoptions -p HP_DESKJET_940C -o cupsIPPSupplies=true -o Duplex=DuplexNoTumble
cups*
cupsaccept、cupsdisable、cupsenable 和 cupsreject 工具按名称执行操作。分别:将打印机设置为接受作业、禁用打印机、激活打印机、将打印机设置为拒绝所有传入任务。
作为其用法示例,我们将干净地删除一个打印机
# cupsreject queue_name # cupsdisable queue_name # lpadmin -x queue_name
ink
将您的用户添加到额外的 lp 用户组,注销并重新登录。
有关用法信息,请运行不带选项的 ink。
Web 界面
CUPS 服务器可以通过 Web 界面完全管理,该界面可在 https://:631/ 访问。
要从 Web 界面执行管理任务,需要进行身份验证;请参阅 #Permissions。
- 添加队列
转到管理页面。
- 修改现有队列
转到打印机页面,然后选择要修改的队列。
- 测试队列
转到打印机页面,然后选择一个队列。
GUI 应用程序
如果您的用户没有足够的权限来管理 CUPS,应用程序将在启动时请求 root 密码。要授予用户管理权限而无需 root 访问权限,请参阅 #Configuration。
- Deepin Print Manager — Deepin 桌面的打印机配置界面。
- GtkLP — CUPS 的 GTK 界面。
- https://gtklp.sirtobi.com/index.shtml[链接已死 2025-11-16—HTTP 404] || gtklpAUR
- print-manager — 用于管理打印作业和打印机的工具(KDE)。
- system-config-printer — GTK 打印机配置工具和状态小程序。
配置
CUPS 服务器的配置位于 /etc/cups/cupsd.conf 和 /etc/cups/cups-files.conf(请参阅 cupsd.conf(5) 和 cups-files.conf(5))。编辑任一文件后,请重启 cups.service 以应用任何更改。默认配置对大多数用户来说已足够。
权限
用户组
在 /etc/cups/cups-files.conf 的 SystemGroup 中定义了具有打印机管理权限的用户组。默认情况下使用 sys、root 和 wheel 组。
CUPS 辅助程序以 cups 用户和组身份运行。这允许辅助程序访问打印机设备并读取 /etc/cups/ 中的配置文件,这些文件属于 cups 组。
lp 组。升级后,/etc/cups 中的文件应归 cups 组所有,并在 /etc/cups/cups-files.conf 中设置 User 209 和 Group 209。通过 PolicyKit 允许管理员认证
PolicyKit 可以配置为允许用户使用 GUI 配置打印机而无需管理员密码。
以下是一个示例,允许 wheel 用户组的成员无需密码即可管理打印机。
/etc/polkit-1/rules.d/49-allow-passwordless-printer-admin.rules
polkit.addRule(function(action, subject) {
if (action.id == "org.opensuse.cupspkhelper.mechanism.all-edit" &&
subject.isInGroup("wheel")){
return polkit.Result.YES;
}
});
默认纸张尺寸
cups 是通过支持 libpaper 构建的,libpaper 默认使用 Letter 纸张尺寸(在 lpoptions 中称为 PageSize)。为避免为添加的每个打印队列都要更改纸张尺寸,请编辑 /etc/papersize 并设置您的系统默认纸张尺寸。请参阅 paper(1)。
存档 PDF/A
将 PDF 文件保存为高度兼容的格式,通常称为存档 PDF、PDF/A、PDFA 或 ISO 19005。
目前没有选项,因此必须将其添加到 cups 调用 gs 时使用的命令中。
/etc/cups/cups.conf
# GSCall %s -q -dCompatibilityLevel=%s -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -sOutputFile="%s" -dAutoRotatePages=/PageByPage -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dPDFSETTINGS=/prepress -c .setpdfwrite -f %s # the above line shows the default for the GSCall value. Add -dPDFA before -dNOPAUSE and remove the comment prefix: (do not copy the line from here as it might have changed. use the "default" from your own file) GSCall %s -q -dCompatibilityLevel=%s -dPDFA -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -sOutputFile="%s" -dAutoRotatePages=/PageByPage -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dPDFSETTINGS=/prepress -c .setpdfwrite -f %s
日志文件
默认情况下,所有日志都发送到 /var/log/cups/ 中的文件。
可以在 /etc/cups/cupsd.conf 中更改日志级别。请参阅 cupsd.conf 文档。
通过将 /etc/cups/cups-files.conf 中 AccessLog、ErrorLog 和 PageLog 指令的值更改为 syslog,可以将 CUPS 配置为记录到systemd journal。有关原始提议更改的信息,请参阅 Fedora:Changes/CupsJournalLogging。
cups-browsed
CUPS 可以使用 Avahi 浏览来发现网络中未知的共享打印机。这在服务器未知的复杂设置中可能很有用。要使用此功能,请设置 .local 主机名解析,然后启动 avahi-daemon.service 和 cups-browsed.service。作业直接发送到打印机,不经过任何处理,因此创建的队列可能无法工作,但是像支持 IPP Everywhere 或 AirPrint 的无驱动程序打印机应该可以开箱即用。
- 搜索网络打印机 可能会显着增加计算机启动所需的时间。
cups-browsed.service仅用于在打印机出现和消失时动态添加和删除网络打印机。如果您只想将支持 DNS-SD/mDNS 的网络打印机添加到 CUPS,则不需要它。
打印服务器和远程管理
请参阅 CUPS/Printer sharing 和 CUPS/Printer sharing#Remote administration。
无本地 CUPS 服务器
CUPS 可以配置为直接连接到远程打印服务器,而不是运行本地打印服务器。这需要安装 libcups 包。一些应用程序仍然需要 cups 包才能打印。
要使用远程 CUPS 服务器,请将 CUPS_SERVER 环境变量设置为 printerserver.mydomain:port。例如,如果您想为单个 Firefox 实例使用不同的打印服务器(请将 printserver.mydomain:port 替换为您的打印服务器名称/端口)
$ CUPS_SERVER=printserver.mydomain:port firefox
要使此配置永久生效,请创建配置文件 /etc/cups/client.conf,并在其中添加远程 CUPS 服务器的主机名。
ServerName server
您还可以指定自定义端口
ServerName server:port
有关详细信息,请参阅 [4]。
故障排除
请参阅 CUPS/Troubleshooting 和 CUPS/Printer-specific problems。
参见
- 官方 CUPS 文档,本地安装
- Wikipedia:CUPS
- OpenPrinting 主页
- OpenSuSE Concepts printing guide - 解释了完整的打印工作流程
- OpenSuSE CUPS in a Nutshell - CUPS 快速概述
- Gentoo:Printing
- Debian 的打印门户 - 详细的技术指南
- Debian 的打印概述 - CUPS 打印系统的基本视图
- CUPS printing-architecture 和 printing-users 邮件列表
- CUPS 邮件列表(Apple 分支)[链接已死 2025-11-16—HTTP 404]
- CUPS 问题跟踪器
- CUPS 问题跟踪器(Apple 分支)