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
新增話題