Linux中國

完全指南:在 Linux 中如何列印和管理印表機

Linux 中的列印

雖然現在大量的溝通都是電子化和無紙化的,但是在我們的公司中還有大量的材料需要列印。銀行結算單、公用事業帳單、財務和其它報告、以及收益結算單等一些東西還是需要列印的。本教程將介紹在 Linux 中如何使用 CUPS 去列印。

CUPS,是 通用 Unix 列印系統 Common UNIX Printing System 的首字母縮寫,它是 Linux 中的印表機和列印任務的管理者。早期計算機上的印表機一般是在特定的字符集和字體大小下列印文本文件行。現在的圖形印表機可以列印各種字體和大小的文本和圖形。儘管如此,現在你所使用的一些命令,在古老的行式列印守護進程(LPD)技術的歷史中仍能找到它們。

本教程將幫你了解 Linux 伺服器專業考試(LPIC-1)的第 108 號主題的 108.4 目標。這個目標的權重為 2。

前提條件

為了更好地學習本系列教程,你需要具備基本的 Linux 知識,和使用 Linux 系統實踐本教程中的命令的能力,你應該熟悉 GNU 和 UNIX® 命令的使用。有時不同版本的程序輸出可能會不同,因此,你的結果可能與本教程中的示例有所不同。

本教程中的示例使用的是 Fedora 27 的系統。

有關列印的一些歷史

這一小部分歷史並不是 LPI 目標的,但它有助於你理解這個目標的相關環境。

早期的計算機大都使用行式印表機。這些都是擊打式印表機,那時,它們使用固定間距的字元和單一的字體來列印文本行。為提升整個系統性能,早期的主機要與慢速的外圍設備(如讀卡器、卡片穿孔機、和運行其它工作的行式印表機)交叉進行工作。因此就產生了在線的或者假離線的同步外圍操作,這一術語目前在談到計算機列印時仍然在使用。

在 UNIX 和 Linux 系統上,列印初始化使用的是 BSD( 伯克利軟體分發版 Berkeley Software Distribution )列印子系統,它是由一個作為伺服器運行的行式列印守護程序(LPD)組成,而客戶端命令如 lpr 是用於提交列印作業。這個協議後來被 IETF 標準化為 RFC 1179 —— 行式印表機守護進程協議

System V 也有一個列印守護程序。它的功能與BSD 的 LPD 守護程序類似,但是它們的命令集不一樣。你在後面會經常看到完成相同的任務使用不同選項的兩個命令。例如,對於列印文件的命令,伯克利實現版本是 lpr,而 System V 實現版本是 lp

隨著印表機技術的進步,在一個頁面上混合出現不同字體成為可能,並且可以將圖片像文字一樣列印。可變間距字體,以及更多先進的列印技術,比如間距和連字元,現在都已經標準化。出現了幾種對基本的 lpd/lpr 方法等改進設計,比如 LPRng,下一代的 LPR,以及 CUPS。

許多可以列印圖形的印表機,使用 Adobe PostScript 語言進行初始化。一個 PostScript 印表機有一個解釋器引擎,它可以解釋列印任務中的命令並從這些命令中生成最終的頁面。PostScript 經常被用做原始文件(比如一個文本文件或者一個圖像文件)和最終格式沒有適合的 PostScript 功能的特定印表機之間的中間層。轉換這些特定的列印任務,比如將一個 ASCII 文本文件或者一個 JPEG 圖像轉換為 PostScript,然後再使用過濾器轉換 PostScript 到非 PostScript 印表機所需要的最終光柵格式。

現在的 攜帶型文檔格式 Portable Document Format (PDF),它就是基於 PostScript 的,已經替換了傳統的原始 PostScript。PDF 設計為與硬體和軟體無關,它封裝了要列印的頁面的完整描述。你可以查看 以及列印 PDF 文件。

管理列印隊列

用戶直接列印作業到一個名為 列印隊列 print queue 的邏輯實體。在單用戶系統中,列印隊列和印表機通常是幾乎相同的意思。但是,CUPS 允許系統不用連接到一個印表機上,而最終在一個遠程系統上的排隊列印作業,並且通過使用分類,允許將定向到一個分類的列印作業在該分類第一個可用的印表機上列印。

你可以檢查和管理列印隊列。對於 CUPS 來說,其中一些命令實現了一些新操作。另外的一些是源於 LPD 的兼容命令,不過現在的一些選項通常是最初的 LPD 列印系統選項的有限子集。

