CUPS

出自 ArchWiki
(重定向自 Lp

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。

打印步骤

如果想要解决相关问题,了解 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 添加队列的文档,请参见以下章节和官方文档 Setting up printers

打印机发现

要发现、使用已发现或共享的打印机(使用 DNS-SD/mDNS),请使用 Avahi 设置 .local 主机名解析,并 重启 cups.service

注意: 仅在使用 Avahi 时才支持 DNS-SD。CUPS 不支持使用 systemd-resolved 进行 DNS-SD,请参阅 CUPS issue 5452。但是,您可以将 systemd-resolved 用于域名解析(与浏览器一起使用,与 Avahi 不同),并运行 avahi-daemon.service 以进行 SD(服务发现)本身。

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

打印机驱动

本文或本章节需要扩充。

原因: CUPS 计划放弃 PPD 和驱动程序支持 (CUPS issue 103),转而完全依赖 IPP Everywhere。解释 cups 处理什么,以及 cups-filters 和/或其他软件处理什么。(在 Talk:CUPS#CUPS 打印机驱动程序和后端已被弃用 中讨论)

大多数最新的打印机(2010 年以后)通过实施 AirPrint 和/或 IPP_Everywhere(参见下文)来支持无驱动程序使用。

打印机的驱动程序可能来自以下任何来源。有关其他人设法使其工作的驱动程序的不完整列表,请参阅 CUPS/打印机特定问题

要驱动打印机,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 在没有任何额外配置的情况下运行,则应自动发现它们。

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 PPD 可能需要其他过滤器,例如 min12xxwAUR

Gutenprint

Gutenprint 项目 为佳能、爱普生、利盟、索尼、奥林巴斯、兄弟、惠普、理光、PCL 打印机和一些通用打印机提供驱动程序,以用于 CUPS 和 GIMP

安装 gutenprintfoomatic-db-gutenprint-ppds

注意: 当 Gutenprint 软件包更新时,使用 Gutenprint 驱动程序的打印机将停止工作,直到您以 root 身份运行 cups-genppdupdate 并重启 CUPS。cups-genppdupdate 将更新已配置打印机的 PPD 文件,有关更多详细信息,请参阅 cups-genppdupdate(8)

厂商特定的驱动

许多打印机制造商提供他们自己的 Linux 驱动程序。这些驱动程序通常在官方 Arch 软件仓库或 AUR 中提供。

其中一些驱动程序在 CUPS/打印机特定问题 中有更详细的描述。

打印机 URI

如果需要手动生成 URI,下面列出了其他步骤。某些打印机或驱动程序可能需要特殊的 URI,如 CUPS/打印机特定问题 中所述。

USB

CUPS 应该能够自动为 USB 打印机生成 URI,例如 usb://HP/DESKJET%20940C?serial=CN16E6C364BH

如果它没有自动生成,请参阅 CUPS/故障排除#USB 打印机 以获取故障排除步骤。

并行端口

URI 的格式应为 parallel:device。例如,如果打印机连接在 /dev/lp0 上,请使用 parallel:/dev/lp0。如果您使用 USB 转并行端口适配器,请使用 parallel:/dev/usb/lp0 作为打印机 URI。

网络

如果您已按照 #网络 中的说明设置了 Avahi,则 CUPS 应该检测到打印机 URI。您也可以使用 avahi-discover 来查找打印机的名称及其地址(例如,BRN30055C6B4C7A.local/10.10.0.155:631)。

URI 也可以手动生成,而无需使用 AvahiCUPS 文档 中提供了网络打印机的可用 URI 方案列表。由于 URI 的确切详细信息因打印机而异,请查看打印机的手册或 CUPS/打印机特定问题

有关 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"))'

可以通过 ipp://hostname:631/printers/queue_name 形式的 URI 访问远程 CUPS 打印服务器。有关设置远程打印服务器的详细信息,请参阅 CUPS/打印机共享#打印机共享

有关其他问题和解决方案,请参阅 CUPS/故障排除#网络问题

警告: 避免在服务器和客户端上都配置打印机过滤器——客户端或服务器上的打印队列应为“raw”。这避免了打印作业通过打印机过滤器两次(这可能会导致问题,例如共享打印机在本地工作,但远程计算机无法打印 [2])。有关将打印队列设置为“raw”的示例,请参阅 #lp*

使用

可以使用 lp*cups* CLI 工具完全控制 CUPS。或者,可以使用 #Web 界面 或几个 #GUI 应用程序 之一。

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

CLI 工具

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

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

使用 SNMP 查找 URI

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

lp*

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

对于 raw 队列;没有 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 界面

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

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

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

添加队列

转到 管理 页面。

修改现有队列

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

测试队列

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

GUI 应用程序

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

  • Deepin 打印管理器 — Deepin 桌面的打印机配置界面。
https://github.com/linuxdeepin/dde-printer || deepin-printer
  • GtkLP — CUPS 的 GTK 界面。
https://gtklp.sirtobi.com/index.shtml || 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.conf 中的 SystemGroup 中定义。默认情况下使用 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.conf 中的 AccessLogErrorLogPageLog 指令的值更改为 syslog,可以使 CUPS 记录到 systemd 日志中。有关原始提议的更改的信息,请参阅 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/打印机共享CUPS/打印机共享#远程管理

没有本地 CUPS 服务器

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

注意: 开发人员不建议在没有本地 CUPS 服务器的情况下访问远程打印机。[3]

要使用远程 CUPS 服务器,请将 CUPS_SERVER 环境变量 设置为 printerserver.mydomain:port。例如,如果您想为单个 Firefox 实例使用不同的打印服务器(将 printerserver.mydomain:port 替换为您的打印服务器名称/端口)

$ CUPS_SERVER=printserver.mydomain:port firefox

要使此配置永久生效,请创建配置文件 /etc/cups/client.conf 并向其中添加远程 CUPS 服务器的主机名

ServerName server

您还可以指定自定义端口

ServerName server:port

有关详细信息,请参阅 [4]

故障排除

请参阅 CUPS/故障排除CUPS/打印机特定问题

参见