FreeBSD handbook中文版 11 打印 (2)高級打印機設置 A.過濾器
2024-07-26 00:29:04
供稿:網友
=============================================================
11.4 高級打印機設置
=============================================================
這一節我們要討論的是處理特定文件格式的過濾程序、header pages、用網絡打印機打
印以及打印機訪問權限及打印情況統計的設置方式。
11.4.1 過濾器
雖然LPD 負責處理網絡通訊設定、隊列、訪問權限控制、以及其它許多打印相關的工作,
但最重要的工作還是由過濾程序來做。過濾程序是負責與打印機溝通、處理設備依存關系、
以及一些其它特殊的需求。我們在之前設置打印機時安裝了一個最簡單,但是可以和配合大
部分打印機工作的文字過濾程序(請閱讀安裝文字過濾程序這一節)。
然而,如果我們想要更方便地轉換格式、統計打印機使用情況、打印特別的打印機字體
等等,我們應該先了解過濾程序是如何運作的。這些事情都是由過濾程序處理的。不幸的是,
通常你得自己提供特定的過濾程序。不過值得慶幸的是,有很多一般用途的過濾程序可以用,
如果沒有的話,要自己做應該也很容易。
FreeBSD 提供了一個過濾程序/usr/libexec/lPR/lpf。這個過濾程序可以讓大部分的打
印機可以打印純文本(它只處理文件中的倒退字符以及TAB 字符,并不做統計等工作)。在
FreeBSD 的ports 里也搜集了許多種不同的過濾程序。
在這一節里,我們將要討論下面這些東西:
1. 過濾程序的運作方式這一節將告訴你過濾程序在打印過程中所扮演的角色。你可以了
解在LPD 使用過濾程序時做了哪些動作。這些知識也能讓你將來遇到過濾程序相關的問
題時能找出問題的針結。
2. LPD 將所有的打印機都視為可以直接打印純文本。因此使用PostScript (以及使用其它
語言) 的打印機就無法直接打出純文本。在PostScript 打印機上打印純文本這一節將
告訴你該怎么做才能解決這個問題。如果你有PostScript 打印機,那么我建議你看看
這一節。
第22 頁FreeBSD 使用手冊
3. PostScript 是一種受歡迎的輸出格式。有些人(包括我)直接撰寫PostScript 的程序代
碼。但是PostScript 打印機很貴。用非PostScript 打印機仿真PostScript 打印機這
一節告訴你如何進一步修改打印機的文字過濾程序使得非PostScript 打印機也能打印
PostScript 的資料。如果你沒有PostScript 打印機,我建議你看看這一節。
4. 轉換用的過濾程序這一節說明如何讓特殊的文件格式轉換自動化,比如將圖形或排版
的資料轉換成你的打印機所能了解的。讀完這一節后,你應該可以用lpr -t 命令打印
troff 資料,或是用lpr -d 命令打印TeX DVI 資料,或是用lpr -v 命令打印raster
影像資料,等等。我建議閱讀這一節。
5. 輸出用的過濾程序這一節說明一個LPD 不常用的功能:輸出用的過濾程序。除非你要
打印header pages(請閱讀Header Pages),不然你可以略過這一節。
6. 文字過濾程序:lpf 這一節介紹lpf 命令。這是由FreeBSD 提供給一般的行式打印機(或
類似行式打印機的激光打印機)使用的簡單文字過濾程序。如果你希望可以快速的設置
打印機對打印純文本的使用情況的統計,或是你想要消除打印機對倒退字符的錯誤打
印,那么你應該考慮使用lpf 命令。
11.4.1.1 過濾器如何工作
上面曾經提到,過濾程序是一個由LPD 運行處理打印機與通訊端口間溝通的程序。
當LPD 要打印文件時,它會執行過濾程序,同時從過濾程序的標準輸入要打印的文件,而將
過濾程序的標準輸出給打印機打印,并將過濾程序的錯誤記錄下來(在/etc/printcap 以lf
關鍵詞設置,或是使用默認的/dev/console)。
LPD 要使用哪個過濾程序或是要給過濾程序哪些參數是由/etc/printcap 文件以及使用
者給lpr 命令的參數決定的。舉例來說,如果使用者輸入lpr -t,那么LPD 將會使用由tf
關鍵詞為特定打印機所指定的troff 過濾程序。如果使用者想打印的是純文本,那么LPD
將會使用由if 所指定的(大部分的時候是這樣子的,詳情請閱讀輸出用的過濾程序這一
節。
在/etc/printcap 文件里你可以設置三種不同種類的過濾程序:
1. 文字過濾程序,在LPD 的文件中常稱為輸入用過濾程序。通常將它作為默認的過濾程序,
負責處理一般的文字打印。LPD 將所有打印機都視為可以直接打印純文本,所以這個過
濾程序的任務就是將打印機無法處理的字符及格式,轉換為打印機所能處理的。如果你
第23 頁FreeBSD 使用手冊
需要做打印情況的統計,那么過濾程序必需要計算總行數及每頁行數來統計頁數。使用
文字過濾程序的方式為:
filter-name [-c] -wwidth -llength -iindent -n login -h host acct-file
其中
-c
如果工作以lpr -l 命令送出, 那么就會有這個參數
width
值是由/etc/printcap 文件中的pw (每頁的字符寬度)關鍵詞所指定的。默認為
132。
length
是由pl(每頁的行數)關鍵詞所指定,默認為66。
indent
是由lpr -i 命令所指定的縮進字數,默認是0。
login
是打印該文件的使用者帳戶名稱。
host
是送出工作的機器名稱。
acct-file
是由af 關鍵詞所指定的統計數據文件名稱。
2. 轉換用的過濾程序負責將指定文件格式轉換成打印機可以打出的格式。舉例來說
ditroff 排版資料無法直接交由打印機打印,不過你可以安裝負責轉換ditroff 文件的
過濾程序將ditroff 資料轉換成打印機可以打印及處理的格式。轉換用的過濾程序這一
節將會有更詳細的說明。如果你需要做打印情況的統計,那么轉換用的過濾程序也需要
做統計的工作。使用轉換用的過濾程序的方式為:
filter-name -xpixel-width -ypixel-height -n login -h host acct-file
其中pixel-width 是由px 關鍵詞所指定(默認為0) 而pixel-height 是由py 關鍵詞所
指定(默認為0)。
第24 頁FreeBSD 使用手冊
3. 輸出用過濾程序是當你沒有文字過濾程序,或是要打印header pages 時才使用。在我
的經驗里,輸出用過濾程序是很少用到的。輸出用的過濾程序這一節將介紹這些過濾
程序。輸出用過濾程序只接收兩個參數,如下所示:
filter-name -wwidth -llength
參數-w 和-l 的意思和文字過濾程序中的意思是一樣的。
而過濾程序也應該要以下列的結束碼結束程序:
exit 0
如果過濾程序成功地把文件打出。
exit 1
如果過濾程序打印失敗了而想要讓LPD 再呼叫一次過濾程序重新打印,那么就以這
個值結束。LPD 收到這個值之后,就會再重試打印。
exit 2
如果過濾程序打印失敗且不想再嘗試了,那么就以這個值結束。LPD 收到這個值將
不會再重試同時放棄打印這個文件。
FreeBSD 里提供的過濾程序:/usr/libexec/lpr/lpf 利用每頁字符寬度及每頁行數來判
斷什么時候要送出form feed 字符以及統計打印機打印情況。而以使用者帳戶、機器以及統
計資料文件來記錄打印的情況。
如果你想要購買過濾程序,得先了解它們是否兼容于LPD。如果要兼容的話,它們必需
能處理上面所列的參數。如果你想要自己寫過濾程序來用,那么它們一樣要處理上面所列的
參數以及程序結束碼。
11.4.1.2 在postscript 打印機上打印純文本
如果你的計算機只有你一個人在用而且你使用的是PostScript (或是其它的打印機語
言)打印機,你也確定你決不會將純文本的資料交給你的打印機打印,且你不會使用其它會
將純文本送給你的打印機的程序,那么你就不需要閱讀這一節。
但是,如果你需要能處理PostScript 及純文本的資料,那么你就得對你的打印機再做
一番設置。我們首先要有一個文字過濾程序可以查出送過來的資料是純文本還是
PostScript。所有的PostScript 文件都是%! (對于其它的打印機語言,請參考你的打印機
手冊) 如果一份工作的最前面兩個字符是這樣的話,我們收到的就是PostScript 的工作,
第25 頁FreeBSD 使用手冊
而我們可以直接把這份工作交給打印機處理。如果不是的話,那么過濾程序就得把這些文字
轉換成PostScript 然后再打印這些結果。
那我們要怎么設置呢?
如果你是用串行端口上的打印機,有一個好方法就是安裝lprps。lprps 是給PostScript
打印機用的過濾程序,它負責做打印機的雙向溝通。它會將打印機的狀態詳細的更新到記錄
文件里,如此使用者及管理者都可以清楚地看到打印機的狀態。(如果說“toner low”或是
“卡紙”)。更重要的是,它還包括了一個叫做psif 的程序,如果查出輸入的工作是純文本,
則呼叫textps 這個程序(這是由lprps 所提供的)將純文本轉換成PostScript。最后,它會
呼叫lprps 將工作送給打印機打印。
你可以在FreeBSD ports 里找到lprps(請閱讀The Ports Collection 這一節)。當然,
你可以自己取得、編譯及安裝。安裝lprps 之后,只要指定psif (lprps 的程序之一) 的路
徑即可。如果你從ports 里安裝了lprps,那么在/etc/printcap 文件里為串口的PostScript
打印機設置:
:if=/usr/local/libexec/psif:
你應該要使用rw 關鍵詞以告訴LPD 將打印機打開為讀寫模式。
如果你是使用接在并口的PostScript 打印機(因此無法使用lprps 和打印機雙向溝通),
那么你可以使用下列的shell script 作為文字過濾程序:
#!/bin/sh
#
# psif - Print PostScript or plain text on a PostScript printer
# Script version; NOT the version that comes with lprps
# Installed in /usr/local/libexec/psif
#
read first_line
first_two_chars=‘expr “$first_line” : ‘/(../)’‘
if [ “$first_two_chars” = “%!” ]; then
#
# PostScript job, print it.
第26 頁FreeBSD 使用手冊
#
echo “$first_line” && cat && printf “/004” && exit 0
exit 2
else
#
# Plain text, convert it, then print it.
#
( echo “$first_line”; cat ) | /usr/local/bin/textps && printf “/004” && exit
0
exit 2
fi
在上面的script 里,textps 這個命令是我們個別安裝來將純文本轉成PostScript 的程
序。你可以使用任何將文字轉換成PostScript 程序。FreeBSD ports 里(請閱讀The Ports
Collection) 有一個叫做a2ps 的程序能做文字轉成PostScript 的工作,你也許可以試試看。
11.4.1.3 在沒有postscript 的打印機上模擬postscript
PostScript 是高品質打印的de facto 標準。然而,PostScript 也是一個昂貴的標準。
值得慶幸的是,在FreeBSD 下有個叫做Ghostscript 的程序能仿真PostScript 工作,這是
由Alladin Enterprises 所發展的免費程序。Ghostscript 可以讀取大部分PostScript 文
件并且將其結果輸出至許多不同的設備上,包括許多非PostScript 的打印機。只要安裝
Ghostscript 并為打印機設置一個特殊的文字過濾程序,你可以讓你的非PostScript 打印
機接收PostScript 的命令。
如果你從FreeBSD ports 里安裝Ghostscript,那么你一樣也可以很快的取得、編譯并
安裝它。
要仿真PostScript,我們要有一個過濾程序來判斷我們要打印的是不是PostScript 文
件。如果不是,那么這個文件就直接交由打印機處理;否則,我們得先用Ghostscript 將文
件轉換成打印機可以處理的。
這里有一個例子:下面的script 是給Hewlett Packard DeskJet 500 打印機用的文字
過濾程序。如果是其它的打印機,將gs (Ghostscript)命令的-sDEVICE 參數換成你能使用
的設備即可。(你可以用gs -h 這個命令得到目前系統安裝的Ghostscript 支持哪些設備)。
第27 頁FreeBSD 使用手冊
#!/bin/sh
#
# ifhp - Print Ghostscript-simulated PostScript on a DeskJet 500
# Installed in /usr/local/libexec/hpif
#
# Treat LF as CR+LF:
#
printf “/033&k2G” || exit 2
#
# Read first two characters of the file
#
read first_line
first_two_chars=‘expr “$first_line” : ‘/(../)’‘
if [ “$first_two_chars” = “%!” ]; then
#
# It is PostScript; use Ghostscript to scan-convert and print it.
#
# note that PostScript files are actually interpreted programs,
# and those programs are allowed to write to stdout, which will
# mess up the printed output. So, we redirect stdout to stderr
# and then make descriptor 3 go to stdout, and have Ghostscript
# write its output there. Exercise for the clever reader:
# capture the stderr output from Ghostscript and mail it back to
# the user originating the print job.
#
exec 3>&1 1>&2
/usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 /
第28 頁sOutputFile=/dev/fd/3 - && exit 0 ·
#
/usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 -sOutputFile=- - /
&& exit 0
else
#
# Plain text or HP/PCL, so just print it directly; print a form
# at the end to eject the last page.
#
echo $first_line && cat && printf “/033&l0H” && exit 0
fi
exit 2
最后,你需要用if 關鍵詞指定這個過濾程序:
:if=/usr/local/libexec/hpif:
這么一來,你可以輸入lpr plain.text 和lpr whatever.ps 而這兩者應該都要可以正
確打印。
11.4.1.4 轉換用的過濾程序
在完成上面簡單的打印機設置這一節所介紹的設置后,下面要做的就是為我們還想要
使用的文件格式(除了ASCII 純文本外)安裝轉換用的過濾程序。
11.4.1.4.1 為什么要安裝轉換用的過濾器?
轉換用的過濾程序讓打印不同格式的文件變得很簡單。舉例來說,如果我們常常用TeX
來產生文件,但是我們的打印機是PostScript 的。因此我們不能直接將由TeX 產生的DVI
文件由打印機打出,而要先轉換成PostScript 的格式才能輸出。這些轉換的命令如下:
% dvips seaweed-analysis.dvi
% lpr seaweed-analysis.ps
如果我們安裝了DVI 文件的轉換程序,那么我們每次要打印時就可以省去自己轉換格式
的動作,而交由LPD 自己轉。因此,我們要打印DVI 文件時只要這一步就可以了:
% lpr -d seaweed-analysis.dvi
FreeBSD 使用手冊
第29 頁FreeBSD 使用手冊
只要在使用LPD 時加上-d 參數,LPD 就會將DVI 文件轉換后再正確的打出。輸出格式及
轉換的參數這一節里有詳細的列出轉換用的參數。
對于每一個轉換用的參數,我們必需為打印機安裝合適的轉換用過濾程序,同時在
/etc/printcap 文件里指定該過濾程序。轉換用的過濾程序和文字過濾程序很相似(請閱讀
安裝文字過濾程序這一節),除了它不是打印純文本而是將文件轉換成打印機可以處理的格
式。
11.4.1.4.2 我應該如何使用轉換用的過濾程序?
你應該安裝你想使用的轉換用過濾程序。如果你要打印DVI 資料,那么你應該要安裝
DVI 過濾程序。如果你要打印troff 資料,那么你應該要安裝troff 過濾程序。
下面這張表整理出可以配合LPD 工作的過濾程序和它們在要設置在/etc/printcap 里的
關鍵詞為何,以及要使用這些過濾程序時在使用lpr 時要加什么參數:
文件格式/etc/printcap 里的關鍵詞lpr 下的參數
cifplot cf
DVI df
plot gf
ditroff nf
FORTRAN text rf
troff rf
raster vf
if plain text
在我們的例子里,使用lpr -d 意思就是說打印機會需要用到/etc/printcap 文件里由
df 關鍵詞所指定的過濾程序。
不管別人怎么說,像FORTRAN 或是plot 的資料可能都已經用不到了。在你的機器上,
你可以安裝其它格式的過濾程序, 如此一來你就可以將那些轉換用的參數用來轉換其它的
格式。舉例來說,你希望可以直接打印Printerleaf 文件(由Interleaf desktop publishing
program 產生的),而你用不到plot 文件。那么你可以用gf 關鍵詞指定Printerleaf 的轉
第30 頁
-c
-d
-g
-n
-f
-f
-v
none, -p 或-l FreeBSD 使用手冊
換用過濾程序。同時告訴你的使用者lpr -g 命令就是“打印Printerleaf 文件”。
11.4.1.4.3 安裝轉換用的過濾程序
轉換用過濾程序不屬于FreeBSD 本身的程序,因此它們可能被放在/usr/local 目錄下。
通常我們可以將它們放在/usr/local/libexec 目錄下,因為這些程序是專門給LPD 運行的,
一般使用者并不會需要去直接執行它們。
要使用轉換用過濾程序,只要將過濾程序的路徑放在/etc/printcap 設置文件里用合適
的關鍵詞指定即可。
在我們的例子里,我們將為名為bamboo 的打印機設置一個DVI 轉換過濾程序。以下是
/etc/printcap 這個文件,其中打印機bamboo 使用了df 關鍵詞。
#
# /etc/printcap for host rose - added df filter for bamboo
#
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:rw:/
:if=/usr/local/libexec/psif:/
:df=/usr/local/libexec/PSDf:
而DVI 過濾程序是一個shell script:/usr/local/libexec/psdf。以下是它的原始代
碼:
#!bin/sh
#
第31 頁FreeBSD 使用手冊
# psdf - DVI to PostScript printer filter
# Installed in /usr/local/libexec/psdf
#
# Invoked by lpd when user runs lpr -d
#
exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps “$@”
這個script 以過濾模式執行dvips (參數-f) 在標準輸入讀入要打印的工作以處理。
然后激活PostScrpt 打印機文字過濾程序lprps 同時也將LPD 傳給這個script 的參數傳給
該過濾程序(請閱讀在PostScript 打印機上打印純文本)這一節。lprps 將根據這些參數來
統計打印的頁數情況。
11.4.1.4.4 更多轉換用的過濾程序的例子
因為安裝過濾程序沒有特別固定的方式,所以我們將舉多一點例子來說明。這些例子也
許可以作為日后你自己做過濾程序時的參考,或是如果合適的話,你也可以直接拿來用。
下面這個例子是一個將raster 資料(嗯,其實只能給GIF 文件使用)轉成Hewlett
Packard LaserJet III-Si 打印機所能處理的過濾程序:
#!/bin/sh
#
# hpvf - Convert GIF files into HP/PCL, then print
# Installed in /usr/local/libexec/hpvf
PATH=/usr/X11R6/bin:$PATH; export PATH
giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 /
&& exit 0 /
|| exit 2
它先將GIF 格式轉成portable anymap,然后再轉成portable graymap,接著再轉成
portable bitmap,最后再轉成與LaserJet/PCL 兼容的資料。
第32 頁FreeBSD 使用手冊
下面是使用這個過濾程序的/etc/printcap 例子:
#
# /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:/
:vf=/usr/local/libexec/hpvf:
下面的轉換用過濾程序是將由grpff 排版系統所產生的troff 資料轉成讓PostScript
打印機bamboo 所能打印的格式:
#!/bin/sh
#
# pstf - Convert groff’s troff data into PS, then print.
# Installed in /usr/local/libexec/pstf
#
exec grops | /usr/local/libexec/lprps “$@”
上面的script 再一次使用lprps 與打印機溝通。如果我們的打印機接在并口上,那么
我們可以用下面這個script 取代上面的script:
#!/bin/sh
#
# pstf - Convert groff’s troff data into PS, then print.
# Installed in /usr/local/libexec/pstf
#
exec grops
而如果要使這個過濾程序,我們在/etc/printcap 里的設置:
第33 頁FreeBSD 使用手冊
:tf=/usr/local/libexec/pstf:
這里有一個讓熟悉FORTRAN 的老手慚愧的例子。這是一個讓所有可以打印純文本的打印
機打出FORTRAN-text 的過濾程序。我們將在teak 這臺打印機上安裝:
#!/bin/sh
#
# hprf - FORTRAN text filter for LaserJet 3si:
# Installed in /usr/local/libexec/hprf
#
printf “/033&k2G” && fpr && printf “/033&l0H” && exit 0
exit 2
我們只要將這個過濾程序在/etc/printcap 文件里指定給teak 這臺打印機即可:
:rf=/usr/local/libexec/hprf:
最后一個有點復雜的例子。我們要為先前提到的teak 這臺打印機新增一個可以將DVI
轉成激光打印機能處理的格式。首先,先修改/etc/printcap 文件中關于DVI 過濾程序的位
置:
:df=/usr/local/libexec/hpdf:
然后,我們要做出這個過濾程序。我們需要一個能將DVI 轉成激光打印機PCL 格式的程
序。FreeBSD port 里(請參考The Ports Collection 這一節)有一個:dvi2xx 是這個程序的
名稱。安裝這個程序能提供我們dvilj2p 這個能將DVI 轉成LaserJet IIp、LaserJet III
以及LaserJet 2000 兼容的格式。
dvilj2p 這個程序使得hpdf 這個過濾程序變得十分的復雜,因為dvilj2p 無法從標準
輸入取得資料。它得從文件中讀資料。最糟糕的是,這個文件還必需以.dvi 結尾,所以用
/dev/fd/0 作為標準輸入是不行的。我們可以用symblic link 產生一個暫時的文件名
(以.dvi 結尾)指向/dev/fd/0 ,然后強迫dvilj2p 從標準輸入讀取資料。
第34 頁FreeBSD 使用手冊
另一個問題就是我們無法用/tmp 來存放我們暫時的連接。Symbolic links 的使用者及
群組為bin。而過濾程序是以使用者daemon 的身份在執行。又/tmp 目錄設置了sticky bit。
因此雖然過濾程序建立了連接,但是因為這個連接屬于其它的使用者而無法刪除。
因此,過濾程序將會把symbolic link 建立在目前的目錄下,也就是spooling 目錄(由
/etc/printcap 文件中的sd 關鍵詞所指定)。這是讓過濾程序來做這件事最好的地方,因為
(通常)這里的可用空間會比/tmp 下來得多。
所以,這個過濾程序應該要這么寫:
#!/bin/sh
#
# hpdf - Print DVI data on HP/PCL printer
# Installed in /usr/local/libexec/hpdf
PATH=/usr/local/bin:$PATH; export PATH
#
# Define a function to clean up our temporary files. These exist
# in the current directory, which will be the spooling directory
# for the printer.
#
cleanup() {
rm -f hpdf$$.dvi
}
#
# Define a function to handle fatal errors: print the given message
# and exit 2. Exiting with 2 tells LPD to do not try to reprint the
# job.
#
第35 頁FreeBSD 使用手冊
fatal() {
echo “$@” 1>&2
cleanup
exit 2
}
#
# If user removes the job, LPD will send SIGINT, so trap SIGINT
# (and a few other signals) to clean up after ourselves.
#
trap cleanup 1 2 15
#
# Make sure we are not colliding with any existing files.
#
cleanup
#
# Link the DVI input file to standard input (the file to print).
#
ln -s /dev/fd/0 hpdf$$.dvi || fatal “Cannot symlink /dev/fd/0”
#
# Make LF = CR+LF
#
printf “/033&k2G” || fatal “Cannot initialize printer”
#
# Convert and print. Return value from dvilj2p does not seem to be
# reliable, so we ignore it.
第36 頁#
dvilj2p -M1 -q -e- dfhp$$.dvi
#
# Clean up and exit
#
cleanup
exit 0
11.4.1.4.5 自動轉換:用過濾程序轉換外的另一種選擇
上面這些過濾程序完整地建立了你的打印環境,但是使用者們必需自己決定要使用哪一
個過濾程序(對lpr 命令下的參數)。如果你的使用者們并不擅長于使用計算機,要它們自己
選擇適當的過濾程序來使用可能會造成它們的困擾。更嚴重的是,萬一使用到不正確的過濾
程序來轉換格式,那么可能會讓你的打印機浪費許多不必要紙。
除了安裝所有的轉換用過濾程序外,你也許會想要試試文字過濾程序(默認的過濾程序)
自動掃描要打印的文件格式,同時自動呼叫其它的轉換用過濾程序做適當的轉換。像file
這樣的工具對于這方面可能對這會有些幫助。然而,要區分出某些文件格式可能會有點困難
—當然,你也可以提供專門轉換這些格式的過濾程序。
FreeBSD ports 里有一個叫做apsfilter 的文字過濾程序可以做文件類型的自動掃描及
轉換。它可以分辨出純文本、PostScript 以及DVI 文件,然后做適當的格式轉換后再打出。
11.4.1.5 輸出用的過濾程序
LPD spooling 系統還支持一種我們還未介紹的過濾程序:輸出用過濾程序。輸出用過濾
程序和文字過濾程序一樣,只有打印純文本才使用的,但是它簡單多了。如果你用了輸出用
過濾程序但是沒有用文字過濾程序,那么:
1. LPD 在一份工作里將只執行一次輸出用過濾程序,而不是為每一個文件都執行一
次。
2. LPD 不會提供任何辨認文件開始或結束的信息給輸出用的過濾程序。
FreeBSD 使用手冊
第37 頁FreeBSD 使用手冊
3. LPD 不會將使用者的帳戶及機器名稱傳給過濾程序,因此它不能做統計的動作。事
實上,它只有得到兩個參數:
filter-name -wwidth -llength
其中width 是由打印機設置里的pw 關鍵詞所設置的,而length 是由pl 關鍵詞所設置
的。請不要被輸出用過濾程序簡單的特性誤導了。如果你想要用輸出用過濾程序讓一份工作
里每個文件都重新的一頁開始打印,那是行不通的。你應該用的是文字過濾程序(也稱為輸
入用過濾程序),請參考安裝文字過濾程序這一節。嚴格的說,輸出用過濾程序實際上是較
復雜的,因為它必需檢查送給它的數據是否含有特殊的字符,并代替LPD 送信號給自己。
如果你需要打印header pages 或是需要送控制字符等其它的初始化字符串使得可以打印
header page,那么一個輸出用過濾程序是必要的。(但是如果你是為了要向使用者收取打印
header page 的費用的話,那么這是沒有用的。因為LPD 不會將任何使用者及機器的信息傳
給輸出用過濾程序。)
LPD 允許一臺打印機上同時擁有輸出用過濾程序和文字過濾程序。在這個情況下,LPD
會執行輸出用過濾程序打印header page(請閱讀Header Pages 這一節),然后LPD 會送2 個
字節給這個過濾程序:ASCII 031 以及ASCII 001 時期望輸出用過濾程序將自己停下來。當
輸出用過濾程序看到這兩個字節(031,001)時,它應該要送SIGSTOP 這個信號給自己。當
LPD 運行完其它的過濾程序后,會送SIGCONT 這個信號將輸出用過濾程序重新激活。
如果只有輸出用過濾程序但沒有文字過濾程序,且LPD 是要打印純文本,那么LPD 將
會用輸出用過濾程序來做這些工作。輸出用過濾程序將會直將的將打印工作中的文件序輸出
到打印機而不會送出form feed 或是其它控制紙張移動的命令。因此這些結果可能不是你想
要的。幾乎在所有的情況下,你都需要一個文字過濾程序。
我們以前介給過lpf 程序,不但可以作為文字過濾程序,也可以當作輸出用過濾程序使
用。如果你需要快速的設置好輸出用過濾程序,但你不想自己寫掃描資料字符及發送信號的
程序代碼,那么你可以試試lpf。你也可以在shell script 中使用lpf 將必要的初始化句
柄送給打印機。
11.4.1.6 lpf:文字過濾程序
FreeBSD 里附帶的/usr/libexec/lpr/lpf 是一個文字過濾程序(輸入用過濾程序)。它可
以處理縮進(命令lpr -i)、原封不動地打出資料(以lpr -l 命令送出的工作)、根據倒退字
第38 頁FreeBSD 使用手冊
符及TAB 字符調整打印的位置,以及統計打印張數。它也可以拿來當作輸出用過濾程序。
lpf 適合在許多打印環境下使用。雖然它無法送初始化句柄給打印機,但是我們可以很容易
的寫一個shell script 送出需要的初始化句柄后再執行lpf。
為了讓lpf 可以正確的做打印張數統計,我們需要在/etc/printcap 文件里為pw 及pl
關鍵詞填入適當的值。它根據這些值來計算一張紙上可以打多少字,以及打印使用者的工作
需要用幾張紙。關于打印機的統計問題,請閱讀統計打印機使用情況里更詳細的說明。