The Linux Printing Usage HOWTO 作者:Mark Komarinski <markk@auratek.com> 譯者:趙平望 <tchao@worldnet.att.net> v1.2.2, 6 February 1998 翻譯日期:2000年1月10日 說明如何使用 Linux 操作系統提供的打印機系統。 導言

HOWTOs!printing usage printing!user-level introduction 這份文件說明如何使用 Linux 操作系統提供的打印機假脫機系統,它也對專門討論 Linux 打印系統的安裝和設置的 Linux Printing Setup HOWTO 作了補充,其內容不僅適用于 Linux 操作系統,也同樣適用于各種 BSD 操作系統。 Linux Printing HOWTO 文件的演變

Mark Komarinski <markk@auratek.com> 指出:

非常感謝 Matt Foster 重寫這份 HOWTO。我儘量保留他的內容,並作出必要的增刪潤飾。

Matt Foster <mwf@engr.uark.edu> 指出:

這份 Linux Printing HOWTO 完全改寫了Grant Taylor <grant@god.tufts.edu> 和 Brian McCauley <B.A.McCauley@bham.ac.uk> 的原文。本來我打算保留 Grant 和 Brian 原來 HOWTO 中的材料,但後來幾乎全部改寫並增加了許多新材料。我認為這份 HOWTO 中的材料比較完整, 也比較容易閱讀。我希望您同意我的看法。 版本演變

v1.2.2 重新編序和作出一些改動以便編為 RedHat 文件。 v1.2.1 增訂內容和作出一些改動以便用于 Linux 出版物。 v1.2 視窗打印機。 改變打印文檔的最大長度。 v1.11 新管理員。 增加 lpc 的資料。 增加一些查錯資料。 開始編寫打印圖像的文檔。 v1.1 修正一些用語。 編寫 PostScript 打印部分。 設法進一步說明一些實例。 詳述一些 Linux 打印工具。 v1.0 Printing Usage HOWTO 首次公開發行 版權和商標

這份文件中提到的有些名字是某些人的版權和(或)商標名稱。這些名字在這份 HOWTO 中以全名或縮稱出現。

(c) 1995 Matt Foster (mwf@engr.uark.edu) (c) 1996-1997 Mark F. Komarinski (markk@auratek.com)

任何涉及 Linux HOWTO 的翻譯和作述均需載列這份版權說明。 換言之,如在此種作述中限制他人引用與 HOWTO 有關的內容就不得引用這份 HOWTO。在某些情況下, 可以有例外情況,但需與下址 Linux HOWTO 協調員聯系。

簡言之,即使這份文件儘量四處流通,但HOWTO 文件的版權還得保留,同時希望知道這份 HOWTO 文件的 流通情況。

任何問題均請與 Linux HOWTO 協調員 Tim Bynum 聯系。他的地址是 <linux-howto@sunsite.unc.edu>。不妨從他的地址查詢電話號碼和其他聯系資料。 下載 Linux Printing HOWTO

printing!downloading HOWTOs 如欲打印這份 HOWTO 文件,不妨下載這份 HOWTO 的 PostScript 版本,其編排格式更適於閱讀。這份文件的 PostScript 版本可從許多 Linux 網站取得(例如 sunsite 網站 )。 反饋意見

歡迎對本文提出建議和批評,來信請寄 <markk@auratek.com>。 致謝

非常感謝對本文初版提出許多寶貴意見的朋友 --- 有些建議已經列入本文。

我也要感謝最初改寫本文的 Matt Foster 先生。 在 Linux 系統內打印文檔

本節說明在 Linux 環境中如何打印文件、檢查列印隊列、從列印隊列刪除打印任務、 打印前文檔排版和設置打印環境等。 Linux 打印系統的演變

printing!history of Linux 打印系統 - lp 系統 - 是將加利福尼亞大學校方為 UNIX 操作系統的 BSD 版編寫的源代碼改編而成。 利用 lpr 打印文檔

