跳转至内容

CUPS

来自 ArchWiki
(从 Foomatic 重定向而来)

CUPS 是由 OpenPrinting 开发的,基于标准的开源打印系统,适用于 Linux® 和其他类 Unix® 操作系统。

Arch Linux 打包的是 OpenPrinting CUPS 分支,而不是 Apple CUPS 分支

安装

安装 cups 包。

注意 由于 CUPS 中驱动程序已被弃用,转而支持 IPP Everywhere,您可能需要安装 cups-pdf 才能使打印正常工作。没有这个包,您可能会看到一个错误,如:client-error-document-format-not-supported。该包是必需的,因为 IPP Everywhere 直接将 PDF 发送到打印机,因此 cups-pdf 需要先将您想要打印的所有内容转换为 PDF。

如果打算“打印”到 PDF 文档,可以选择性地安装 cups-pdf 包。默认情况下,PDF 文件存储在 /var/spool/cups-pdf/username/。可以在 /etc/cups/cups-pdf.conf 中更改位置。

然后启用启动 cups.service,或者选择使用套接字激活,仅在程序需要使用该服务时才启动 CUPS。

本文章或章节需要扩充。

原因: 应提及可选的 ipp-usb,另请参阅 SANE#扫描仪驱动程序。(在 Talk:CUPS#CUPS printer drivers and backends are deprecated 中讨论)

了解 CUPS 的工作原理对于解决相关问题至关重要。

  1. 当选择“打印”时,应用程序会将 PDF 文件发送到 CUPS(如果应用程序发送的是其他格式,则会先转换为 PDF)。
  2. 然后,CUPS 会查看打印机的 PPD 文件(打印机描述文件),并确定需要使用哪些过滤器将 PDF 文件转换为打印机可以理解的语言(如 PJL、PCL、位图或原生 PDF)。
  3. 过滤器会将 PDF 文件转换为打印机可以理解的格式。
  4. 然后将其发送到后端。例如,如果打印机连接到 USB 端口,则使用 USB 后端。

连接接口

下面列出了针对各种连接接口的打印机检测的附加步骤。

USB

要查看您的 USB 打印机是否被检测到,请确保已安装 usbutils 包,然后

$ lsusb
(...)
Bus 001 Device 007: ID 03f0:1004 Hewlett-Packard DeskJet 970c/970cse

并行端口

要使用并行端口打印机,需要 lpparportparport_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

注意 DNS-SD 仅在使用 Avahi 时受支持。CUPS 不支持使用 systemd-resolved 进行 DNS-SD,请参阅 libcups issue 81。但是,您可以使用 systemd-resolved 进行域名解析(与浏览器配合使用,不像 Avahi),并运行 avahi-daemon.service 来进行 SD(服务发现)本身。

要与 Samba 共享打印机,例如,如果系统要充当 Windows 客户端的打印服务器,则需要 samba 包。

打印机驱动程序

本文章或章节需要扩充。

