首頁 > 軟體

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

2020-06-16 16:53:03

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 展示了命令的一些範例。

  1. [ian@atticf27 ~]$ lpstat-d
  2. system default destination: HL-2280DW
  3. [ian@atticf27 ~]$ lpstat-v HL-2280DW
  4. device for HL-2280DW: dnssd://Brother%20HL-2280DW._pdl-datastream._tcp.local/
  5. [ian@atticf27 ~]$ lpstat-s
  6. system default destination: HL-2280DW
  7. members of class anyprint:
  8. HL-2280DW
  9. XP-610
  10. device for anyprint:///dev/null
  11. device for HL-2280DW: dnssd://Brother%20HL-2280DW._pdl-datastream._tcp.local/
  12. device for XP-610: dnssd://EPSON%20XP-610%20Series._ipp._tcp.local/?uuid=cfe92100-67c4-11d4-a45f-ac18266c48aa
  13. [ian@atticf27 ~]$ lpstat-a XP-610
  14. XP-610 accepting requests since Thu27Apr201705:53:59 PM EDT
  15. [ian@atticf27 ~]$ /usr/sbin/lpc status HL-2280DW
  16. HL-2280DW:
  17. printer is on device 'dnssd' speed -1
  18. queuing is disabled
  19. printing is enabled
  20. no entries
  21. 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 命令則不會顯示它。

  1. [ian@atticf27 ~]$ lpstat-a -p HL-2280DW
  2. anyprint accepting requests since Mon29Jan201801:17:09 PM EST
  3. HL-2280DWnot accepting requests since Thu27Apr201705:52:27 PM EDT -
  4. Maintenance scheduled
  5. XP-610 accepting requests since Thu27Apr201705:53:59 PM EDT
  6. printer HL-2280DWis idle. enabled since Thu27Apr201705:52:27 PM EDT
  7. Maintenance scheduled
  8. [ian@atticf27 ~]$ accept HL-2280DW
  9. [ian@atticf27 ~]$ cupsdisable -r "waiting for toner delivery" HL-2280DW
  10. [ian@atticf27 ~]$ lpstat-p -a
  11. printer anyprint is idle. enabled since Mon29Jan201801:17:09 PM EST
  12. printer HL-2280DW disabled since Mon29Jan201804:03:50 PM EST -
  13. waiting for toner delivery
  14. printer XP-610is idle. enabled since Thu27Apr201705:53:59 PM EDT
  15. anyprint accepting requests since Mon29Jan201801:17:09 PM EST
  16. HL-2280DW accepting requests since Mon29Jan201804:03:50 PM EST
  17. XP-610 accepting requests since Thu27Apr201705:53:59 PM EDT

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

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

 