printing!using lpr command lpr command!usage example 到目前為止,在 Linux 系統中打印文檔的最簡單方法就是將文檔直接送到打印設備打印。使用 cat 指令就是方法之一。作為 root,發送下列指令就可打印文檔: # cat thesis.txt > /dev/lp 在這個例子中,/dev/lp 是實際打印設備的符號連接 - 不論打印機是點陣列印機、激光打印機、 排版打印機或圖表打印機均可使用這個指令。(關於符號連接的進一步說明見 ln(1))

由于安全上的考量,只有 root 和屬於打印監控程式的同一群組的使用者才可書寫到打印機, 使打印機進行打印。這就是必需使用 lprlprmlpq 等指令才能使用打印機的理由。

因此,使用者必需使用 lpr 列印文檔。lpr 為打印進行所有初始設定, 然後將任務交給打印監控程序 - lpd。這個打印監控程序隨即告知打印機如何打印文檔。

lpr 執行過程中,它首先將有待打印的文檔抄到一個目錄(假脫機目錄), 然後讓該文檔留在該目錄中等待 lpd 進行打印。一旦 lpd 得知有文檔等待打印, 它就自行生成一個備份(編程員稱為派生(forking))。這個派生的 lpd 監控程序就會打印有待打印的文檔, 同時原 lpd 仍繼續等待後面可能發出的打印指令。通過這種方式,Linux 系統可同時處理列隊打印任務。

使用 lpr(1) 指令的語法如下: $ lpr [ options ] [ filename ... ] # # (譯註:$ lpr [ 選項 ] [ 文檔名 ... ]) # 如果 filename (譯註:文檔名)沒有標示,lpr 認為將由標準輸入口(通常為鍵盤或另一程式的輸出)提供輸入。通過這種方法, 使用者可將一個程式的輸出導入打印假脫機程序。例如, $ cat thesis.txt | lpr $ pr -l60 thesis.txt | lpr 均把運行的結果導入打印機印出。 lpr 指令還接受各種打印選項參數,使使用者能控制打印方式。最常用的選項參數有: -lpr 的例子如下: $ lpr -#2 -sP dj thesis.txt 這個指令會在假脫機目錄內為稱為 dj 的打印機建立一個連接 thesis.txt 文檔的符號連接,然後由 lpd 對其進行打印。印完之後,它還會再打印一次 thesis.txt (譯註:共印兩份)。

關於 lpr 使用的所有選項參數,見 lpr(1)。 利用 lpq 察看打印隊列

printing!using lpq command lpq command!usage example 使用 lpq 指令可察看當前的打印隊列。如直接使用指令,不加選項參數, 可察看默認打印機的打印隊列情況。

lpq 的結果有許多用途。 $ lpq lp is ready and printing (譯註:打印機準備打印,下面列出打印信息) Rank Owner Job Files Total Size active mwf 31 thesis.txt 682048 bytes 利用 lprm 取消打印任務

printing!using lprm command lprm command!usage example 對任何一個打印系統而言,都需要有一個取消打印任務的工具軟件。在 Linux 系統中,可用 lprm $ lprm - 上述指令取消使用者發出的所有打印指令。如果只要取消一個打印任務,可用 lpq 查明打印任務編號,然後將該編號作為參數用于 lprm 指令。例如: $ lprm 31 取消默認打印機第 31 號打印任務 (thesis.txt)。 利用 lpc 控制 lpd 程序

printing!using lpc command lpc command!usage example lpc(8) 程式用來控制 lpd 提供打印的打印機。通過 lpc 程式可控制打印機的打印功能、 打印任務列隊、重新安排列隊次序和提供打印機和列隊狀況。 lpc 多數用于設置系統時一機配置多打印機的情況。 $ lpc 上述指令啟動 lpc 程式。在不設置任何參數的情況下,這使用戶進入互動模式,此後可開始輸入指令。 使用 lpc 的另一個方式是從指令行輸入參數。 $ lpc status all 所有可用的指令均在 lpd 的使用說明(man page)內可以查到。此處列出一些主要指令。指令中作為 選項 列出的部分可以是打印機名(lp、print 等)或關鍵字 all,此處表示所有打印機。 disable 選項 - 不讓打印機再接受新的打印任務 down 選項 - 停止打印機的一切打印 enable 選項 - 允許打印任務進入打印列隊 quit (或 exit) - 停止 lpc 運行 restart 選項 - 重新開始打印機的 lpd status 選項 - 印出打印機的機況 up 選項 - 重新起始並開始新的 lpd RedHat 的打印工具(printtool)

