FreeBSD handbook中文版 11 打印 (1)基本設置
2024-07-26 00:29:04
供稿:網友
目錄
11 打印
11.1 概要
11.2 介紹
11.3 基本設置
=============================================================
第11 章打印
=============================================================
(翻譯中出現的任何問題或錯誤,請廣大讀者及時反饋給我:freebsdhandbook@163.com)
11.1 概要
FreeBSD 支持許多種類的打印機,從最老式的impact 打印機,到最新的激光打印機,
都可以讓你通過相關的應用程序來提供高質量的打印效果。
FreeBSD 也可以通過網絡來配置一個打印服務器。通過這種功能,FreeBSD 也可以從其
他的電腦上得到打印任務,包括其它的FreeBSD 電腦、windows 和MACos 主機。FreeBSD 能
夠確保每個打印作業都能完成,并能夠統計用戶和機器的工作狀況,以使它們能達到最佳的
打印效果。FreeBSD 也能生成“banner”頁,來顯示誰打了什么和打了多少。
閱讀完這章,你將了解到:
如何配置FreeBSD 的打印機spooler。
如何安裝打印機的過濾器,處理一些特殊的打印作業。包括轉換打印文件的格式。
如何在打印輸出文件中啟用header 或banner 文件。
如何通過連接到其他電腦來打印到打印機。
如何直接連接到網絡來打印到打印機。
如何管理打印機的限制,包括打印尺寸的大小,以及阻止某些用戶的打印。
如何記錄打印機的統計情況和用戶使用打印機的情況。
如何處理打印機出現的問題。
在閱讀這章之前,你應當先了解:
如何配置和安裝一個新的內核(第9 章)。
11.2 介紹
第1 頁FreeBSD 使用手冊
要在FreeBSD 下使用打印機,你需要設置Berkeley line PRint spooling(打印池)
系統,也叫做LPD spooling 系統。這是FreeBSD 下控制打印機的標準。這一節將介紹LPD
spooling 系統,以下將簡稱為LPD。
如果你已經熟悉LPD 或是其它的打印機spooling 系統,你可以先跳到設置spooling 系
統那一節。LPD 控制任何有關連接在本機上的打印機的事情,包括:
1. 控制本地打印機及網絡上其它打印機的訪問權限。
2. 接收使用者傳送的文件來打??;這些要打印的要求稱為工作。
3. 利用隊列來防止多個使用者同時訪問同一臺打印機。
4. 在輸出時打出header pages(也稱做banner 或burst)。這樣,使用者可以在厚厚
一打紙張中找出他們自己所打印的東西。
5. 為連接在串口上的打印機設置適當的通訊參數。
6. 通過網絡將工作送給另一臺機器上的LPD spooler。
7. 執行特定的過濾程序,讓你的工作可以兼容于使用不同打印機語言的打印機。
8. 統計打印機的使用情況。
11.2.1 為什么要使用spooler
通過適當的設置并提供特別的過濾程序,你可以使LPD 系統在不同的打印機上擁有上述
全部或部分的功能。
如果你的系統只有自己一個人在用,那么你可能會覺得既不需要權限控制、header
pages、或是統計打印機使用情況,為什么還要用spooler?如果可以直接訪問打印機,那
么你仍然得使用spooler,因為:
. LPD 在執行脫機打印的工作時,你不需要花時間等待資料傳送到打印機。
. LPD 可以通過過濾程序,在你的文件上加上日期/時間等信息,或是轉換特別的文件
格式(如Tex、DVI 的文件)使打印機能處理。你不需要手動轉換。
. 很多免費及商業軟件所提供的打印功能通常會需要用到你系統上的spooler。你只
要設置好spooling 系統,將來可以很容易的讓其它的程序使用打印機。
. 統計打印機的使用情況。
第2 頁FreeBSD 使用手冊
11.3 基本設置
讓LPD 可以配合打印機工作,你需要同時設置好你的打印機以及LPD。設置分為兩大部
分:
1. 簡單的打印機設置這一節將告訴你如何連接打印機,并設置LPD 打印純文本的文
件。
2. 高級打印機設置這一節將告訴你如何讓打印機打出各種不同格式的文件、header
pages、通過網絡打印、設置訪問權限以及統計打印機的使用情況。
11.3.1 簡單的打印機設置
這一節將說明如何連接打印機及設置LPD。包括:
硬件設置這一節說明如何將打印機接到計算機上的連接端口。
軟件設置這一節說明如何撰寫LPD spooler 的設置文件/etc/printcap 。
如果你要設置的是網絡打印機,請參考使用網絡數據傳輸接口的打印機這一節。
雖然這一節叫做“簡單的打印機設置”,但其實是挺復雜的。讓你的打印機可以配合
LPD spooler 是設置工作中最難的一部分。一旦你的打印機可以正常工作了,較高級的功能
如打印header pages 和打印機使用情況統計反而比較容易設置。
11.3.1.1 硬件設置
這一節說明有哪些方法可以將打印機連到我們的個人計算機上;有哪些通訊端口、連接
線以及kernel 的設置。如果你的打印機在你使用的計算機上可以通過其它操作系統來打印,
你也許可以跳過這一節直接到軟件設置那一節。
11.3.1.1.1 端口和線纜
幾乎所有可以和PC 連接的打印機都能支持下列兩種或是其中一種接口:
第3 頁FreeBSD 使用手冊
1. 串行打印機通過串口和計算機傳輸資料。串行接口的配備及連接線可以容易的取得
及安裝。但是串行接口有時需要較特別的連接線及較復雜的設置。
2. 并行打印機通過并口和計算機傳輸資料。并口在市場上很普遍,連接線也很容易找
得到,但是不容易自己制作。利用并口連接打印機十分的容易,通常不需要設置額
外的通訊參數。
并口有時也稱做“Centronics”接口,這是根據打印機上面的接頭來命名的。
通常,只有使用PostScript 的打印機才需要用到雙向傳輸。PostScript 打印機可以說
是十分復雜。事實上,PostScript 的打印工作常常是由程序將工作送到打印機處理后,并
不打出來,而是將結果再傳回計算機。PostScript 也使用雙向傳輸將錯誤傳回計算機。比
如說PostScript 程序有問題或是打印機卡紙。機器上的使用者可能會需要這些信息。更進
一步的,PostScript 打印機統計打印情況最好的方式就是使用雙向傳輸。比如說:你可先
詢問打印機啟動以來一共打過幾張,然后送出使用者要打的東西,打完后再詢問一共打了幾
張,由此就可得知得向使用者收多少紙張的錢。
那么,你該選擇哪一種接口呢?
1. 如果你需要雙向傳輸,那么就選擇使用串口。FreeBSD 目前并不支持并口上的雙向
傳輸。
2. 如果你不需要雙向傳輸,那么,你只要選擇你的打印機支持的接口即可,當然最好
是可以用并行端口,而將串行端口留作其它的用途—比如連接終端機或調制解調器
—通常并口傳輸比較快,設置起來也較容易。
3. 最后,如果還是不知道怎么選的話,就看哪個能用就接哪個吧。
11.3.1.1.2 并行口
用Centronics 連接線通過并口連接打印機和計算機。打印機的手冊、計算機的手冊這
兩者都可以給你足夠的安裝說明。記住你所使用的并行口。在FreeBSD 里,第一個并行口是
/dev/lpt0;第二個則是/dev/lpt1,依此類推。
11.3.1.1.3 串行口
第4 頁FreeBSD 使用手冊
用適當的連接線通過串行口連接打印機和計算機。打印機的手冊、計算機的手冊這兩者
都可以給你足夠的安裝說明。如果你不確定你的連線是否為“合適的串行口連接線”,你可
以試試下面幾種不同用途的線:
1. 連接調制解調器的線。這種線是一個接腳對一個接腳直接對接的。這種線也叫做
“DTE-to-DCE”連接線。
2. Null-modem 連接線大部分是一個接腳對一個接腳直接對接,而有少部分接腳相互
交換(如send data 和receive data);有少部分接腳則是兩端都是短路。這種線
也叫做“DTE-to-DTE”連接線。
3. 并行打印機連接線,某些不常見的打印機需要這種線。這種線類似null-modem 連
接線,但是有些信號是送到相對應的接腳而不是兩端短路。
你應當為打印機設置通訊參數,通常可以利用打印機上的控制面板或是DIP 開關設置。
選擇你的計算機和打印機同時支持的最高傳輸速率(單位為bps,bits per second,也稱做
baud rate)。選擇7 或8 的數據位;無、奇數或偶數的同位檢查;1 或2 停止位。同時也選
擇流量控制的方式:無、XON/XOFF (也稱做“in-band”或“軟件”)流量控制。記住你的軟
件設置也要使用同樣的值。
11.3.1.2 軟件設置
這節說明如何設置FreeBSD 下的LPD spooling 系統,使其能打印。
下列是所需的步驟:
1. 如果需要的話,設置你的kernel,使該連接端口可被打印機使用。設置Kernel 這
一節將告訴你需要做些什么。
2. 如果你使用的是并行口,那么你得設置并口的通訊模式。設置并列端口的通訊模式
這一節有詳細的說明。
3. 測試操作系統是否可以將資料送給打印機。檢查打印機連接狀況這節將給你一些關
于這一方面的建議。
4. 修改/etc/printcap 以正確設置LPD。/etc/printcap 設置文件將告訴你如何做。
第5 頁FreeBSD 使用手冊
11.3.1.2.1 內核配置
操作系統的kernel 為了能配合某些設備需要重新編譯。而串口和并口就是這些設備之
一。如果你的kernel 目前并不支持你想用的串口或并口,那么你可能需要將它們加入你的
kernel 設置并重新編譯。如果要檢查你的kernel 目前是否支持串口,你可以用這個命令:
# dmesg | grep sioN
其中N 是串口的編號,從0 開始計算。如果你得到的結果類似下面這個樣子:
sio2 at 0x3e8-0x3ef irq 5 on isa
sio2: type 16550A
表示你的kernel 支持這個通訊端口。
如果要檢查你的kernel 目前是否支持并行口,你可以用這個命令:
# dmesg | grep lptN
其中N 是并行口的編號,從0 開始計算。如果你得到的結果類似
lpt0 at 0x378-0x37f on isa
表示你的kernel 支持這個通訊端口。
你可能會需要重新設置你的kernel 使得操作系統可以辨認并使用你連接打印機的并口
或串口。
如果要讓你的kernel 支持串口,請參考關于重新編譯kernel 的那一節。如果要讓你的
kernel 支持并口,請參考關于重新編譯kernel 的那一節以及下一節。
11.3.1.3 為端口新增/dev 下的設備文件
既然kernel 已經支持你所需的并口或串口,你仍然需要一個程序接口在系統里協助傳
送和接收資料。這也是/dev 里設備文件存在的目的。
第6 頁FreeBSD 使用手冊
如果要在/dev 目錄下為你的通訊端口建立相對應的設備文件:
1. 用su 命令切換成root。
2. 更改當前的目錄到/dev 下:
# cd /dev
3. 輸入:
# ./MAKEDEV port
其中port 是你想要建立的設備文件名稱。如果是第一個并口,你可以用lpt0;如
果是第二個并口,你可以用lpt1,依此類推。如果是第一個串口,你可以用ttyd0
如果是第二的串口,而用ttyd1;依此類推。
4. 輸入:
# ls -l port
以確定你剛剛是否建立成功。
11.3.1.3.1 為并口設置通訊模式
當你決定要用并口時,在FreeBSD 下你可以決定要用中斷驅動(interrupt-driven)或是
輪詢(polled)的方式與打印機溝通。
1. 中斷驅動是GENERIC kernel 里默認的方式。如果選擇這個方式,操作系統將利用
IRQ 來判斷打印機是否已經準備好接收資料。
2. 而輪詢的方式則是由操作系統一直重復地去詢問打印機是否已經準備好可以接收
資料。如果打印機已經準備好了,那么kernel 再將要打印的資料送過去。
中斷驅動的方式較快但是要占用一個IRQ。你可以從上述兩者任選一個可以正常工作的
來使用。設置通訊模式有兩種方式:設置kernel 或是使用lptcontrol 這個程序。
如果要從kernel 里設置:
第7 頁FreeBSD 使用手冊
1. 編輯你的kernel 設置文件。找出或是自行加入lpt0 這一項。如果你要設置使用第
二個并口,那就加入lpt1 這項。如果是第三個并口就用lpt2,依此類推。
如果你要設置使用中斷驅動模式,那么要指定irq:
device lpt0 at isa? port? tty irq N vector lptintr
其中N 是你并口所使用的IRQ 編號。
如果你要用輪詢模式,那么就不要指定irq:
device lpt0 at isa? port? tty vector lptintr
2. 將設置文件存儲好后,重新編譯、安裝kernel 并重新啟動。你可以參考內核配置那
一節里更詳細的說明。
如果你想用lptcontrol 來設置通訊模式:
1. 輸入:
# lptcontrol -i -u N
將lptN 設置為中斷驅動模式。
2. 輸入:
# lptcontrol -p -u N
將lptN 設置為輪詢模式。
你可以把上述的命令加到你的/etc/rc.local 文件里使得每次啟動時都可以自動設置。
你可以查看lptcontrol 以得到更多有關的信息。
11.3.1.3.2 檢查打印機的通訊狀況
在設置spooling 系統前,你應該先確定你的操作系統可以成功地將資料送到你的打印
機。將打印機的連接和spooling 系統分開來測試會較容易。
你可以送一些文字來測試你的打印機。打印機應該會馬上將它們收到的資料打出來。
lptest 這個程序會送96 行每行96 個ASCII 文字的資料給你的打印機以協助測試。
第8 頁FreeBSD 使用手冊
使用PostScript(或是其它語言)的打印機測試起來較復雜。我們得先寫一個較小的測
試程序,像下面這樣:
%!PS
100 100 moveto 300 300 lineto stroke
310 310 moveto /Helvetica findfont 12 scalefont setfont
(Is this thing working?) show
showpage
注意:上面這個小程序是給使用PostScript 的打印機用的,不能給比如說Hewlett
Packard 公司的PCL 語言使用。PCL 語言可以讓你打印純文本,同時里面夾雜PCL 特別的命
令。PostScript 不能直接打印純文本,因此對于這樣的打印機,我們必需做一些特別的設
置。
11.3.1.3.2.1 檢查一下并口打印機
這節將告訴你如何檢查FreeBSD 是否可以使用接在并口的打印機。
測試并口上的打印機:
1. 用su 命令切換成root。
2. 將資料傳送給打印機。
如果這個打印機可以直接打印純文本,請使用lptest。輸入:
# lptest > /dev/lptN
其中N 是你打印機所連接的并列端口。從0 開始計算。
如果這個打印機使用PostScript 或其它的打印機語言,那么送一個小小的測試程序給
打印機。輸入:
# cat > /dev/lptN
然后,一行接著一行,小心的把你的命令打進去,因為你按下ENTER 后,就無法再修改
了。當你輸入完畢后,按CONTROL+D 或是其它產生文件結尾字符的按鍵?;蛘呤悄憧梢詫⒛?
的測試程序放在一個文件里并輸入:
# cat file > /dev/lptN
第9 頁FreeBSD 使用手冊
其中file 就是存儲你測試程序的文件名。
你應該可以看到有一些東西打出來了。如果打出來的資料看起來不大正確,別擔心,我
們等一會就修正它們。
11.3.1.3.2.2 檢查一下串口打印機
這節將告訴你如何檢查FreeBSD 是否可以使用接在串口的打印機。
測試串口上的打印機:
1. 用su 命令切換成root。
2. 編輯/etc/remote 這個文件,并加入下列幾行:
printer:dv=/dev/port:br#bps-rate:pa=parity
其中port 指的是哪一個串口(ttyd0、ttyd1、等等),bps-rate 指的是該串口的傳
輸速度,而parity 是設置打印機是否需要同位檢查(這個值可以是even、odd、none
或zero)。
下面這個例子是一臺連接在串行端口上以19200 bps 傳輸的,同時不使用同位檢查
的打印機設置方式:
printer:dv=/dev/ttyd2:br#19200:pa=none
3. 用tip 命令連上打印機。輸入:
# tip printer
如果失敗的話,再次編輯/etc/remote 這個文件同時以/dev/cuaaN 取代/dev/ttydN。
4. 將資料傳送給打印機。
如果這個打印機可以直接打印純文本,請使用lptest。輸入:
~$lptest
如果這個打印機使用PostScript 或其它的打印機語言, 那么送一個小小的測試程序給
打印機。一行接著一行,非常小心地將程序輸入,因為退格鍵或是其它編輯時常用的按鍵,
第10 頁FreeBSD 使用手冊
對打印機可能有特殊的意義。最后你可能要打一個給打印機的文件結尾的字符,讓它知道程
序結束了。對PostScript 的打印機來說,是用CONTROL+D 鍵。
或者是你可以將你的測試程序放在一個文件里并輸入:
~>file
其中file 就是存儲你測試程序的文件名。用tip 將這個文件送給打印機后,而按文件
結尾字符。
你應該可以看到有一些東西打出來了。如果打出來的資料看起來不大正確,別擔心,我
們稍待一會就修正它們。
11.3.1.4 啟用spooler:編輯/etc/printcap 文件
到目前為止,你的打印機應該已經連接好了,你的kernel 應該也設置無誤了,而且你
也可以傳送資料給打印機了?,F在,我們應該可以開始設置LPD 來控制打印機了。
LPD 的設置文件是/etc/printcap。每當spooler 被使用時,LPD spooling 系統就會來讀這
個文件,所以只要這個文件一被修改,馬上就會生效。
編輯printcap 這個設置文件是很簡單的。用你喜歡的編輯器對/etc/printcap 這個設
置文件做修改就可以了。這個文件的格式寫法和其它的設置文件如
/usr/share/misc/termcap 和/etc/remote 是相同的。關于這些設置文件的格式,請參考
cgetent。
要建立一個簡單的spooler 設置,請按照下列步驟:
1. 為你的打印機選擇一個名字(以及一些方便的別名),并把它們放在/etc/printcap
這個文件里。請閱讀為打印機取名這一節。
2. 用sh 關鍵詞關閉打印header pages 的功能(默認是打開此功能)。請閱讀不打印
Header Pages 這一節。
3. 用sd 關鍵詞指定一個目錄給spooler 用。請閱讀建立Spooling 目錄這一節。
4. 在/etc/printcap 設置文件里用lp 關鍵詞指定打印機連接端口在/dev 下使用的設備
文件。請閱讀辨認打印機設備這一節。如果你的打印機是接在串口,那么你可以用
fs、fc、xs 以及xc 等關鍵詞來設置通訊參數。請閱讀設置Spooler 的通訊參數。
5. 安裝輸入文字過濾程序;請參考安裝文字過濾程序這一節。
第11 頁FreeBSD 使用手冊
6. 利用lpr 命令打印以測試設置是否正確;請閱讀測試及疑難解答這兩節。
注意: 使用特定語言的打印機,比如說PostScrit 打印機,無法直接打印純文本。上述
以及下面要介紹的方法將假設你所要打印的文件都是不需要轉換就能讓打印機直接了解
的。
使用者通常會期望它們可以直接將純文本的資料直接由打印機輸出,而使用LPD 打印的
程序通常也是這么假設的。如果你的打印機使用某個特定的打印機語言,且你希望可以同時
處理特定打印機語言的資料以及純文本的資料,那么你應該要另外再多安裝一項以前沒有提
到的東西:純文本轉成PostScript(或其它打印機語言)的自動轉換程序。在PostScript 打
印機上打印純文本這一節將告訴你要怎么做。
11.3.1.4.1 為打印機命名
第一就是為你的打印機取一個名字。此外,你也可為你的打印機取很多別名,因此,你
要取符合功能的名字或是古怪的名字都可以。
在/etc/printcap 里定義的打印機,至少要有一臺取lp 別名。這是默認的打印機名稱。
如果使用者沒有環境變量PRINTER 設置打印機的名稱,且在LPD 的命令也沒有指定任何打印
機的話,那么別名為lp 的打印機就會被視為默認的打印機。
通常,我們會將一臺打印機的最后一別名取為它的全名,包括制造商以及型號。
當你將打印機的名稱及別名設置在/etc/printcap 文件里時,打印機的名稱一定要放
在最左邊的字段。其它的別名則以垂直的線(|)分開,而在最后一個別名之后加一個冒號(:)。
在下面的例子里,我們大略描述一下/etc/printcap 的骨干。這個例子里定義了兩臺打印機。
(Diablo 630 以及Panasonic KX-P4455 PostScript 激光打印機。):
#
# /etc/printcap for host rose
#
rattan|line|diablo|lp|Diablo 630 Line Printer:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:
在這個例子里,第一臺打印機取名為rattan 而它的別名有line、diablo、lp 以及Diablo
630 Line Printer。這臺打印機有lp 這個別名,因此它也是默認的打印機。第二臺取名為
bamboo,而它的別名有ps、PS、S、panasonic 以及Panasonic KX-P4455 PostScript v51.4。
11.3.1.4.2 不打印頭文件
第12 頁FreeBSD 使用手冊
LPD spooling 系統默認是為每個打印工作打印header page 的。Header page 包括了送
出打印工作的使用者名稱、送出工作的機器名稱以及工作的名稱。不幸的是,這些額外的信
息可能會妨礙我們做簡單的打印機設置測試,因此我們想不要打印header pager。
在/etc/printcap 用sh 關鍵詞為特定的打印機設置不打印header pages。這里有一個
在/etc/printcap 里使用sh 的例子:
#
# /etc/printcap for host rose - no header pages anywhere
#
rattan|line|diablo|lp|Diablo 630 Line Printer:/
:sh:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:/
:sh:
注意:我們使用的正確格式:打印機定義的第一行得從第一個字開始寫的,而其后的每
一行用TAB 鍵往內縮一格。而一行如果寫不完需要接到下一行時,則以反斜線字符結尾。
11.3.1.4.3 建立spooling 目錄
下一步就是建立一個spooling 目錄,一個在打印時會用到以及存放一些spooler 需要
的文件的地方。
通常我們會將spooling 目錄指定在/var/spool 目錄下。你不需要備份spooling 目錄,
而建立它也只要以mkdir 命令即可。
通常我們會將spooling 目錄以打印機的名稱建立,如下所示:
# mkdir /var/spool/printer-name
然而,如果在你的網絡中有很多打印機的話,你也許會希望將所有的spooling 目錄放
在一個LPD 專用的目錄下。以我們的打印機rattan 和bamboo 為例:
# mkdir /var/spool/lpd
# mkdir /var/spool/lpd/rattan
# mkdir /var/spool/lpd/bamboo
注意: 如果你關心的是使用者打印資料的隱私,那么你應該要將spooling 目錄的權限
做適當的設置。Spooling 目錄應該要屬于daemon 這個使用者同時并允許它讀、寫及搜索,
而其它人都無法訪問此目錄。因此,我們應該要這樣設置:
第13 頁FreeBSD 使用手冊
# chown daemon.daemon /var/spool/lpd/rattan
# chown daemon.daemon /var/spool/lpd/bamboo
# chmod 770 /var/spool/lpd/rattan
# chmod 770 /var/spool/lpd/bamboo
最后,在/etc/printcap 文件里,你可以用sd 關鍵詞來指定spooling 的目錄:
#
# /etc/printcap for host rose - added spooling directories
#
rattan|line|diablo|lp|Diablo 630 Line Printer:/
:sh:sd=/var/spool/lpd/rattan:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:/
:sh:sd=/var/spool/lpd/bamboo:
注意:打印機的名字一定是在定義第一行的第一個字,而其它行都要以TAB 縮進。如果
需要換行則需要在行末加上反斜線字符。
如果你沒有用sd 指定spooling 目錄,那么系統默認的spooling 目錄將會是
/var/spool/lpd 。
11.3.1.4.4 識別打印機設備
在為通訊端口新增/dev 目錄下的設備文件這一節里,我們在/dev 目錄下選定了要給
FreeBSD 使用與打印機通訊的連接端口?,F在我們要告訴LPD 這個信息。當spooling 系統
有工作要打印時,它將會告訴過濾程序(負責送資料給打印機)使用指定的設備。
在/etc/printcap 用lp 關鍵詞指定使用/dev 下的設備名稱。
在我們的例子中,我們設置rattan 使用第一個并口,而bamboo 使用第六個串口。因此
在/etc/printcap 中我們設置:
#
# /etc/printcap for host rose - identified what devices to use
#
rattan|line|diablo|lp|Diablo 630 Line Printer:/
:sh:sd=/var/spool/lpd/rattan:/
:lp=/dev/lpt0:
第14 頁FreeBSD 使用手冊
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:/
:sh:sd=/var/spool/lpd/bamboo:/
:lp=/dev/ttyd5:
如果你在/etc/printcap 里沒有用lp 關鍵詞指定要使用哪個通訊端口,LPD 將會使用
/dev/lp 為默認的通訊端口。/dev/lp 目前在FreeBSD 中并不存在。
如果你現在安裝的打印機是連接在并口上,那么請跳至安裝文字過濾程序這一節,否
則,請按照下面這一節繼續設置。
11.3.1.4.5 配置spooler 通訊參數
對于連接在串口上的打印機,LPD 設置的傳輸速率、同位檢查、以及其它的通訊參數,
使得過濾程序能送資料到打印機上。這是較有利的。因為:
1. 你只要編輯/etc/printcap 就可以使用不同的通訊參數。不需要去重新編譯你的過
濾程序。
2. 允許spooling 系統在多臺打印機、多種不同通訊參數設置的情況下用同一個過濾
程序。
在/etc/printcap 設置文件里,下列關鍵詞控制lp 所指定的通訊端口:
br#bps-rate
設置通訊端口傳輸速度為bps-rate 其中bps-rate 可以是50、75、110 、134、150、
200、300、600、1200、1800、2400、4800、9600、19200 或是38400 bit-per-second。
fc#clear-bits
打開通訊端口后,清除sgttyb 結構里的標記位clear-bits。
fs#set-bits
設置sgttyb 結構里的標記位set-bits。
xc#clear-bits
打開通訊端口后,清除local 模式位clear-bits。
xs#set-bits
設置local 模式位set-bits。
第15 頁FreeBSD 使用手冊
關于fc、fs、xc 以及xs 關鍵詞各個bit 的說明,請參考
/usr/include/sys/ioctl_compat.h。當LPD 打開由lp 所指定的通訊端口時,會先讀取
sgttyb 這個結構,然后清掉fc 關鍵詞所指定的位再設置由fs 關鍵詞所指定的位。設置完
成后,才開始使用這個結構。同樣的,對local 模式位設置也是以一樣方式的處理。
讓我們在我們的例子里為第六個串行端口設置這些位。我們會將傳輸速率設置成38400 bps。
而在標記位方面,我們會設置TANDEM、ANYP、LITOUT、FLUSHO 以及PASS8 這些位。而local
模式位,我們將設置LITOUT 以及PASS8 位:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:/
:sh:sd=/var/spool/lpd/bamboo:/
:lp=/dev/ttyd5:fs#0x82000c1:xs#0x820:
11.3.1.4.6 安裝文本過濾器
現在可以開始設置LPD 用什么文字過濾程序送工作給打印機。一個文字過濾程序也叫做
輸入用過濾程序,當LPD 有東西要打印時,它就會執行這個程序。當LPD 運行這個程序時,
它會將過濾程序的標準輸入設為要打印工作的標準輸入,而過濾程序的標準輸出則送給以
lp 關鍵詞指定的通訊端口。因此過濾程序必需要能從標準輸入讀入要打印的東西,做適當
的處理后,將結果從標準輸出送出。而這些輸出就會被打出來。請參考過濾程序的運作方式
這一節以更進一步的了解過濾程序。
在我們的打印機設置里,文字過濾程序可能只是一個執行/bin/cat 命令的shell script
將工作送給打印機。FreeBSD 里有一個叫做lpf 的過濾程序能處理倒退、底線等打印機可能
無法正確處理的資料。當然,你也可以用任何你想用的過濾程序。關于lpf 這個過濾程序在
文字過濾程序:lpf 這一節里有更詳細的說明。
首先, 讓我們做一個簡單的shell script 文字過濾程序,
/usr/local/libexec/if-simple。用你熟悉的編輯器編輯這個文件:
#!/bin/sh
#
# if-simple - Simple text input filter for lpd
# Installed in /usr/local/libexec/if-simple
#
# Simply copies stdin to stdout. Ignores all filter arguments.
第16 頁FreeBSD 使用手冊
/bin/cat && exit 0
exit 2
然后要讓這個文件可執行:
# chmod 555 /usr/local/libexec/if-simple
同時,在/etc/printcap 設置文件里用if 關鍵詞告訴LPD 來使用這個過濾程序。在下面
的例子里,我們在/etc/printcap 中為兩臺打印機都指定了過濾程序:
#
# /etc/printcap for host rose - added text filter
#
rattan|line|diablo|lp|Diablo 630 Line Printer:/
:sh:sd=/var/spool/lpd/rattan:/ :lp=/dev/lpt0:/
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:/
:sh:sd=/var/spool/lpd/bamboo:/
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:/
:if=/usr/local/libexec/if-simple:
11.3.1.4.7 打開LPD
lpd 從/etc/rc 運行,通過使用lpd_enable 來控制。默認是NO。如果你還沒有啟用它,
可以加入下面這行到/etc/rc.conf,然后重新啟動電腦或只運行lpd:
lpd_enable="YES"
# lpd
11.3.1.4.8 測試
你已經把LDP 需要的設置都完成了。不過,我們需要測試看看這些設置是否可以正確地
工作。測試的方法就是打出一些東西。如果要用LPD 系統來打印,我們可以使用lpr 這個命
令來送出一些打印工作。
你可以使用檢查打印機連接狀況這一節里介紹的lpr 及lptest 來產生一些測試文字。
測試LPD 設置:
第17 頁FreeBSD 使用手冊
輸入:
# lptest 20 5 | lpr -Pprinter-name
其中printer-name 是/etc/printcap 里的某一臺打印機名稱或別名。如果要測試默認
的打印機,那么在執行lpr 命令時不要指定-P 這個參數。再一次的提醒,如果你要測試的
是PostScript 打印機,那么請傳送PostScript 程序給打印機,而不要用lptest。你可以
將程序放在一個文件里然后輸入lpr file。
如果是PostScript 打印機,你應該會得到程序輸出的結果。如果你是用lptest 的話,
那么你的結果看起來應該是下面這個樣子:
!”#$%&’()*+,-./01234
“#$%&’()*+,-./012345
#$%&’()*+,-./0123456
$%&’()*+,-./01234567
%&’()*+,-./012345678
如果要做更進一步的測試,你可以下載更大的程序(給某個特定打印機語言的打印機使
用)或是在執行lptest 時加一些額外的參數。例如lptest 80 60 將會產生60 行每行80 個
字符的測試數據。
如果打印機并沒有反應,請參考疑難解答這一節。
11.3.1.4.9 疑難解答
用lptest 做過簡單的測試后,你可能會遇到下列的問題。打印機打了一陣子,但是并
沒有輸出任何結果。
打印機打出上面所列的東西,但是沒多久就停了。這時,你可能需要按打印機上的PRINT
REMAINING 或FORM FEED 鈕才看得到輸出的結果。
如果是這種情況的話,打印機在打印前可能在等待是否還有更多的資料要打印。要解決
這個問題,你可以讓你的文字過濾程序送出FORM FEED 字符(或是其它需要的字符)給打印機。
這個動作讓打印機打出目前打印機緩存區里的資料。同時也確定每個工作的最后一頁可以完
整的輸出,使得下個工作不會從前一個工作的最后一頁中間輸出。
下面這個shell script 取代/usr/local/libexec/if-simple。將工作送給打印機后,
會再送出一個form feed 字符:
#!/bin/sh
第18 頁FreeBSD 使用手冊
#
# if-simple - Simple text input filter for lpd
# Installed in /usr/local/libexec/if-simple
#
# Simply copies stdin to stdout. Ignores all filter arguments.
# Writes a form feed character (/f) after printing job.
/bin/cat && printf “/f” && exit 0
exit 2
打出了“階梯效應”。
你的結果可能是這個樣子:
!”#$%&’()*+,-./01234
“#$%&’()*+,-./012345
#$%&’()*+,-./0123456
這時你已經成為因為換行字符沖突而產生的階梯效應受害者。UNIX 風格的操作系統只
使用ASCII 碼10,line feed (LF) 作為換行字符。MS-DOS、OS/2 以及其它的操作系統使用
兩個字符ASCII 碼10 以及ASCII 碼13 (稱做carriage return 或CR)。很多打印機使用MS-DOS
的表示法來代表換行字符。
當你用FreeBSD 打印時,你的文件只用line feed 字符換行。當打印機看到一個line feed
字符時,將紙卷了一行,仍然從同一個位置繼續往后打印。這就是為什么要用carriage
return 字符的原因:將下一個字的打印位置移到紙張的最左邊。
FreeBSD 希望你的打印機可以:
打印機收到CR 打印機打印CR
打印機收到LF 打印機打印CR + LF
有一些方法可以達到這個目地:
1. 用打印機上的開關或控制面板設置這些字符的處理方式。請查閱你的打印機手冊并做正
確的設置。
注意: 如果你的計算機安裝了除了FreeBSD 外的操作系統,你也許得常常重新
設置打印機處理CR 和LF 的設置。因此,你可能會希望使用下面其中之一的方
第19 頁FreeBSD 使用手冊
法:
2. 讓FreeBSD 的串口驅動程序自動將LF 轉換成CR+LF。當然,你的打印機只能在串行口
上。如果要打開這個功能,只要在/etc/printcap 設置文件里為你的打印機用fs 關鍵詞設
置CRMOD 這個位即可。
3. 送一個句柄給打印機告訴它暫時把LF 字符做額外的處理。請參閱你的打印機手冊以了
解你的打印機是否支持此功能。如果你找到適用的句柄,修改你的文字過濾程序先送出這些
句柄,再送出要打印的工作。
下面這個文字過濾程序的例子是使用Hewlett-Packard PCL 句柄。先讓打印機將LF 視
為LF 和CR 處理,再送出工作。最后,再送出將整頁送出的句柄。這個過濾程序應該可以應
付大部分Hewlett-Packard 的打印機。
#!/bin/sh
#
# hpif - Simple text input filter for lpd for HP-PCL based printers
# Installed in /usr/local/libexec/hpif
#
# Simply copies stdin to stdout. Ignores all filter arguments.
# Tells printer to treat LF as CR+LF. Ejects the page when done.
printf “/033&k2G” && cat && printf “/033&l0H” && exit 0
exit 2
而下面這個/etc/printcap 的例子是設置一臺叫做orchid 計算機。它在第一個并口連
接了一臺叫做teak 的Hewlett-Packard LaserJet 3Si 打印機。同時,它使用了上述的script
作為它的文字過濾程序:
#
# /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:/
:lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:/
:if=/usr/local/libexec/hpif:
第20 頁每一行都重迭在一起
打印機從不換行,把每一行都印在同一行上。這個問題和上述的階梯效應“相反”。而
且也較罕見。FreeBSD 用來換行的LF 字符被當成CR 字符使得打印機一直回到紙張的最左邊
開始打印但卻不換行。使用打印機上的設置開關或是控制面板設置使LF 和CR 字符這樣被處
理:
打印機會少打某些字
打印時,打印機在一行之中會少打某些字。這個情況在打印時可能會變得愈來愈嚴重,
有愈來愈多的字打不出來。這是因為打印機接收資料的速度無法跟上計算機通過串行端口送
資料的速度(這個問題在并列端口打印機上應該不會發生)。有兩種方式可以解決這個問題:
1. 如果打印機支持XON/XOFF 流量控制,在FreeBSD 里可以用fs 關鍵詞來設置TANDEM 位。
2. 如果打印機支持carrier 流量控制,用fs 關鍵詞來設置MDMBUF 位。確定連接打印機及
計算機的連接線可以配合carrier 流量控制使用。
3. 如果打印機不支持任何一種流量控制,那么在fs 關鍵詞里試著設置NLDELAY、TBDELAY、
CRDELAY、VTDELAY 以及BSDELAY 等位的組合以適當的延遲資料送到打印機。
打出亂碼
打印機打出看不懂的符號,而不是我們期望中的數據。這通常是因為序列打印機的通訊
參數設置不正確而造成的。再檢查一次br 關鍵詞所設置的傳輸速率、fs 及fc 關鍵詞所設置
的同位檢查。同時也檢查打印機是否也使用與/etc/printcap 文件里相同的設置。
沒有任何動作發生
如果沒有任何反應,那么可能是FreeBSD 的問題而不是硬件的問題。為你的打印機在
/etc/printcap 設置文件里設置記錄文件(使用lf 關鍵詞)。下面的例子是用lf 為rattan 這臺打
印機設置記錄文件:
rattan|line|diablo|lp|Diablo 630 Line Printer:/
:sh:sd=/var/spool/lpd/rattan:/
FreeBSD 使用手冊
打印機打印打印機收到
CR CR
CR + LF LF
第21 頁FreeBSD 使用手冊
:lp=/dev/lpt0:/
:if=/usr/local/libexec/if-simple:/
:lf=/var/log/rattan.log
然后試著再打印一次,并檢查記錄文件(在我們的例子里,是/var/log/rattan.log 這個文
件)里是否有出現錯誤信息。然后根據錯誤信息來解決你的問題。
如果你沒有用lf 指定記錄文件,LPD 默認是/dev/console 將錯誤信息輸出。