作者 | Ian Shields
譯者 | qhwdw ? ? ? ? ? 共計翻譯:104 篇 貢獻時間:164 天
Linux 中的列印
雖然現在大量的溝通都是電子化和無紙化的,但是在我們的公司中還有大量的材料需要列印。銀行結算單、公用事業帳單、財務和其它報告、以及收益結算單等一些東西還是需要列印的。本教程將介紹在 Linux 中如何使用 CUPS 去列印。
CUPS,是通用 Unix 列印系統的首字母縮寫,它是 Linux 中的印表機和列印任務的管理者。早期計算機上的印表機一般是在特定的字符集和字型大小下列印文字檔案行。現在的圖形印表機可以列印各種字型和大小的文字和圖形。儘管如此,現在你所使用的一些命令,在古老的行式列印守護行程(LPD)技術的歷史中仍能找到它們。
本教程將幫你瞭解 Linux 伺服器專業考試(LPIC-1)的第 108 號主題的 108.4 標的。這個標的的權重為 2。
前提條件
為了更好地學習本系列教程,你需要具備基本的 Linux 知識,和使用 Linux 系統實踐本教程中的命令的能力,你應該熟悉 GNU 和 UNIX® 命令的使用。有時不同版本的程式輸出可能會不同,因此,你的結果可能與本教程中的示例有所不同。
本教程中的示例使用的是 Fedora 27 的系統。
有關列印的一些歷史
這一小部分歷史並不是 LPI 標的的,但它有助於你理解這個標的的相關環境。
早期的計算機大都使用行式印表機。這些都是擊打式印表機,那時,它們使用固定間距的字元和單一的字型來列印文字行。為提升整個系統效能,早期的主機要與慢速的外圍裝置(如讀卡器、卡片穿孔機、和執行其它工作的行式印表機)交叉進行工作。因此就產生了線上的或者假離線的同步外圍操作,這一術語目前在談到計算機列印時仍然在使用。
在 UNIX 和 Linux 系統上,列印初始化使用的是 BSD(伯克利軟體分發版)列印子系統,它是由一個作為伺服器執行的行式列印守護程式(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 印表機所需要的最終光柵格式。
現在的行動式檔案格式(PDF),它就是基於 PostScript 的,已經替換了傳統的原始 PostScript。PDF 設計為與硬體和軟體無關,它封裝了要列印的頁面的完整描述。你可以檢視 以及列印 PDF 檔案。
管理列印佇列
使用者直接列印作業到一個名為列印佇列的邏輯物體。在單使用者系統中,列印佇列和印表機通常是幾乎相同的意思。但是,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 佇列,但是列印功能是啟用的,這樣便於將印表機離線維護之前可以完成列印佇列中的任務。啟用還是禁用佇列,可以使用 cupsaccept
和 cupsreject
命令來管理。以前它們叫做 accept
和 reject
,你或許可能在 /usr/sbin
中找到這些命令,但它們現在都是符號連結到新的命令上了。同樣,啟用還是禁用列印,你可以使用 cupsenable
和 cupsdisable
命令來管理。在早期版本的 CUPS 中,這些被稱為 enable
和 disable
,它也許會與 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
子命令包括 disable
、down
、enable
、hold
、move
、redirect
、release
、和 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 是一個影象處理程式。
圖 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:執行級別、引導標的、關閉、和重啟動[1],瞭解使用初始化指令碼的更多資訊。
配置檔案 /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.conf
和 cups-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、和各種格式的影象檔案,你只需要提供要列印的檔案名,除此之外你再無需向 lpr
或 lp
命令提供更多的資訊。這個神奇的壯舉是透過使用過濾器來實現的。實際上,這些年來最流行的過濾器就就叫做 magicfilter(神奇的過濾器)。
當列印一個檔案時,CUPS 使用多用途因特網郵件擴充套件(MIME)型別去決定合適的轉換過濾器。其它的列印資料包可能使用由 file
命令使用的神奇數字機制。關於 file
或者神奇數的更多資訊可以檢視它們的 man 頁面。
輸入檔案被過濾器轉換成中間層的光柵格式或者 PostScript 格式。一些作業資訊,比如列印數量也會被新增進去。資料最終透過一個後端傳送到標的印表機。還有一些可以用手動過濾的輸入檔案的過濾器(如 a2ps 或 dvips)。你可以透過這些過濾器獲得特殊格式的結果,或者去處理一些 CUPS 原生並不支援的檔案格式。
新增印表機
CUPS 支援多種印表機,包括:
當系統啟動或者裝置連線時,現在的大多數系統都會嘗試自動檢測和自動配置本地硬體。同樣,許多網路印表機也可以被自動檢測到。使用 CUPS 的 web 管理工具(http://localhost:631或者 http://127.0.0.1:631)去搜索或新增印表機。許多發行版都包含它們自己的配置工具,比如,在 SUSE 系統上的 YaST。圖 2 展示了使用 localhost:631 的 CUPS 介面,圖 3 展示了 Fedora 27 上的 GNOME 印表機設定對話方塊。
圖 2. 使用 CUPS 的 web 介面
圖 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 頁面。
排錯
如果你有列印問題,嘗試下列的提示:
lpstat
命令,如果它不能連線到 cupsd 守護程式,它將會報告一個錯誤。或者,你可以使用 ps -ef
命令在輸出中去檢查是否有 cupsd。lpstat -a
或者 lpc status
去檢查那個印表機是否接受作業。lpstat -p
或 lpc status
去檢查那個印表機是否接受作業。如前面所討論的那樣,你可能需要將這個作業移動到其它的印表機。正如你所見,列印涉及到你的系統中的幾個元件,甚至還有網路。在本教程中,基於篇幅的考慮,我們僅能給你的診斷提供了幾個著手點。大多數的 CUPS 系統也有實現我們所討論的命令列功能的圖形介面。一般情況下,這個介面是從本地主機使用瀏覽器指向 631 埠(http://localhost:631 或 http://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 頁面上的 除錯列印問題[4] 頁面也是一個非常好的學習的地方。
這就是關於列印和 CUPS 的介紹。
via: https://www.ibm.com/developerworks/library/l-lpic1-108-4/index.html
作者:Ian Shields[6] 譯者:qhwdw 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出