printing!using Red Hat printool Red Hat Linux!printool printool utility RedHat 的 printtool 是一個非常好用的工具。它幾乎無所不能。下文說明如何通過 RedHat 4.0 在并聯埠接連 HP LJ 4L 的方法(此法也可用于其他 RedHat 版本)。 以 root 身份登錄,並啟動 printtool (如果作為 su ,還記得 SETENV DISPLAY :0.0 和 xhost + 嗎?) 按 "Add",然後在本地打印機項按 "OK" 填入打印機名稱 (如 /dev/lp1) 填入參數 - 選擇打印機種類、分辨率和紙張大小 (ljet4、300x300 和 信紙尺寸) 按 "OK" 一直到底,重新啟動 lpd。 利用這種方法可為一台打印機設定多種打印方式,例如為各種打印設定不同的紙張尺寸、分辨率等。 打印文檔

printing!by file type 本節說明在 Linux 設定中設定打印的文檔類別。 打印圖像檔

printing!graphics files 用打印機打印圖像檔通常取決于圖像轉換的類別和用何種打印機打印。點陣打印機一般不適合打印圖像, 因為點陣打印機無法適當處理圖案。在這種情況下,如果打印機是是類似Epson 或IBM ProPrinter 的打印機,則可將圖像轉換成 PostScript 格式,然後利用 Ghostscript (見下節)打印圖像。

如果接連的打印機是激光打印機,打印圖像就比較簡單,因為多數激光打印機都于 PCL 兼容。 如果不兼容,也可利用 NetPBM 等軟件將圖像轉換成 PCL 格式。 最後一種辦法就是使用 Ghostscript (見下節)。

打印圖像的最好辦法是安裝 NetPBM 和 Ghostscript 等軟件,然後安裝 magic filter 自動處理圖像檔。 打印 PostScript 檔

printing!Postscript files Postscript!printing 在有 PostScript 識別軟件的打印機上打印 PostScript 檔是件簡單不過的事; 只需使用 lpr 指令,其他打印工作都會由打印機自動處理。如果打印機不具備處理 PostScript 的能力,那就得另想辦法。幸好有軟件可了解 PostScript 的打印需求,使多數打印機都能使用。 在這方面,最常用的軟件可能就是 Ghostscript。

Ghostscript 的任務就是將 PostScript 檔中的所有排版指令轉換成打印機能夠執行的指令。 利用 Ghostscript 打印 PostScript 檔,可能需要利用下列指令: $ gs -dSAFER -dNOPAUSE -sDEVICE=deskjet -sOutputFile=\|lpr thesis.ps 注意上例中事實上利用導入( pipe )的方式將 Ghostscript 的轉換結果利用 -lpr 打印。 利用 Ghostview 工具可在打印之前查看 X 視窗系統中利用 Ghostscript 打印 PostScript 檔的情況。 Ghostview 和Ghostscript 可從網址 下載。 打印 PDF 檔

printing!PDF files printing!Acrobat files PDF files!printing Acrobat files!printing Adobe 公司為 Linux 系統編制了 Acrobat 閱讀器。這個閱讀器可從 Adobe 公司主頁 下載。同時也可使用這個閱讀器的前一版本 xpdf。 這兩個打印軟件均可用于 postscript 打印機。 打印 TeX 檔

