出自 Arch Linux 中文维基

CUPS 是 OpenPrinting 為 Linux® 和其他類 UNIX® 作業系統開發的基於標準的、開源的列印系統。

Arch Linux 所打包的是 OpenPrinting CUPS 分支,而非 蘋果 CUPS 分支

安裝

請先 安裝 cups 軟體包。

注意: CUPS 不再推薦使用驅動,請儘量使用 IPP Everywhere。IPP Everywhere 直接將 PDF 發送給印表機,所以需要安裝 cups-pdf 先將文件列印到 PDF ,未安裝此軟體包可能會出現client-error-document-format-not-supported

如果想將文件「列印」成一個 PDF 文檔,也請安裝 cups-pdf 軟體包。默認情況下,PDF 文件存儲在 /var/spool/cups-pdf/username/ 目錄裡。可以在 /etc/cups/cups-pdf.conf 配置文件中變更位置。

啟用啟動 cups.service 服務,或者也可使用以下的套接字激活方式,使得僅當有程序需要使用服務時才啟動 CUPS。

套接字激活

cups 提供了一個 cups.socket 單元。如果啟用了 cups.socket (且 cups.service 在禁用狀態), systemd 不會立即啟動 CUPS,而只是監聽對應的套接字。之後,當有程序嘗試連接其中一個 CUPS 套接字時,systemd 便會啟動 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, parportparport_pc 內核模塊

# dmesg | grep -i parport
 parport0: Printer, Hewlett-Packard HP LaserJet 2100 Series
 lp0: using parport0 (polling)

網絡共享

要使用 DNS-SD/mDNS 查找、使用或共享印表機,請使用 Avahi 設置 .local 主機名解析,然後重啟 cups.service 服務。

注意: 只有使用 Avahi 時才支持 DNS-SD。 CUPS 不支持對 DNS-SD 使用 systemd-resolved,參見 CUPS issue 5452

要用 Samba 共享印表機,例如:如果系統要用作 Windows 客戶端的列印伺服器,則需要安裝 samba 軟體包。

印表機驅動

印表機的驅動程序可能來自以下任何來源。 請參閱 CUPS/印表機特定問題 獲取其他人設法使用的驅動程序的不完整列表。

要驅動一台印表機,CUPS 需要一個 PPD 文件,對於大多數印表機來說,還需要一些 過濾器。 有關 CUPS 如何使用 PPD 和過濾器的詳細信息,請參閱 [1]

OpenPrinting 印表機列表 (英語) 提供了許多印表機的推薦驅動程序。它還為每台印表機提供了相應的 PPD 文件,但是大多數文件都可以通過 foomatic 或其它推薦的驅動程序包獲得。

將 PPD 文件提供給 CUPS 後,CUPS 伺服器將重新生成 PPD 文件並將其保存在 /etc/cups/ppd/ 中。

To test if they are working before creating a PKGBUILD, PPD files can be manually added to /usr/share/cups/model, the driver should be available after the next restart of the cups service.

AirPrint and IPP Everywhere

CUPS 本體包括了對 AirPrintIPP Everywhere 印表機的支持。

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) 以及 PCL 印表機的驅動程序。

安裝 gutenprintfoomatic-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/Troubleshooting#USB printers 進行故障排除。

並口印表機

並口印表機的 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/Printer sharing#Printer sharing

有關其它問題和相應解決方案,請參閱 CUPS/Troubleshooting#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*

cupsacceptcupsdisablecupsenablecupsreject 工具的作用分別是:設置印表機接受任務、禁用印表機、激活印表機、設置印表機拒絕所有收到的任務。

以下用法示例會徹底刪除一台印表機:

# 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/utilities/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 用戶及組運行。這樣助手程序就可以訪問印表機設備,並讀取由 cups 組擁有的 /etc/cups/ 內的配置文件。

注意: cups 2.2.6-2 之前使用的是lp組。在升級之後,/etc/cups 中的文件應該由 cups 組和 User 209Group 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 並設置系統默認紙張尺寸。參見 papersize(5)

日誌文件

默認情況下,所有日誌都會發送到 /var/log/cups/ 中的文件裡。

/etc/cups/cups-files.conf 中的 AccessLogErrorLogPageLog 指令的值改為 syslog,CUPS 可以把日誌記錄到 systemd 日誌 中。有關原始建議更改的信息,請參閱 Fedora 維基頁面 (英文)cupsd.conf 文檔.

列印伺服器和遠程管理

參見 CUPS/Printer sharingCUPS/Printer sharing#Remote administration

不使用本地 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/Troubleshooting

另請參閱