你可以使用 CUPS 的 lpstat 命令去檢查隊列,以了解列印系統。一些常見選項如下表 1。

選項 作用
-a 顯示印表機狀態
-c 顯示列印分類
-p 顯示列印狀態:enabled 或者 disabled
-s 顯示默認印表機、印表機和類。相當於 -d -c -v注意:要指定多個選項,這些選項必須像值一樣分隔開。
-v 顯示印表機和它們的設備。

表 1. lpstat 命令的選項

你也可以使用 LPD 的 lpc 命令(它可以在 /usr/sbin 中找到)使用它的 status 選項。如果你不想指定印表機名字,將列出所有的隊列。列表 1 展示了命令的一些示例。

[ian@atticf27 ~]$ lpstat -d
system default destination: HL-2280DW
[ian@atticf27 ~]$ lpstat -v HL-2280DW
device for HL-2280DW: dnssd://Brother%20HL-2280DW._pdl-datastream._tcp.local/
[ian@atticf27 ~]$ lpstat -s
system default destination: HL-2280DW
members of class anyprint:
    HL-2280DW
    XP-610
device for anyprint: ///dev/null
device for HL-2280DW: dnssd://Brother%20HL-2280DW._pdl-datastream._tcp.local/
device for XP-610: dnssd://EPSON%20XP-610%20Series._ipp._tcp.local/?uuid=cfe92100-67c4-11d4-a45f-ac18266c48aa
[ian@atticf27 ~]$ lpstat -a XP-610
XP-610 accepting requests since Thu 27 Apr 2017 05:53:59 PM EDT
[ian@atticf27 ~]$ /usr/sbin/lpc status HL-2280DW
HL-2280DW:
    printer is on device 'dnssd' speed -1
    queuing is disabled
    printing is enabled
    no entries
    daemon present

列表 1. 顯示可用列印隊列

這個示例展示了兩台印表機 —— HL-2280DW 和 XP-610,和一個分類 anyprint,它允許列印作業定向到這兩台印表機中的第一個可用印表機。

在這個示例中,已經禁用了列印到 HL-2280DW 隊列,但是列印功能是啟用的,這樣便於將印表機離線維護之前可以完成列印隊列中的任務。啟用還是禁用隊列,可以使用 cupsacceptcupsreject 命令來管理。以前它們叫做 acceptreject,你或許可能在 /usr/sbin 中找到這些命令,但它們現在都是符號鏈接到新的命令上了。同樣,啟用還是禁用列印,你可以使用 cupsenablecupsdisable 命令來管理。在早期版本的 CUPS 中,這些被稱為 enabledisable,它也許會與 bash shell 內置的 enable 混淆。列表 2 展示了如何去啟用印表機 HL-2280DW 上的隊列,而禁止它的列印。CUPS 的幾個命令支持使用 -r 選項去提供一個該操作的理由。這個理由會在你使用 lpstat 時顯示,但是如果你使用的是 lpc 命令則不會顯示它。

[ian@atticf27 ~]$ lpstat -a -p HL-2280DW
anyprint accepting requests since Mon 29 Jan 2018 01:17:09 PM EST
HL-2280DW not accepting requests since Thu 27 Apr 2017 05:52:27 PM EDT -
    Maintenance scheduled
XP-610 accepting requests since Thu 27 Apr 2017 05:53:59 PM EDT
printer HL-2280DW is idle. enabled since Thu 27 Apr 2017 05:52:27 PM EDT
    Maintenance scheduled
[ian@atticf27 ~]$ accept HL-2280DW
[ian@atticf27 ~]$ cupsdisable -r "waiting for toner delivery" HL-2280DW
[ian@atticf27 ~]$ lpstat -p -a
printer anyprint is idle. enabled since Mon 29 Jan 2018 01:17:09 PM EST
printer HL-2280DW disabled since Mon 29 Jan 2018 04:03:50 PM EST -
    waiting for toner delivery
printer XP-610 is idle. enabled since Thu 27 Apr 2017 05:53:59 PM EDT
anyprint accepting requests since Mon 29 Jan 2018 01:17:09 PM EST
HL-2280DW accepting requests since Mon 29 Jan 2018 04:03:50 PM EST
XP-610 accepting requests since Thu 27 Apr 2017 05:53:59 PM EDT

列表 2. 啟用隊列和禁用列印

