CUPS - Arch Linux 中文维基

跳转到内容

# CUPS

来自 Arch Linux 中文维基
翻译状态：

- 本文（或部分内容）译自 CUPS，最近一次同步于 2025-02-11，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

相关文章

- CUPS/共享打印机
- CUPS/打印机特定问题
- CUPS/疑难解答
- Samba
- LPRng

CUPS 是 OpenPrinting 为 Linux® 和其他类 UNIX® 操作系统开发的基于标准的、开源的打印系统。

Arch Linux 所打包的是 OpenPrinting CUPS 分支，而非 Apple CUPS 分支。

目前在市场上可以购买到多种打印扫描一体机，关于这些机器的扫描功能的信息，请参阅 SANE。

## 安装

请先安装 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 文件（若应用程序发送的是其他格式则先转换为 PDF）给 CUPS；
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

### 并口

要使用并口打印机，需要 `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 查找、使用或共享打印机，请使用 Avahi 设置 .local 主机名解析，然后重启 `cups.service` 服务。

注意：只有使用 Avahi 时才支持 DNS-SD。 CUPS 不支持对 DNS-SD 使用 systemd-resolved，参见 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 或其它推荐的驱动程序包获得。

将 PPD 文件提供给 CUPS 后，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 本体的一部分，但被项目丢弃。这些文件可通过 cups-filters包 软件包获得，后者是 cups包 的依赖项之一。

非 PDF 打印机需要安装 ghostscript包。对于 PostScript 打印机可能还需要安装 gsfonts包。

### Foomatic

Linux 基金会旗下 OpenPrinting 工作组维护的 foomatic 为许多打印机提供了 PPD 文件，既有自由的也有非自由的。有关 foomatic 功能的更多信息，请参阅开发者眼中的 Foomatic (英语)。

要使用 foomatic，请安装 foomatic-db-engine包 和下列的至少一个软件包：

- foomatic-db包 - foomatic-db-engine 用来生成 PPD 文件的 XML 文件集合。
- foomatic-db-ppds包 - 预构建好的 PPD 文件。
- foomatic-db-nonfree包 - 打印机制造商提供的、非自由许可协议下的、foomatic-db-engine 用于生成 PPD 文件的 XML 文件集合。
- foomatic-db-nonfree-ppds包 - 非自由许可协议下的预构建 PPD 文件。

Foomatic 的 PPD 文件可能还需要额外的过滤器，比如 min12xxwAUR。

### Gutenprint

Gutenprint 项目提供了可与 CUPS 和 GIMP 搭配使用的佳能(Canon)、爱普生(Epson)、利盟(Lexmark)、索尼(Sony)、奥林巴斯(Olympus)、兄弟(Brother)、惠普(HP)、理光(Ricoh)、PCL 打印机以及一些通用打印机的驱动程序。

安装 gutenprint包 和 foomatic-db-gutenprint-ppds包 即可。

注意：当 Gutenprint 软件包更新时，使用 Gutenprint 驱动的打印机将会停止工作，直到以 root 身份运行 `cups-genppdupdate` 并重新启动 CUPS。cups-genppdupdate 将会升级已配置打印机的 PPD 文件，参见 cups-genppdupdate(8) 获取更多细节。

### 制造商特定的驱动程序

许多打印机厂商提供它们自己的 Linux 驱动。这些驱动通常可以在 Arch 官方仓库和 AUR 里找到。

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

## 打印机 URI

下面列出了一些用于在需要时手动生成 URI 的额外步骤。CUPS/打印机特定问题一文里说明了一些需要特别 URI 的打印机或驱动。

### USB 打印机

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

如果没有，请参阅 CUPS疑难解答#USB 打印机进行故障排除。

### 并口打印机

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

### 网络打印机

如果已经按照 #网络共享一节中配置好了 Avahi，CUPS 应该能检测到打印机 URI。另外还可以使用 `avahi-discover` 查找需要的打印机的名称及其地址（例如 `BRN30055C6B4C7A.local/10.10.0.155:631`）。

也可以不使用 Avahi 来手动生成 URI。 CUPS 文档里提供了一张网络打印机可用 URI 方案列表。由于不同打印机的 URI 具体细节有所差异，请查看打印机的用户手册或 CUPS/打印机特定问题。

smbspool(8) 手册页中介绍了 SMB 共享打印机的 URI。

注意：打印机 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"))'

远程 CUPS 打印服务器可通过 `ipp://hostname:631/printers/queue_name` 这样格式的 URI 来访问。关于如何配置远程打印服务器的详细信息，请参阅 CUPS/共享打印机#共享打印机。

有关其它问题和相应解决方案，请参阅 CUPS/疑难解答#Networking issues。

警告：避免使用同一个打印机过滤器配置服务器和客户端——客户端或服务器上的打印队列应为“原始 (raw)”状态。这样可以避免通过过滤器向打印机发送两次打印作业，不然可能导致问题，例如：共享打印机在本地工作，但远程计算机却无法打印 ([2])。有关将打印队列设置为“原始”的示例，请参见 #lp* 一节。