printing!TeX files TeX files!printing 打印 TeX 檔的最簡便方法是將其轉換成 PostScript 格式,然後用 Ghostscript 打印。 要利用這種方法打印,首先得將文檔轉換成一種稱為 DVI (device-independent 的縮稱)的格式。 這可利用 tex(1) 指令完成。然後利用 dvips 指令將 DVI 檔轉換成 PostScript 檔。 指令的使用方式如下: $ tex thesis.tex $ dvips thesis.dvi 然後就可利用前面提到的指令打印最後生成的 PostScript 檔。 打印 troff 格式的文檔

printing!troff files troff files!printing $ groff -Tascii thesis.tr | lpr 或可用下列方式: $ groff thesis.tr > thesis.ps 然後利用上述指令打印生成的 PostScript 檔。 打印 man 說明頁

printing!man pages man pages!printing $ man man | col -b | lpr man 說明頁都使用 troff 的格式,因此在打印時得首先刪除粗體、底線等格式。 “col”軟件可以完成這項工作,由于 pipe 生成的結果,因此不可用 more 指令。 雜項

此處討論在他處沒有論及的問題。 打印前排版

printing!formatting files before 由于多數純文本格式的文檔在打印時都沒有排版格式,因此最好在打印前先行排版, 其中包括每頁加附標題和頁碼、設定頁邊距、雙倍行距、縮進和多欄排版等。 完成這項工作的一般方法是使用 pr 軟件。 $ pr +4 -d -h"Ph.D. Thesis, 2nd Draft" -l60 thesis.txt | lpr 在上例中,pr 對預備打印的 thesis.txt 進行下列工作: 三頁空白頁(+4)、每頁打印 60 行(-l60)、雙倍行距(-d)並在每頁頂端加印(-h) “Ph.D. Thesis, 2nd Draft”(譯註:博士論文,第 2 稿)。lpr 將打印 pr 生成的文本。 pr 的用法可參閱聯機說明。 打印機的環境參數

printing!PRINTER environment variable PRINTER environment variable 所有 Linux 打印系統的指令均接受 - 為了避免每次設定打印機,可事先設定打印機參數。每種系統使用的方法不同,以 bash 為例,可用下列指令: $ PRINTER="printer_name(譯註:打印機名稱)"; export PRINTER csh 中可用: % setenv PRINTER "printer_name(譯註:打印機名稱)" 這種指令可列入登錄指令(bash 使用.profile;csh 使用.cshrc ) 或作為單獨指令使用。(關於環境參數的進一步資料見 bash(1) 和 csh(1)) 常見問題 printing!frequently asked questions printing!FAQ FAQ!printing usage

Q1. 打印時如何消除“台階”現象? printing!staircase effect

A1. 有些打印機得每行給結束符,否則就會出現打印的台階現象。 打印機預期的結束符是回車/新行符(DOS 系統),而 UNIX 系統在結束一行時只加一個新行符。 解決這個問題的最簡便辦法是檢查是否可用某種開關控制打印機,使其能在這兩種打印之間轉換, 有時可用一個 DIP 開關,或可在打印前先發送一個換碼信號。如要採用第二種辦法, 得先設立一個過濾器(見 Q2)。 最快的解決辦法是在指令行使用過濾器。例如: $ cat thesis.txt | todos | lpr

Q2. 什麼是過濾器? printing!filter

A2. 過濾器是一套軟件,它可從標準輸入(stdin)讀入資料,然後對讀入的資料進行動作, 再以標準輸出(stdout)寫出。過濾器的用處佷多,包括可用于文本處理。

Q3. 什麼是魔術過濾器(magic filter)? printing!magic filter

A3. 魔術過濾器是一種根據文檔的種類採取行動的過濾器。例如,如果文檔是沒有排版格式的文本文檔時, 則利用一般打印方式打印。如果文檔是 PostScript 文檔或其他格式文檔,則用其他方式打印 ( ghostscript )。常用的魔術過濾器有 magicfilter 和 APSfilter。使用這類過濾器的一項要點是在安裝過濾器之前必需先安裝應用軟件。