注意:用戶執行這些任務必須經過授權。它可能要求是 root 用戶或者其它的授權用戶。在 /etc/cups/cups-files.conf 中可以看到 SystemGroup 的條目,cups-files.conf 的 man 頁面有更多授權用戶組的信息。

管理用戶列印作業

現在,你已經知道了一些如何去檢查列印隊列和類的方法,我將給你展示如何管理列印隊列上的作業。你要做的第一件事是,如何找到一個特定印表機或者全部印表機上排隊的任意作業。完成上述工作要使用 lpq 命令。如果沒有指定任何選項,lpq 將顯示默認印表機上的隊列。使用 -P 選項和一個印表機名字將指定印表機,或者使用 -a 選項去指定所有的印表機,如下面的列表 3 所示。

[pat@atticf27 ~]$ # As user pat (non-administrator)
[pat@atticf27 ~]$ lpq
HL-2280DW is not ready
Rank Owner Job File(s) Total Size
1st unknown 4 unknown 6144 bytes
2nd pat 6 bitlib.h 6144 bytes
3rd pat 7 bitlib.C 6144 bytes
4th unknown 8 unknown 1024 bytes
5th unknown 9 unknown 1024 bytes

[ian@atticf27 ~]$ # As user ian (administrator)
[ian@atticf27 ~]$ lpq -P xp-610
xp-610 is ready
no entries
[ian@atticf27 ~]$ lpq -a
Rank Owner Job File(s) Total Size
1st ian 4 permutation.C 6144 bytes
2nd pat 6 bitlib.h 6144 bytes
3rd pat 7 bitlib.C 6144 bytes
4th ian 8 .bashrc 1024 bytes
5th ian 9 .bashrc 1024 bytes

列表 3. 使用 lpq 檢查列印隊列

在這個示例中,共有五個作業,它們是 4、6、7、8、和 9,並且它是名為 HL-2280DW 的印表機的隊列,而不是 XP-610 的。在這個示例中使用 -P 選項,可簡單地顯示哪個印表機已經準備好,但是沒有隊列任務。注意,CUPS 的印表機命名,是大小寫不敏感的。還要注意的是,用戶 ian 提交了同樣的作業兩次,當一個作業沒有第一時間列印時,經常能看到用戶的這種動作。

一般情況下,你可能會查看或者維護你自己的列印作業,但是,root 用戶或者其它授權的用戶通常會去管理其它列印作業。大多數 CUPS 命令都可以使用一個 -E 選項,對 CUPS 伺服器與客戶端之間的通訊進行加密。

使用 lprm 命令從隊列中去刪除一個 .bashrc 作業。如果不使用選項,將刪除當前的作業。使用 - 選項,將刪除全部的作業。要麼就如列表 4 那樣,指定一個要刪除的作業列表。

