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 添加队列的文档,请参见以下章节和官方文档 Setting up printers。
打印机发现
要发现、使用已发现或共享的打印机(使用 DNS-SD/mDNS),请使用 Avahi 设置 .local 主机名解析,并 重启 cups.service
。
avahi-daemon.service
以进行 SD(服务发现)本身。要与 Samba 共享打印机,例如,如果系统要作为 Windows 客户端的打印服务器,则需要 samba 软件包。
打印机驱动
大多数最新的打印机(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 包括对 AirPrint 和 IPP 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-db — foomatic-db-engine 用于生成 PPD 文件的 XML 文件集合。
- foomatic-db-ppds — 预构建的 PPD 文件。
- foomatic-db-nonfree — 来自打印机制造商的非自由许可 XML 文件集合,foomatic-db-engine 用于生成 PPD 文件。
- foomatic-db-nonfree-ppds — 非自由许可下的预构建 PPD 文件。
foomatic PPD 可能需要其他过滤器,例如 min12xxwAUR。
Gutenprint
Gutenprint 项目 为佳能、爱普生、利盟、索尼、奥林巴斯、兄弟、惠普、理光、PCL 打印机和一些通用打印机提供驱动程序,以用于 CUPS 和 GIMP。
安装 gutenprint 和 foomatic-db-gutenprint-ppds。
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 也可以手动生成,而无需使用 Avahi。CUPS 文档 中提供了网络打印机的可用 URI 方案列表。由于 URI 的确切详细信息因打印机而异,请查看打印机的手册或 CUPS/打印机特定问题。
有关 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"))'
可以通过 ipp://hostname:631/printers/queue_name
形式的 URI 访问远程 CUPS 打印服务器。有关设置远程打印服务器的详细信息,请参阅 CUPS/打印机共享#打印机共享。
有关其他问题和解决方案,请参阅 CUPS/故障排除#网络问题。
使用
可以使用 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*
cupsaccept、cupsdisable、cupsenable 和 cupsreject 实用程序执行与其名称相同的操作。分别是:设置打印机接受作业、禁用打印机、激活打印机、设置打印机拒绝所有传入的任务。
作为其用法的示例,我们将干净地删除打印机
# cupsreject queue_name # cupsdisable queue_name # lpadmin -x queue_name
ink
将您的用户添加到附加的 lp
用户组,注销并重新登录。
有关使用信息,请在不带选项的情况下运行 ink
。
Web 界面
可以通过 Web 界面完全管理 CUPS 服务器,Web 界面可在 https://127.0.0.1:631/ 上访问。
要从 Web 界面执行管理任务,需要身份验证;请参阅 #权限。
- 添加队列
转到 管理 页面。
- 修改现有队列
转到 打印机 页面,然后选择要修改的队列。
- 测试队列
转到 打印机 页面,然后选择一个队列。
GUI 应用程序
如果您的用户没有足够的权限来管理 CUPS,则应用程序将在启动时请求 root 密码。要授予用户管理权限而无需 root 访问权限,请参阅 #配置。
- Deepin 打印管理器 — Deepin 桌面的打印机配置界面。
- GtkLP — CUPS 的 GTK 界面。
- 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 日志中。有关原始提议的更改的信息,请参阅 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/打印机共享 和 CUPS/打印机共享#远程管理。
没有本地 CUPS 服务器
CUPS 可以配置为直接连接到远程打印服务器,而不是运行本地打印服务器。这需要安装 libcups 软件包。某些应用程序仍然需要 cups 软件包才能进行打印。
要使用远程 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/打印机特定问题。