## 使用方法

可以通过 lp* 和 cups* CLI 工具完全控制 CUPS。 此外，也可以使用 #网页界面和几种 #GUI 应用之一来控制 CUPS。

- 队列 (queue) 名称是系统上用来标识队列的简短但有描述性的名称。这个名称不应该含有空格或任何特殊字符。比如，对应打印机 HP LaserJet 5P 的打印队列可以命名为“ hpljet5p”。一台物理打印机可以关联多个队列。
- 位置 (location) 用来描述打印机的物理位置（比如说“卧室”或者“厨房”）。这有助于维护多台打印机。
- 描述 (description) 是打印队列的完整描述。一个常见用法是填写打印机的全名（比如说 "HP LaserJet 5P"）。

### 命令行工具

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

注意：命令行开关不可聚合使用。

使用 SNMP 查询 URI：

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

#### lp*

lpinfo`-v` 可以列出已连接打印机的 URI ，加上 `-m` 选项可列出所有系统上安装的驱动型号。

lpadmin 实用程序加上 `-p queue_name`可创建新队列。`-E` 开关与 `-p` 一起使用可启用并接受打印机上的任务。`-v` 指定设备 URI， `-m` 指定型号或要使用的 PPD 文件。 也可使用 `-x` 开关删除打印机（请先阅读下面一节）。

例子:

    # 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

安装 inkAUR 查看墨量。

注意：参阅打印机支持列表。

将你的用户添加到 `lp` 用户组，注销然后再登录。

有关用法的信息，请不带参数运行 `ink`。

### 网页界面

可以通过 http://localhost:631/ 上的网页界面完全管理 CUPS 服务器。

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

要从网页界面执行管理任务，需要验证身份；见 #权限。

添加队列

转到 Administration 页面。

修改现有队列

转到 Printers 页面，然后选择一个队列来修改。

测试队列

转到 Printers 页面，然后选择一个队列。

### GUI 应用

如果用户没有足够权限来管理 CUPS，应用启动时会要求输入 root 用户密码。要授予用户管理权而无需 root 用户访问权限，参见 #配置小节。

- Deepin Print Manager — 深度桌面环境的打印机配置界面。

  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` 一处定义了有打印机管理权限的用户组。默认情况下使用 `sys`、`root` 和 `wheel` 组。

CUPS 助手程序以 `cups` 用户及组运行。这样助手程序就可以访问打印机设备，并读取由 `cups` 组拥有的 `/etc/cups/` 内的配置文件。

注意：cups包 2.2.6-2 之前使用的是lp组。在升级之后，`/etc/cups` 中的文件应该由 `cups` 组和 `User 209` 及 `Group 209` 拥有，如 `/etc/cups/cups-files.conf` 中所设置的那样。

### 允许通过 PolicyKit 进行管理员身份验证

可配置 PolicyKit，允许用户使用一个 GUI 来配置打印机，而无需使用管理员密码。

注意：你可能需要安装 cups-pk-helper包 来使这个规则生效。

这是一个允许 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` 在 cups包 包中不存在，因此注释中没有带有默认参数的 `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

    # 上面的行显示了 GSCall 值的默认值。在 -dNOPAUSE 之前添加 -dPDFA 并删除注释前缀：（不要从这里复制该行，因为它可能已更改。使用您自己文件中的“默认”值）
    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/cups-files.conf` 中的 `AccessLog`、`ErrorLog` 和 `PageLog` 指令的值改为 `syslog`，CUPS 可以把日志记录到 systemd 日志中。有关原始建议更改的信息，请参阅 Fedora 维基页面 (英文) 和 cupsd.conf 文档.

### 打印服务器和远程管理

参见 CUPS/共享打印机和 CUPS/共享打印机#远程管理。

### 不使用本地 CUPS 服务器

CUPS 可以被配置为直接连接到远程打印机服务器，而不是在本地运行打印服务器。这需要安装 libcups包 软件包。某些应用程序仍需要依赖 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/疑难解答和 CUPS/打印机特定问题。

## 另请参阅

- 官方 CUPS 文档, 安装在本地
- Wikipedia:CUPS
- OpenPrinting 主页
- OpenSuSE 打印概念指南 - 解释完整的打印工作流程
- OpenSuSE CUPS 简述 - CUPS 快速概览
- Gentoo 的打印指南
- Debian 的打印门户站 - 详细的技术指南
- Debian 的打印概览 - CUPS 打印系统的基本概述
- CUPS printing-architecture 和 printing-users 邮件列表
- CUPS 邮件列表 (Apple fork)
- CUPS 问题跟踪器
- CUPS 问题跟踪器 (Apple fork)

分类：​

- 打印机
- 服务器

隐藏分类：​

- 使用“模板:准确性”标记的页面或章节

CUPS
添加话题