管理使用者列印作業

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

  1. [pat@atticf27 ~]$ #As user pat (non-administrator)
  2. [pat@atticf27 ~]$ lpq
  3. HL-2280DWisnot ready
  4. RankOwnerJobFile(s)TotalSize
  5. 1st unknown 4 unknown 6144 bytes
  6. 2nd pat 6 bitlib.h 6144 bytes
  7. 3rd pat 7 bitlib.C 6144 bytes
  8. 4th unknown 8 unknown 1024 bytes
  9. 5th unknown 9 unknown 1024 bytes
  10. [ian@atticf27 ~]$ #As user ian (administrator)
  11. [ian@atticf27 ~]$ lpq -P xp-610
  12. xp-610is ready
  13. no entries
  14. [ian@atticf27 ~]$ lpq -a
  15. RankOwnerJobFile(s)TotalSize
  16. 1st ian 4 permutation.C 6144 bytes
  17. 2nd pat 6 bitlib.h 6144 bytes
  18. 3rd pat 7 bitlib.C 6144 bytes
  19. 4th ian 8.bashrc 1024 bytes
  20. 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 那樣,指定一個要刪除的作業列表。

  1. [[pat@atticf27 ~]$ #As user pat (non-administrator)
  2. [pat@atticf27 ~]$ lprm
  3. lprm:Forbidden
  4. [ian@atticf27 ~]$ #As user ian (administrator)
  5. [ian@atticf27 ~]$ lprm 8
  6. [ian@atticf27 ~]$ lpq
  7. HL-2280DWisnot ready
  8. RankOwnerJobFile(s)TotalSize
  9. 1st ian 4 permutation.C 6144 bytes
  10. 2nd pat 6 bitlib.h 6144 bytes
  11. 3rd pat 7 bitlib.C 6144 bytes
  12. 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 命令可以提供更詳細的輸出。

  1. [ian@atticf27 ~]$ lpq
  2. HL-2280DWisnot ready
  3. RankOwnerJobFile(s)TotalSize
  4. 1st ian 4 permutation.C 6144 bytes
  5. 2nd pat 6 bitlib.h 6144 bytes
  6. 3rd pat 7 bitlib.C 6144 bytes
  7. 4th ian 9.bashrc 1024 bytes
  8. [ian@atticf27 ~]$ lp-i 9-q 60-n 2
  9. [ian@atticf27 ~]$ lpq
  10. HL-2280DWisnot ready
  11. RankOwnerJobFile(s)TotalSize
  12. 1st ian 9.bashrc 1024 bytes
  13. 2nd ian 4 permutation.C 6144 bytes
  14. 3rd pat 6 bitlib.h 6144 bytes
  15. 4th pat 7 bitlib.C 6144 bytes

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

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

  1. [ian@atticf27 ~]$ lpmove HL-2280DW-9 anyprint
  2. [ian@atticf27 ~]$ lpmove HL-2280DW xp-610
  3. [ian@atticf27 ~]$ lpq -a
  4. RankOwnerJobFile(s)TotalSize
  5. active ian 9.bashrc 1024 bytes
  6. 1st ian 4 permutation.C 6144 bytes
  7. 2nd pat 6 bitlib.h 6144 bytes
  8. 3rd pat 7 bitlib.C 6144 bytes
  9. [ian@atticf27 ~]$ # A few minutes later
  10. [ian@atticf27 ~]$ lpq -a
  11. RankOwnerJobFile(s)TotalSize
  12. active pat 6 bitlib.h 6144 bytes
  13. 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。

  1. [ian@atticf27 ~]$ echo"Print this text"> printexample.txt
  2. [ian@atticf27 ~]$ lpr printexample.txt
  3. [ian@atticf27 ~]$ lp printexample.txt
  4. request idis HL-2280DW-12(1file(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 展示了一些選項。我要求列印之後給我發確認電子郵件,那個作業被暫緩執行,並且在列印之後刪除檔案。

  1. [ian@atticf27 ~]$ lpr-P HL-2280DW-J "Ian's text file"-#2-m -p -q -r printexample.txt
  2. [[ian@atticf27 ~]$ lpq -l
  3. HL-2280DWis ready
  4. ian:1st[job 13 localhost]
  5. 2 copies of Ian's text file 1024 bytes
  6. [ian@atticf27 ~]$ ls printexample.txt
  7. ls: cannot access 'printexample.txt': No such file or directory

列表 8. 使用 lpr 列印

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

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

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

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

  1. [ian@atticf27 ~]$ lpoptions -p HL-2280DW
  2. copies=1 device-uri=dnssd://Brother%20HL-2280DW._pdl-datastream._tcp.local/
  3. finishings=3 job-cancel-after=10800 job-hold-until=no-hold job-priority=50
  4. job-sheets=none,none marker-change-time=1517325288 marker-colors=#000000,#000000
  5. marker-levels=-1,92 marker-names='Black Toner Cartridge,Drum Unit'
  6. marker-types=toner,opc number-up=1 printer-commands=none
  7. printer-info='Brother HL-2280DW' printer-is-accepting-jobs=true
  8. printer-is-shared=true printer-is-temporary=false printer-location
  9. printer-make-and-model='Brother HL-2250DN - CUPS+Gutenprint v5.2.13 Simplified'
  10. printer-state=3 printer-state-change-time=1517325288 printer-state-reasons=none
  11. printer-type=135188 printer-uri-supported=ipp://localhost/printers/HL-2280DW
  12. sides=one-sided
  13. [ian@atticf27 ~]$ lpoptions -l -p xp-610
  14. PageSize/MediaSize:*LetterLegalExecutiveStatement A4
  15. ColorModel/ColorModel:*GrayBlack
  16. InputSlot/MediaSource:*StandardManualAdjManualMultiPurposeAdjMultiPurpose
  17. UpperAdjUpperLowerAdjLowerLargeCapacityAdjLargeCapacity
  18. StpQuality/PrintQuality:NoneDraft*StandardHigh
  19. Resolution/Resolution:*301x300dpi150dpi300dpi600dpi
  20. Duplex/2-SidedPrinting:*NoneDuplexNoTumbleDuplexTumble
  21. StpiShrinkOutput/ShrinkPageIfNecessary to FitBorders:*ShrinkCropExpand
  22. StpColorCorrection/ColorCorrection:*NoneAccurateBrightHueUncorrected
  23. DesaturatedThresholdDensityRawPredithered
  24. StpBrightness/Brightness:0100200300400500600700800900*None1100
  25. 120013001400150016001700180019002000Custom.REAL
  26. StpContrast/Contrast:0100200300400500600700800900*None11001200
  27. 130014001500160017001800190020002100220023002400250026002700
  28. 2800290030003100320033003400350036003700380039004000Custom.REAL
  29. StpImageType/ImageType:NoneTextGraphics*TextGraphicsPhotoLineArt

列表 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:執行級別、引導目標、關閉、和重新啟動動,了解使用初始化指令碼的更多資訊。

組態檔 /etc/cups/cupsd.conf 包含一些管理引數,比如存取列印系統、是否允許遠端列印、本地列印池檔案等等。在一些系統上,第二部分單獨描述了列印佇列,它一般是由設定工具自動生成的。列表 11 展示了一個預設的 cupsd.conf 檔案中的一些條目。注意,注釋是以 # 字元開頭的。預設值通常以注釋的方式顯示,並且可以通過刪除前面的 # 字元去改變預設值。

  1. #Only listen for connections from the local machine.
  2. Listen localhost:631
  3. Listen/var/run/cups/cups.sock
  4. #Show shared printers on the local network.
  5. BrowsingOn
  6. BrowseLocalProtocols dnssd
  7. #Default authentication type,when authentication is required...
  8. DefaultAuthTypeBasic
  9. #Webinterface setting...
  10. WebInterfaceYes
  11. #Set the default printer/job policies...
  12. <Policydefault>
  13. #Job/subscription privacy...
  14. JobPrivateAccessdefault
  15. JobPrivateValuesdefault
  16. SubscriptionPrivateAccessdefault
  17. SubscriptionPrivateValuesdefault
  18. #Job-related operations must be done by the owner or an administrator...
  19. <LimitCreate-JobPrint-JobPrint-URI Validate-Job>
  20. Order deny,allow
  21. </Limit>

列表 11. 預設的 /etc/cups/cupsd.conf 檔案的部分內容

可以用在 cupsd.conf 中使用的檔案、目錄、和使用者設定命令,現在都儲存在作為替代的 cups-files.conf 中。這是為了防範某些型別的提權攻擊。列表 12 展示了 cups-files.conf 檔案中的一些條目。注意,正如在檔案層次結構標準(FHS)中所期望的那樣,列印池檔案預設儲存在檔案系統的 /var/spool 目錄中。檢視 man 頁面了解 cupsd.confcups-files.conf 組態檔的更多資訊。

  1. #Location of the file listing all of the local printers...
  2. #Printcap/etc/printcap
  3. #Format of the Printcapfile...
  4. #PrintcapFormat bsd
  5. #PrintcapFormat plist
  6. #PrintcapFormat solaris
  7. #Location of all spool files...
  8. #RequestRoot/var/spool/cups
  9. #Location of helper programs...
  10. #ServerBin/usr/lib/cups
  11. # SSL/TLS keychain for the scheduler...
  12. #ServerKeychain ssl
  13. #Location of other configuration files...
  14. #ServerRoot/etc/cups

列表 12. 預設的 /etc/cups/cups-files.conf 組態檔的部分內容

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

  1. #Thisfile was automatically generated by cupsd(8)from the
  2. # /etc/cups/printers.conf file.All changes to thisfile
  3. # will be lost.
  4. HL-2280DW|Brother HL-2280DW:rm=atticf27:rp=HL-2280DW:
  5. anyprint|Any available printer:rm=atticf27:rp=anyprint:
  6. XP-610|EPSON XP-610Series: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 印表機設定對話方塊。

圖 2. 使用 CUPS 的 web 介面

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

你也可以從命令列設定印表機。在設定印表機之前,你需要一些關於印表機和它的連線方式的基本資訊。如果是一個遠端系統,你還需要一個使用者 ID 和密碼。

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

  1. [ian@atticf27 ~]$ lpinfo -m |grep-i xp-610
  2. lsb/usr/Epson/epson-inkjet-printer-escpr/Epson-XP-610_Series-epson-escpr-en.ppd.gz
  3. EPSON XP-610Series,EpsonInkjetPrinterDriver(ESC/P-R)forLinux
  4. [ian@atticf27 ~]$ locate"Epson-XP-610_Series-epson-escpr-en.ppd.gz"
  5. /usr/share/ppd/Epson/epson-inkjet-printer-escpr/Epson-XP-610_Series-epson-escpr-en.ppd.gz
  6. [ian@atticf27 ~]$ lpinfo -v
  7. network socket
  8. network ipps
  9. network lpd
  10. network beh
  11. network ipp
  12. network http
  13. network https
  14. direct hp
  15. serial serial:/dev/ttyS0?baud=115200
  16. direct parallel:/dev/lp0
  17. network smb
  18. direct hpfax
  19. network dnssd://Brother%20HL-2280DW._pdl-datastream._tcp.local/
  20. network dnssd://EPSON%20XP-610%20Series._ipp._tcp.local/?uuid=cfe92100-67c4-11d4-a45f-ac18266c48aa
  21. network lpd://BRN001BA98A1891/BINARY_P1
  22. 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 印表機建立另外一個範例,以便於雙面列印。

  1. [ian@atticf27 ~]$ lpinfo -m |grep-i "hl.*2280"
  2. HL2280DW.ppd Brother HL2280DW for CUPS
  3. lsb/usr/HL2280DW.ppd Brother HL2280DW for CUPS
  4. [ian@atticf27 ~]$ lpadmin -p HL-2280DW-duplex -E -m HL2280DW.ppd
  5. >-v dnssd://Brother%20HL-2280DW._pdl-datastream._tcp.local/
  6. >-D "Brother 1"-o sides=two-sided-long-edge
  7. [ian@atticf27 ~]$ lpstat-a
  8. anyprint accepting requests since Mon29Jan201801:17:09 PM EST
  9. HL-2280DW accepting requests since Tue30Jan201810:56:10 AM EST
  10. HL-2280DW-duplex accepting requests since Wed31Jan201811:41:16 AM EST
  11. HXP-610 accepting requests since Mon29Jan201810:34:49 PM EST

列表 15. 設定一台印表機

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

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

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

  1. [ian@atticf27 ~]$ lpadmin -x HL-2280DW-duplex
  2. [ian@atticf27 ~]$ lpadmin -p HL-2280DW-c duplex -E -D "Duplex printing"-o sides=two-sided-long-edge
  3. [ian@atticf27 ~]$ cupsenable duplex
  4. [ian@atticf27 ~]$ cupsaccept duplex
  5. [ian@atticf27 ~]$ lpstat-a
  6. anyprint accepting requests since Mon29Jan201801:17:09 PM EST
  7. duplex accepting requests since Wed31Jan201812:12:05 PM EST
  8. HL-2280DW accepting requests since Wed31Jan201811:51:16 AM EST
  9. XP-610 accepting requests since Mon29Jan201810: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: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 頁面上的 偵錯列印問題 頁面也是一個非常好的學習的地方。

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


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

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

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

本文永久更新連結地址https://www.linuxidc.com/Linux/2018-04/151852.htm


IT145.com E-mail:sddin#qq.com