[[pat@atticf27 ~]$ # As user pat (non-administrator)
[pat@atticf27 ~]$ lprm
lprm: Forbidden

[ian@atticf27 ~]$ # As user ian (administrator)
[ian@atticf27 ~]$ lprm 8
[ian@atticf27 ~]$ lpq
HL-2280DW is not ready
Rank Owner Job File(s) Total Size
1st ian 4 permutation.C 6144 bytes
2nd pat 6 bitlib.h 6144 bytes
3rd pat 7 bitlib.C 6144 bytes
4th ian 9 .bashrc 1024 bytes

列表 4. 使用 lprm 刪除列印作業

注意,用戶 pat 不能刪除隊列中的第一個作業,因為它是用戶 ian 的。但是,ian 可以刪除他自己的 8 號作業。

另外的可以幫你操作列印隊列中的作業的命令是 lp。使用它可以去修改作業屬性,比如列印數量或者優先順序。我們假設用戶 ian 希望他的作業 9 在用戶 pat 的作業之前列印,並且希望列印兩份。作業優先順序的默認值是 50,它的優先順序範圍從最低的 1 到最高的 100 之間。用戶 ian 可以使用 -i-n、以及 -q 選項去指定一個要修改的作業,而新的列印數量和優先順序可以如下面的列表 5 所示的那樣去修改。注意,使用 -l 選項的 lpq 命令可以提供更詳細的輸出。

[ian@atticf27 ~]$ lpq
HL-2280DW is not ready
Rank Owner Job File(s) Total Size
1st ian 4 permutation.C 6144 bytes
2nd pat 6 bitlib.h 6144 bytes
3rd pat 7 bitlib.C 6144 bytes
4th ian 9 .bashrc 1024 bytes
[ian@atticf27 ~]$ lp -i 9 -q 60 -n 2
[ian@atticf27 ~]$ lpq
HL-2280DW is not ready
Rank Owner Job File(s) Total Size
1st ian 9 .bashrc 1024 bytes
2nd ian 4 permutation.C 6144 bytes
3rd pat 6 bitlib.h 6144 bytes
4th pat 7 bitlib.C 6144 bytes

列表 5. 使用 lp 去改變列印數量和優先順序

最後,lpmove 命令可以允許一個作業從一個隊列移動到另一個隊列。例如,我們可能因為印表機 HL-2280DW 現在不能使用,而想去移動一個作業到另外的隊列上。你可以指定一個作業編號,比如 9,或者你可以用一個隊列名加一個連字元去限定它,比如,HL-2280DW-0。lpmove 命令的操作要求是授權用戶。列表 6 展示了如何去從一個隊列移動作業到另外的隊列,先是指定印表機和作業 ID 移動,然後是移動指定印表機的所有作業。稍後我們可以去再次檢查隊列,其中一個作業已經在列印中了。

[ian@atticf27 ~]$ lpmove HL-2280DW-9 anyprint
[ian@atticf27 ~]$ lpmove HL-2280DW xp-610
[ian@atticf27 ~]$ lpq -a
Rank Owner Job File(s) Total Size
active ian 9 .bashrc 1024 bytes
1st ian 4 permutation.C 6144 bytes
2nd pat 6 bitlib.h 6144 bytes
3rd pat 7 bitlib.C 6144 bytes
[ian@atticf27 ~]$ # A few minutes later
[ian@atticf27 ~]$ lpq -a
Rank Owner Job File(s) Total Size
active pat 6 bitlib.h 6144 bytes
1st pat 7 bitlib.C 6144 bytes

列表 6. 使用 lpmove 移動作業到另外一個列印隊列

如果你使用的是 CUPS 之外的列印伺服器,比如 LPD 或者 LPRng,大多數的隊列管理功能是由 lpc 命令的子命令來處理的。例如,你可以使用 lpc topq 去移動一個作業到隊列的頂端。其它的 lpc 子命令包括 disabledownenableholdmoveredirectrelease、和 start。這些子命令在 CUPS 的兼容命令中沒有實現。

列印文件

如何去列印創建的作業?大多數圖形界面程序都提供了一個列印方法,通常是 文件 菜單下面的選項。這些程序為選擇印表機、設置頁邊距、彩色或者黑白列印、列印數量、選擇每張紙列印的頁面數(每張紙列印兩個頁面,通常用於講義)等等,都提供了圖形化的工具。現在,我將為你展示如何使用命令行工具去管理這些功能,然後和圖形化實現進行比較。

列印文件最簡單的方法是使用 lpr 命令,然後提供一個文件名字。這將在默認印表機上列印這個文件。而 lp 命令不僅可以列印文件,也可以修改列印作業。列表 7 展示了使用這個命令的一個簡單示例。注意,lpr 會靜默處理這個作業,但是 lp 會顯示處理後的作業的 ID。

[ian@atticf27 ~]$ echo "Print this text" > printexample.txt
[ian@atticf27 ~]$ lpr printexample.txt
[ian@atticf27 ~]$ lp printexample.txt
request id is HL-2280DW-12 (1 file(s))

列表 7. 使用 lpr 和 lp 列印

表 2 展示了 lpr 上你可以使用的一些選項。注意, lp 的選項和 lpr 的很類似,但是名字可能不一樣;例如,-#lpr 上是相當於 lp-n 選項。查看 man 頁面了解更多的信息。

選項 作用
-C-J-T 設置一個作業名字。
-P 選擇一個指定的印表機。
-# 指定列印數量。注意這不同於 lp 命令的 -n 選項。
-m 在作業完成時發送電子郵件。
-l 表示列印文件已經為列印做好格式準備。相當於 -o raw
-o 設置一個作業選項。
-p 格式化一個帶有陰影標題的文本文件。相關於 -o prettyprint
-q 暫緩(或排隊)後面的列印作業。
-r 在文件進入列印池之後,刪除文件。

表 2. lpr 的選項

列表 8 展示了一些選項。我要求列印之後給我發確認電子郵件,那個作業被暫緩執行,並且在列印之後刪除文件。

[ian@atticf27 ~]$ lpr -P HL-2280DW -J "Ian's text file" -#2 -m -p -q -r printexample.txt
[[ian@atticf27 ~]$ lpq -l
HL-2280DW is ready

ian: 1st [job 13 localhost]
 2 copies of Ian's text file 1024 bytes
[ian@atticf27 ~]$ ls printexample.txt
ls: cannot access 'printexample.txt': No such file or directory

列表 8. 使用 lpr 列印

我現在有一個在 HL-2280DW 列印隊列上暫緩執行的作業。然後怎麼做?lp 命令可以通過使用 -H 的各種選項來暫緩或者投放作業。列表 9 展示了如何投放被暫緩的作業。查看 lp 命令的 man 頁面了解其它選項的信息。

[ian@atticf27 ~]$ lp -i 13 -H resume

列表 9. 重啟一個暫緩的列印作業

並不是所有的可用印表機都支持相同的選項集。使用 lpoptions 命令去查看一個印表機的常用選項。添加 -l 選項去顯示印表機專用的選項。列表 10 展示了兩個示例。許多常見的選項涉及到人像/風景列印、頁面大小和輸出在紙張上的布局。詳細信息查看 man 頁面。

[ian@atticf27 ~]$ lpoptions -p HL-2280DW
copies=1 device-uri=dnssd://Brother%20HL-2280DW._pdl-datastream._tcp.local/
finishings=3 job-cancel-after=10800 job-hold-until=no-hold job-priority=50
job-sheets=none,none marker-change-time=1517325288 marker-colors=#000000,#000000
marker-levels=-1,92 marker-names='Black Toner Cartridge,Drum Unit'
marker-types=toner,opc number-up=1 printer-commands=none
printer-info='Brother HL-2280DW' printer-is-accepting-jobs=true
printer-is-shared=true printer-is-temporary=false printer-location
printer-make-and-model='Brother HL-2250DN - CUPS+Gutenprint v5.2.13 Simplified'
printer-state=3 printer-state-change-time=1517325288 printer-state-reasons=none
printer-type=135188 printer-uri-supported=ipp://localhost/printers/HL-2280DW
sides=one-sided

[ian@atticf27 ~]$ lpoptions -l -p xp-610
PageSize/Media Size: *Letter Legal Executive Statement A4
ColorModel/Color Model: *Gray Black
InputSlot/Media Source: *Standard ManualAdj Manual MultiPurposeAdj MultiPurpose
UpperAdj Upper LowerAdj Lower LargeCapacityAdj LargeCapacity
StpQuality/Print Quality: None Draft *Standard High
Resolution/Resolution: *301x300dpi 150dpi 300dpi 600dpi
Duplex/2-Sided Printing: *None DuplexNoTumble DuplexTumble
StpiShrinkOutput/Shrink Page If Necessary to Fit Borders: *Shrink Crop Expand
StpColorCorrection/Color Correction: *None Accurate Bright Hue Uncorrected
Desaturated Threshold Density Raw Predithered
StpBrightness/Brightness: 0 100 200 300 400 500 600 700 800 900 *None 1100
1200 1300 1400 1500 1600 1700 1800 1900 2000 Custom.REAL
StpContrast/Contrast: 0 100 200 300 400 500 600 700 800 900 *None 1100 1200
1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300 2400 2500 2600 2700
2800 2900 3000 3100 3200 3300 3400 3500 3600 3700 3800 3900 4000 Custom.REAL
StpImageType/Image Type: None Text Graphics *TextGraphics Photo LineArt

列表 10. 檢查印表機選項

大多數的 GUI 應用程序有一個列印對話框,通常你可以使用 文件 >列印 菜單去選擇它。圖 1 展示了在 GIMP 中的一個示例,GIMP 是一個圖像處理程序。

Printing from the GIMP

圖 1. 在 GIMP 中列印

到目前為止,我們所有的命令都是隱式指向到本地的 CUPS 列印伺服器上。你也可以通過指定 -h 選項和一個埠號(如果不是 CUPS 的默認埠號 631 的話)將列印轉向到另外一個系統上的伺服器。

CUPS 和 CUPS 伺服器

CUPS 列印系統的核心是 cupsd 列印伺服器,它是一個運行的守護進程。CUPS 配置文件一般位於 /etc/cups/cupsd.conf/etc/cups 目錄也有與 CUPS 相關的其它的配置文件。CUPS 一般在系統初始化期間啟動,根據你的發行版不同,它也可能通過位於 /etc/rc.d/init.d 或者 /etc/init.d 目錄中的 CUPS 腳本來控制。對於 最新使用 systemd 來初始化的系統,CUPS 服務腳本可能在 /usr/lib/systemd/system/cups.service 中。和大多數使用腳本的服務一樣,你可以停止、啟動、或者重啟守護程序。查看我們的教程:學習 Linux,101:運行級別、引導目標、關閉、和重啟動,了解使用初始化腳本的更多信息。

配置文件 /etc/cups/cupsd.conf 包含一些管理參數,比如訪問列印系統、是否允許遠程列印、本地列印池文件等等。在一些系統上,第二部分單獨描述了列印隊列,它一般是由配置工具自動生成的。列表 11 展示了一個默認的 cupsd.conf 文件中的一些條目。注意,注釋是以 # 字元開頭的。默認值通常以注釋的方式顯示,並且可以通過刪除前面的 # 字元去改變默認值。

# Only listen for connections from the local machine.
Listen localhost:631
Listen /var/run/cups/cups.sock

# Show shared printers on the local network.
Browsing On
BrowseLocalProtocols dnssd

# Default authentication type, when authentication is required...
DefaultAuthType Basic

# Web interface setting...
WebInterface Yes

# Set the default printer/job policies...
<Policy default>
 # Job/subscription privacy...
 JobPrivateAccess default
 JobPrivateValues default
 SubscriptionPrivateAccess default
 SubscriptionPrivateValues default

 # Job-related operations must be done by the owner or an administrator...
 <Limit Create-Job Print-Job Print-URI Validate-Job>
 Order deny,allow
 </Limit>

列表 11. 默認的 /etc/cups/cupsd.conf 文件的部分內容

可以用在 cupsd.conf 中使用的文件、目錄、和用戶配置命令,現在都存儲在作為替代的 cups-files.conf 中。這是為了防範某些類型的提權攻擊。列表 12 展示了 cups-files.conf 文件中的一些條目。注意,正如在文件層次結構標準(FHS)中所期望的那樣,列印池文件默認保存在文件系統的 /var/spool 目錄中。查看 man 頁面了解 cupsd.confcups-files.conf 配置文件的更多信息。

# Location of the file listing all of the local printers...
#Printcap /etc/printcap

# Format of the Printcap file...
#PrintcapFormat bsd
#PrintcapFormat plist
#PrintcapFormat solaris

# Location of all spool files...
#RequestRoot /var/spool/cups

# Location of helper programs...
#ServerBin /usr/lib/cups

# SSL/TLS keychain for the scheduler...
#ServerKeychain ssl

# Location of other configuration files...
#ServerRoot /etc/cups

列表 12. 默認的 /etc/cups/cups-files.conf 配置文件的部分內容

列表 12 提及了 /etc/printcap 文件。這是 LPD 列印伺服器的配置文件的名字,並且一些應用程序仍然使用它去確定可用的印表機和它們的屬性。它通常是在 CUPS 系統上自動生成的,因此,你可能沒有必要去修改它。但是,如果你在診斷用戶列印問題,你可能需要去檢查它。列表 13 展示了一個示例。

# This file was automatically generated by cupsd(8) from the
# /etc/cups/printers.conf file. All changes to this file
# will be lost.
HL-2280DW|Brother HL-2280DW:rm=atticf27:rp=HL-2280DW:
anyprint|Any available printer_rm=atticf27:rp=anyprint:
XP-610|EPSON XP-610 Series_rm=atticf27:rp=XP-610:

列表 13. 自動生成的 /etc/printcap

這個文件中的每一行都有一個印表機名字、印表機描述,遠程機器(rm)的名字、以及那個遠程機器上的遠程印表機(rp)。老的 /etc/printcap 文件也描述了印表機的能力。

文件轉換過濾器

你可以使用 CUPS 列印許多類型的文件,包括明文的文本文件、PDF、PostScript、和各種格式的圖像文件,你只需要提供要列印的文件名,除此之外你再無需向 lprlp 命令提供更多的信息。這個神奇的壯舉是通過使用過濾器來實現的。實際上,這些年來最流行的過濾器就就叫做 magicfilter(神奇的過濾器)。

當列印一個文件時,CUPS 使用多用途網際網路郵件擴展(MIME)類型去決定合適的轉換過濾器。其它的列印數據包可能使用由 file 命令使用的神奇數字機制。關於 file 或者神奇數的更多信息可以查看它們的 man 頁面。

輸入文件被過濾器轉換成中間層的光柵格式或者 PostScript 格式。一些作業信息,比如列印數量也會被添加進去。數據最終通過一個後端發送到目標印表機。還有一些可以用手動過濾的輸入文件的過濾器(如 a2ps 或 dvips)。你可以通過這些過濾器獲得特殊格式的結果,或者去處理一些 CUPS 原生並不支持的文件格式。

添加印表機

CUPS 支持多種印表機,包括:

  • 本地連接的並行口和 USB 口印表機
  • 網際網路列印協議(IPP)印表機
  • 遠程 LPD 印表機
  • 使用 SAMBA 的 Microsoft® Windows® 印表機
  • 使用 NCP 的 Novell 印表機
  • HP Jetdirect 印表機

當系統啟動或者設備連接時,現在的大多數系統都會嘗試自動檢測和自動配置本地硬體。同樣,許多網路印表機也可以被自動檢測到。使用 CUPS 的 web 管理工具(http://localhost:631 或者 http://127.0.0.1:631)去搜索或添加印表機。許多發行版都包含它們自己的配置工具,比如,在 SUSE 系統上的 YaST。圖 2 展示了使用 localhost:631 的 CUPS 界面,圖 3 展示了 Fedora 27 上的 GNOME 印表機設置對話框。

Using the CUPS web interface

圖 2. 使用 CUPS 的 web 界面

Using printer settings on Fedora 27

圖 3. Fedora 27 上的印表機設置

你也可以從命令行配置印表機。在配置印表機之前,你需要一些關於印表機和它的連接方式的基本信息。如果是一個遠程系統,你還需要一個用戶 ID 和密碼。

你需要去知道你的印表機使用什麼樣的驅動程序。不是所有的印表機都支持 Linux,有些印表機在 Linux 上壓根就不能使用,或者功能受限。你可以去 OpenPrinting.org 去查看是否有你的特定的印表機的驅動程序。lpinfo 命令也可以幫你識別有效的設備類型和驅動程序。使用 -v 選項去列出支持的設備,使用 -m 選項去列出驅動程序,如列表 14 所示。

[ian@atticf27 ~]$ lpinfo -m | grep -i xp-610
lsb/usr/Epson/epson-inkjet-printer-escpr/Epson-XP-610_Series-epson-escpr-en.ppd.gz
EPSON XP-610 Series, Epson Inkjet Printer Driver (ESC/P-R) for Linux
[ian@atticf27 ~]$ locate "Epson-XP-610_Series-epson-escpr-en.ppd.gz"
/usr/share/ppd/Epson/epson-inkjet-printer-escpr/Epson-XP-610_Series-epson-escpr-en.ppd.gz
[ian@atticf27 ~]$ lpinfo -v
network socket
network ipps
network lpd
network beh
network ipp
network http
network https
direct hp
serial serial:/dev/ttyS0?baud=115200
direct parallel:/dev/lp0
network smb
direct hpfax
network dnssd://Brother%20HL-2280DW._pdl-datastream._tcp.local/
network dnssd://EPSON%20XP-610%20Series._ipp._tcp.local/?uuid=cfe92100-67c4-11d4-a45f-ac18266c48aa
network lpd://BRN001BA98A1891/BINARY_P1
network lpd://192.168.1.38:515/PASSTHRU

列表 14. 可用的印表機驅動程序

這個 Epson-XP-610_Series-epson-escpr-en.ppd.gz 驅動程序在我的系統上位於 /usr/share/ppd/Epson/epson-inkjet-printer-escpr/ 目錄中。

如果你找不到驅動程序,你可以到印表機生產商的網站看看,說不定會有專用的驅動程序。例如,在寫這篇文章的時候,Brother 就有一個我的 HL-2280DW 印表機的驅動程序,但是,這個驅動程序在 OpenPrinting.org 上還沒有列出來。

如果你收集齊了基本信息,你可以如列表 15 所示的那樣,使用 lpadmin 命令去配置印表機。為此,我將為我的 HL-2280DW 印表機創建另外一個實例,以便於雙面列印。

[ian@atticf27 ~]$ lpinfo -m | grep -i "hl.*2280"
HL2280DW.ppd Brother HL2280DW for CUPS
lsb/usr/HL2280DW.ppd Brother HL2280DW for CUPS
[ian@atticf27 ~]$ lpadmin -p HL-2280DW-duplex -E -m HL2280DW.ppd 
> -v dnssd://Brother%20HL-2280DW._pdl-datastream._tcp.local/ 
> -D "Brother 1" -o sides=two-sided-long-edge
[ian@atticf27 ~]$ lpstat -a
anyprint accepting requests since Mon 29 Jan 2018 01:17:09 PM EST
HL-2280DW accepting requests since Tue 30 Jan 2018 10:56:10 AM EST
HL-2280DW-duplex accepting requests since Wed 31 Jan 2018 11:41:16 AM EST
HXP-610 accepting requests since Mon 29 Jan 2018 10:34:49 PM EST

列表 15. 配置一台印表機

你可以使用帶 -c 選項的 lpadmin 命令去創建一個僅用於雙面列印的新分類,而不用為了雙面列印去創建一個印表機的副本。

如果你需要刪除一台印表機,使用帶 -x 選項的 lpadmin 命令。

列表 16 展示了如何去刪除印表機和創建一個替代類。

[ian@atticf27 ~]$ lpadmin -x HL-2280DW-duplex
[ian@atticf27 ~]$ lpadmin -p HL-2280DW -c duplex -E -D "Duplex printing" -o sides=two-sided-long-edge
[ian@atticf27 ~]$ cupsenable duplex
[ian@atticf27 ~]$ cupsaccept duplex
[ian@atticf27 ~]$ lpstat -a
anyprint accepting requests since Mon 29 Jan 2018 01:17:09 PM EST
duplex accepting requests since Wed 31 Jan 2018 12:12:05 PM EST
HL-2280DW accepting requests since Wed 31 Jan 2018 11:51:16 AM EST
XP-610 accepting requests since Mon 29 Jan 2018 10:34:49 PM EST

列表 16. 刪除一個印表機和創建一個類

你也可以使用 lpadmin 或者 lpoptions 命令去設置各種印表機選項。詳細信息請查看 man 頁面。

排錯

如果你有列印問題,嘗試下列的提示:

  • 確保 CUPS 伺服器正在運行。你可以使用 lpstat 命令,如果它不能連接到 cupsd 守護程序,它將會報告一個錯誤。或者,你可以使用 ps -ef 命令在輸出中去檢查是否有 cupsd。
  • 如果你試著排隊一個列印作業而得到一個錯誤信息,指示印表機不接受這個作業,你可以使用 lpstat -a 或者 lpc status 去檢查那個印表機是否接受作業。
  • 如果一個隊列中的作業沒有列印,使用 lpstat -plpc status 去檢查那個印表機是否接受作業。如前面所討論的那樣,你可能需要將這個作業移動到其它的印表機。
  • 如果這個印表機是遠程的,檢查它在遠程系統上是否存在,並且是可操作的。
  • 檢查配置文件,確保特定的用戶或者遠程系統允許在這個印表機上列印。
  • 確保防火牆允許遠程列印請求,是否允許從其它系統到你的系統,或者從你的系統到其它系統的數據包通訊。
  • 驗證是否有正確的驅動程序。

正如你所見,列印涉及到你的系統中的幾個組件,甚至還有網路。在本教程中,基於篇幅的考慮,我們僅能給你的診斷提供了幾個著手點。大多數的 CUPS 系統也有實現我們所討論的命令行功能的圖形界面。一般情況下,這個界面是從本地主機使用瀏覽器指向 631 埠(http://localhost:631http://127.0.0.1:631)來訪問的,如前面的圖 2 所示。

你可以通過將 CUPS 運行在前台而不是做為一個守護進程來診斷它的問題。如果有需要,你也可以通過這種方式去測試替代的配置文件。運行 cupsd -h 獲得更多信息,或者查看 man 頁面。

CUPS 也帶有一個訪問日誌和錯誤日誌。你可以在 cupsd.conf 中使用 LogLevel 語句來改變日誌級別。默認情況下,日誌是保存在 /var/log/cups 目錄。它們可以在瀏覽器界面(http://localhost:631)下,從 Administration 選項卡中查看。使用不帶任何選項的 cupsctl 命令可以顯示日誌選項。也可以編輯 cupsd.conf 或者使用 cupsctl 去調整各種日誌參數。查看 cupsctl 命令的 man 頁面了解更多信息。

在 Ubuntu 的 Wiki 頁面上的 調試列印問題 頁面也是一個非常好的學習的地方。

這就是關於列印和 CUPS 的介紹。

via: https://www.ibm.com/developerworks/library/l-lpic1-108-4/index.html

作者:Ian Shields 譯者:qhwdw 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國