原因: CUPS 计划删除 PPD 和驱动程序支持(CUPS issue 103),转而完全依赖 IPP Everywhere。解释 cups 以及 cups-filters 和/或其他软件将处理什么。(在 Talk:CUPS#CUPS printer drivers and backends are deprecated 中讨论)

大多数较新的打印机(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 支持 AirPrintIPP 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 使用。

安装 gutenprintfoomatic-db-gutenprint-ppds

注意 当 Gutenprint 包更新时,使用 Gutenprint 驱动程序的打印机将停止工作,直到您以 root 身份运行 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) 手册页中有描述。

注意 打印机 URI 中的任何特殊字符都需要正确引用,否则,如果您的 Windows 打印机名称或用户密码包含空格,CUPS 将会抛出 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

警告 避免同时在服务器和客户端上配置打印机过滤器——客户端或服务器上的打印队列应设置为“raw”。这样可以避免打印作业被打印机过滤器处理两次(这可能导致共享打印机在本地工作,但在远程计算机上打印失败等问题 [2])。有关将打印队列设置为“raw”的示例,请参阅 #lp*

用法

CUPS 可以通过 lp*cups* 命令行工具完全控制。或者,可以使用 #Web 界面 或几个 #GUI 应用程序 中的一个。

  • 队列名称是在系统上用于标识队列的简短但具有描述性的名称。此名称不应包含空格或任何特殊字符。例如,与 HP LaserJet 5P 对应的打印队列可以命名为“hpljet5p”。每个物理打印机可以关联一个以上的队列。
  • 位置是打印机物理位置的描述(例如,“卧室”或“厨房”)。这是为了帮助维护多个打印机。
  • 描述是打印队列的完整描述。常见用法是完整的打印机名称(如“HP LaserJet 5P”)。

命令行工具

有关命令行工具的更多技巧,请参阅 CUPS 本地文档

注意 命令行开关不能分组。

使用 SNMP 查找 URI

$ /usr/lib/cups/backend/snmp ip_address

lp*

注意 lpinfo 工具已弃用。您应该改用 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*

cupsacceptcupsdisablecupsenablecupsreject 工具按名称执行操作。分别:将打印机设置为接受作业、禁用打印机、激活打印机、将打印机设置为拒绝所有传入任务。

作为其用法示例,我们将干净地删除一个打印机

# cupsreject queue_name
# cupsdisable queue_name
# lpadmin -x queue_name

ink

安装 inkAUR 以查看墨水量。

注意 请参阅 支持的打印机列表

将您的用户添加到额外的 lp 用户组,注销并重新登录。

有关用法信息,请运行不带选项的 ink

Web 界面

CUPS 服务器可以通过 Web 界面完全管理,该界面可在 https://:631/ 访问。

注意 如果使用 HTTPS 连接到 CUPS,第一次访问界面时可能需要很长时间才会出现。这是因为第一个请求会触发 SSL 证书的生成,这可能是一项耗时的工作。

要从 Web 界面执行管理任务,需要进行身份验证;请参阅 #Permissions

添加队列

转到管理页面。

修改现有队列

转到打印机页面,然后选择要修改的队列。

测试队列

转到打印机页面,然后选择一个队列。

GUI 应用程序

如果您的用户没有足够的权限来管理 CUPS,应用程序将在启动时请求 root 密码。要授予用户管理权限而无需 root 访问权限,请参阅 #Configuration

  • Deepin Print Manager — Deepin 桌面的打印机配置界面。
https://github.com/linuxdeepin/dde-printer || deepin-printer
  • GtkLP — CUPS 的 GTK 界面。
https://gtklp.sirtobi.com/index.shtml[链接已死 2025-11-16—HTTP 404] || gtklpAUR
  • print-manager — 用于管理打印作业和打印机的工具(KDE)。
https://invent.kde.org/plasma/print-manager || print-manager
  • system-config-printer — GTK 打印机配置工具和状态小程序。
https://github.com/OpenPrinting/system-config-printer || system-config-printer

配置

CUPS 服务器的配置位于 /etc/cups/cupsd.conf/etc/cups/cups-files.conf(请参阅 cupsd.conf(5)cups-files.conf(5))。编辑任一文件后,请重启 cups.service 以应用任何更改。默认配置对大多数用户来说已足够。

权限

用户组

/etc/cups/cups-files.confSystemGroup 中定义了具有打印机管理权限的用户组。默认情况下使用 sysrootwheel 组。

CUPS 辅助程序以 cups 用户和组身份运行。这允许辅助程序访问打印机设备并读取 /etc/cups/ 中的配置文件,这些文件属于 cups 组。

注意cups 2.2.6-2 之前,曾使用 lp 组。升级后,/etc/cups 中的文件应归 cups 组所有,并在 /etc/cups/cups-files.conf 中设置 User 209Group 209

通过 PolicyKit 允许管理员认证

PolicyKit 可以配置为允许用户使用 GUI 配置打印机而无需管理员密码。

注意 如果您使用 system-config-printer,则需要安装 cups-pk-helper 才能使用 PolicyKit。

以下是一个示例,允许 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 时使用的命令中。

本文或本章节的准确性存在争议。

原因: cups 包中不存在 /etc/cups/cups.conf,因此注释中没有带有默认参数的 GSCall。(在 Talk:CUPS 中讨论)
/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.confAccessLogErrorLogPageLog 指令的值更改为 syslog,可以将 CUPS 配置为记录到systemd journal。有关原始提议更改的信息,请参阅 Fedora:Changes/CupsJournalLogging

cups-browsed

本文或本章节已过时。

原因: cups-browsed.service 不是发现 DNS-SD 广告的打印机所必需的,这由 cups.service 完成。该服务仅用于发现 LDAP 服务器上的打印机以及使用旧版 CUPS 协议(CUPS 服务器 ≤ 1.5)的打印机。(在 Talk:CUPS 中讨论)

CUPS 可以使用 Avahi 浏览来发现网络中未知的共享打印机。这在服务器未知的复杂设置中可能很有用。要使用此功能,请设置 .local 主机名解析,然后启动 avahi-daemon.servicecups-browsed.service。作业直接发送到打印机,不经过任何处理,因此创建的队列可能无法工作,但是像支持 IPP EverywhereAirPrint 的无驱动程序打印机应该可以开箱即用。

  • 搜索网络打印机 可能会显着增加计算机启动所需的时间
  • cups-browsed.service 仅用于在打印机出现和消失时动态添加和删除网络打印机。如果您只想将支持 DNS-SD/mDNS 的网络打印机添加到 CUPS,则不需要它。

请参阅 CUPS/Printer sharingCUPS/Printer sharing#Remote administration

无本地 CUPS 服务器

CUPS 可以配置为直接连接到远程打印服务器,而不是运行本地打印服务器。这需要安装 libcups 包。一些应用程序仍然需要 cups 包才能打印。

注意 开发者不建议在没有本地 CUPS 服务器的情况下访问远程打印机,因为它允许应用程序提交后即忘掉打印作业,并依赖本地 CUPS 服务器来处理(使用缓存和重试)例如网络中断、系统休眠、应用程序错误等问题。[3]

要使用远程 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/TroubleshootingCUPS/Printer-specific problems

参见