需要注意這項要點的理由是在安裝 magicfilter 時,這個魔術過濾器會查詢系統中裝有何種打印程序 (例如 ghostscript,如果找到 ghostscript,則 magicfilter 就知道它能處理 PostScript 格式的文檔),然後根據找到的打印程序作出相應的設定。如果系統要處理所有打印文檔, 可能至少得安裝下列程序: GhostScript TeX NetPBM jpeg utilities (譯註:jpeg 工具軟件) gzip

Q4. 何謂 Windows 打印系統(WPS)?Linux 能用這個打印系統嗎? printing!Windows Printing System (WPS)

A4. 也許。只接受 WPS 指令的打印機無法用于 Linux 系統。接受 WPS 指令和其他打印指令的打印機 (如 Canon BJC 610 打印機)就可使用,只要將其設置成 WPS 格式以外的格式即可。其他打印機, 例如有些 HP DeskJet 820Cxi/Cse 打印機就*無法*用于 Linux。不過,儘管如此, Linux 可作為 Win95 機器的打印伺服器(見 Samba),因為 Win95 有這些打印機的驅動程序。

Q5. 這個系統怎麼這麼爛?只能打印 6 頁,超過 6 頁就顯示“file too large (文檔太長)”。 printing!file too large error

A5. 在 /etc/printcap 檔中有一個參數與打印的文檔長度有關。默認值是 1000 盤區(約 500 k)。 對 PostScript 這類文檔而言,這大約是 7-8 頁左右的長度。因此務必在打印機的設定中加入下列內容: mx=0 附加這個指令的主要原因是不使用假脫機。另一個完成這項工作的方法是用 lpr 在假脫機目錄內對打印的文檔生成軟連接。務必記得每次均需在 lpr 指令中使用 -s 選項。

排除故障

printing!troubleshooting 本節說明在打印時最可能出錯的問題。

如果打印機不打印: 打印其他文檔嗎? (應用軟件的問題?) lpd 正在運行嗎? (利用 lpc 進行檢查) (打印控制程序有問題嗎?) root 能直接發送指令給打印機嗎? (打印服務有問題嗎?) 能從 DOS 打印嗎? (聯線/打印機有問題嗎?) 這些問題有助于找出打印故障的原因。 如有其他這方面的建議請寄 <markk@auratek.com>。 參考材料

printing!reference material 本節載列 Linux 打印系統的參考材料。我已盡力羅列與這份 HOWTO 有關的參考材料。 如發覺仍有重大遺漏,請與我隨時聯絡。

在 USENET 上提問時,考慮下列問題: 打印機是否接受打印任務? (利用 lpc(8) 查核) 您的問題是否已在這份 HOWTO 或 Grant Taylor 編寫的 Printing HOWTO 中提供了解決辦法?

如果上述問題已有答案,那就最好不要在網上提問。如果仍要提問,應該列入與問題有關的資料。 如果提出“我的 lpr 有問題,請幫忙”這類問題,可能沒人會理會。最好還要列入內核版本、 不打印的情況是如何發生的和盡可能提供系統顯示的具體錯誤信息。 聯機使用說明 printing!related man pages cat(1) 連接和打印文檔 dvips(1) TeX DVI 文檔轉換成 PostScript 格式 ghostview(1) 利用 Ghostscript 查看 PostScript 文件 groff(1) groff 文件格式系統的前端處理軟件 gs(1) Ghostscript 翻譯器/閱讀器 lpc(8) 列印打印機的控制程式 lpd(8) 列印打印機的假脫機監控程序 lpq(1) 假脫機列隊檢視程序 lpr(1) 脫機打印程序 lprm(1) 從列印打印機的假脫機列隊刪除打印任務 pr(1) 轉換文本文件以便打印 tex(1) 文本排版和製版

USENET 新聞組 printing!relates newsgroups comp.os.linux.* 各式各樣有關 Linux 系統的資料 comp.unix.* 與 UNIX 系統有關的討論