亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > FreeBSD > 正文

FreeBSD handbook中文版 11 打印 (2)高級打印機設置 A.過濾器

2024-07-26 00:29:04
字體:
供稿:網(wǎng)友

=============================================================
11.4 高級打印機設置
=============================================================

這一節(jié)我們要討論的是處理特定文件格式的過濾程序、header pages、用網(wǎng)絡打印機打
印以及打印機訪問權(quán)限及打印情況統(tǒng)計的設置方式。
11.4.1 過濾器
雖然LPD 負責處理網(wǎng)絡通訊設定、隊列、訪問權(quán)限控制、以及其它許多打印相關的工作, 
但最重要的工作還是由過濾程序來做。過濾程序是負責與打印機溝通、處理設備依存關系、
以及一些其它特殊的需求。我們在之前設置打印機時安裝了一個最簡單,但是可以和配合大
部分打印機工作的文字過濾程序(請閱讀安裝文字過濾程序這一節(jié))。
然而,如果我們想要更方便地轉(zhuǎn)換格式、統(tǒng)計打印機使用情況、打印特別的打印機字體
等等,我們應該先了解過濾程序是如何運作的。這些事情都是由過濾程序處理的。不幸的是, 
通常你得自己提供特定的過濾程序。不過值得慶幸的是,有很多一般用途的過濾程序可以用, 
如果沒有的話,要自己做應該也很容易。
FreeBSD 提供了一個過濾程序/usr/libexec/lPR/lpf。這個過濾程序可以讓大部分的打
印機可以打印純文本(它只處理文件中的倒退字符以及TAB 字符,并不做統(tǒng)計等工作)。在
FreeBSD 的ports 里也搜集了許多種不同的過濾程序。
在這一節(jié)里,我們將要討論下面這些東西: 
1. 過濾程序的運作方式這一節(jié)將告訴你過濾程序在打印過程中所扮演的角色。你可以了
解在LPD 使用過濾程序時做了哪些動作。這些知識也能讓你將來遇到過濾程序相關的問
題時能找出問題的針結(jié)。
2. LPD 將所有的打印機都視為可以直接打印純文本。因此使用PostScript (以及使用其它
語言) 的打印機就無法直接打出純文本。在PostScript 打印機上打印純文本這一節(jié)將
告訴你該怎么做才能解決這個問題。如果你有PostScript 打印機,那么我建議你看看
這一節(jié)。
第22 頁FreeBSD 使用手冊
3. PostScript 是一種受歡迎的輸出格式。有些人(包括我)直接撰寫PostScript 的程序代
碼。但是PostScript 打印機很貴。用非PostScript 打印機仿真PostScript 打印機這
一節(jié)告訴你如何進一步修改打印機的文字過濾程序使得非PostScript 打印機也能打印
PostScript 的資料。如果你沒有PostScript 打印機,我建議你看看這一節(jié)。
4. 轉(zhuǎn)換用的過濾程序這一節(jié)說明如何讓特殊的文件格式轉(zhuǎn)換自動化,比如將圖形或排版
的資料轉(zhuǎn)換成你的打印機所能了解的。讀完這一節(jié)后,你應該可以用lpr -t 命令打印
troff 資料,或是用lpr -d 命令打印TeX DVI 資料,或是用lpr -v 命令打印raster 
影像資料,等等。我建議閱讀這一節(jié)。
5. 輸出用的過濾程序這一節(jié)說明一個LPD 不常用的功能:輸出用的過濾程序。除非你要
打印header pages(請閱讀Header Pages),不然你可以略過這一節(jié)。
6. 文字過濾程序:lpf 這一節(jié)介紹lpf 命令。這是由FreeBSD 提供給一般的行式打印機(或
類似行式打印機的激光打印機)使用的簡單文字過濾程序。如果你希望可以快速的設置
打印機對打印純文本的使用情況的統(tǒng)計,或是你想要消除打印機對倒退字符的錯誤打
印,那么你應該考慮使用lpf 命令。
11.4.1.1 過濾器如何工作
上面曾經(jīng)提到,過濾程序是一個由LPD 運行處理打印機與通訊端口間溝通的程序。
當LPD 要打印文件時,它會執(zhí)行過濾程序,同時從過濾程序的標準輸入要打印的文件,而將
過濾程序的標準輸出給打印機打印,并將過濾程序的錯誤記錄下來(在/etc/printcap 以lf 
關鍵詞設置,或是使用默認的/dev/console)。
LPD 要使用哪個過濾程序或是要給過濾程序哪些參數(shù)是由/etc/printcap 文件以及使用
者給lpr 命令的參數(shù)決定的。舉例來說,如果使用者輸入lpr -t,那么LPD 將會使用由tf 
關鍵詞為特定打印機所指定的troff 過濾程序。如果使用者想打印的是純文本,那么LPD 
將會使用由if 所指定的(大部分的時候是這樣子的,詳情請閱讀輸出用的過濾程序這一
節(jié)。
在/etc/printcap 文件里你可以設置三種不同種類的過濾程序: 
1. 文字過濾程序,在LPD 的文件中常稱為輸入用過濾程序。通常將它作為默認的過濾程序, 
負責處理一般的文字打印。LPD 將所有打印機都視為可以直接打印純文本,所以這個過
濾程序的任務就是將打印機無法處理的字符及格式,轉(zhuǎn)換為打印機所能處理的。如果你
第23 頁FreeBSD 使用手冊
需要做打印情況的統(tǒng)計,那么過濾程序必需要計算總行數(shù)及每頁行數(shù)來統(tǒng)計頁數(shù)。使用
文字過濾程序的方式為: 
filter-name [-c] -wwidth -llength -iindent -n login -h host acct-file 
其中
-c 
如果工作以lpr -l 命令送出, 那么就會有這個參數(shù)
width 
值是由/etc/printcap 文件中的pw (每頁的字符寬度)關鍵詞所指定的。默認為
132。
length 
是由pl(每頁的行數(shù))關鍵詞所指定,默認為66。
indent 
是由lpr -i 命令所指定的縮進字數(shù),默認是0。
login 
是打印該文件的使用者帳戶名稱。
host 
是送出工作的機器名稱。
acct-file 
是由af 關鍵詞所指定的統(tǒng)計數(shù)據(jù)文件名稱。
2. 轉(zhuǎn)換用的過濾程序負責將指定文件格式轉(zhuǎn)換成打印機可以打出的格式。舉例來說
ditroff 排版資料無法直接交由打印機打印,不過你可以安裝負責轉(zhuǎn)換ditroff 文件的
過濾程序?qū)itroff 資料轉(zhuǎn)換成打印機可以打印及處理的格式。轉(zhuǎn)換用的過濾程序這一
節(jié)將會有更詳細的說明。如果你需要做打印情況的統(tǒng)計,那么轉(zhuǎn)換用的過濾程序也需要
做統(tǒng)計的工作。使用轉(zhuǎn)換用的過濾程序的方式為: 
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 時才使用。在我
的經(jīng)驗里,輸出用過濾程序是很少用到的。輸出用的過濾程序這一節(jié)將介紹這些過濾
程序。輸出用過濾程序只接收兩個參數(shù),如下所示: 
filter-name -wwidth -llength 
參數(shù)-w 和-l 的意思和文字過濾程序中的意思是一樣的。
而過濾程序也應該要以下列的結(jié)束碼結(jié)束程序: 
exit 0 
如果過濾程序成功地把文件打出。
exit 1 
如果過濾程序打印失敗了而想要讓LPD 再呼叫一次過濾程序重新打印,那么就以這
個值結(jié)束。LPD 收到這個值之后,就會再重試打印。
exit 2 
如果過濾程序打印失敗且不想再嘗試了,那么就以這個值結(jié)束。LPD 收到這個值將
不會再重試同時放棄打印這個文件。
FreeBSD 里提供的過濾程序:/usr/libexec/lpr/lpf 利用每頁字符寬度及每頁行數(shù)來判
斷什么時候要送出form feed 字符以及統(tǒng)計打印機打印情況。而以使用者帳戶、機器以及統(tǒng)
計資料文件來記錄打印的情況。
如果你想要購買過濾程序,得先了解它們是否兼容于LPD。如果要兼容的話,它們必需
能處理上面所列的參數(shù)。如果你想要自己寫過濾程序來用,那么它們一樣要處理上面所列的
參數(shù)以及程序結(jié)束碼。
11.4.1.2 在postscript 打印機上打印純文本
如果你的計算機只有你一個人在用而且你使用的是PostScript (或是其它的打印機語
言)打印機,你也確定你決不會將純文本的資料交給你的打印機打印,且你不會使用其它會
將純文本送給你的打印機的程序,那么你就不需要閱讀這一節(jié)。
但是,如果你需要能處理PostScript 及純文本的資料,那么你就得對你的打印機再做
一番設置。我們首先要有一個文字過濾程序可以查出送過來的資料是純文本還是
PostScript。所有的PostScript 文件都是%! (對于其它的打印機語言,請參考你的打印機
手冊) 如果一份工作的最前面兩個字符是這樣的話,我們收到的就是PostScript 的工作, 
第25 頁FreeBSD 使用手冊
而我們可以直接把這份工作交給打印機處理。如果不是的話,那么過濾程序就得把這些文字
轉(zhuǎn)換成PostScript 然后再打印這些結(jié)果。
那我們要怎么設置呢? 
如果你是用串行端口上的打印機,有一個好方法就是安裝lprps。lprps 是給PostScript 
打印機用的過濾程序,它負責做打印機的雙向溝通。它會將打印機的狀態(tài)詳細的更新到記錄
文件里,如此使用者及管理者都可以清楚地看到打印機的狀態(tài)。(如果說“toner low”或是
“卡紙”)。更重要的是,它還包括了一個叫做psif 的程序,如果查出輸入的工作是純文本, 
則呼叫textps 這個程序(這是由lprps 所提供的)將純文本轉(zhuǎn)換成PostScript。最后,它會
呼叫l(wèi)prps 將工作送給打印機打印。
你可以在FreeBSD ports 里找到lprps(請閱讀The Ports Collection 這一節(jié))。當然, 
你可以自己取得、編譯及安裝。安裝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 

exit 2 
fi 
在上面的script 里,textps 這個命令是我們個別安裝來將純文本轉(zhuǎn)成PostScript 的程
序。你可以使用任何將文字轉(zhuǎn)換成PostScript 程序。FreeBSD ports 里(請閱讀The Ports 
Collection) 有一個叫做a2ps 的程序能做文字轉(zhuǎn)成PostScript 的工作,你也許可以試試看。
11.4.1.3 在沒有postscript 的打印機上模擬postscript 
PostScript 是高品質(zhì)打印的de facto 標準。然而,PostScript 也是一個昂貴的標準。
值得慶幸的是,在FreeBSD 下有個叫做Ghostscript 的程序能仿真PostScript 工作,這是
由Alladin Enterprises 所發(fā)展的免費程序。Ghostscript 可以讀取大部分PostScript 文
件并且將其結(jié)果輸出至許多不同的設備上,包括許多非PostScript 的打印機。只要安裝
Ghostscript 并為打印機設置一個特殊的文字過濾程序,你可以讓你的非PostScript 打印
機接收PostScript 的命令。
如果你從FreeBSD ports 里安裝Ghostscript,那么你一樣也可以很快的取得、編譯并
安裝它。
要仿真PostScript,我們要有一個過濾程序來判斷我們要打印的是不是PostScript 文
件。如果不是,那么這個文件就直接交由打印機處理;否則,我們得先用Ghostscript 將文
件轉(zhuǎn)換成打印機可以處理的。
這里有一個例子:下面的script 是給Hewlett Packard DeskJet 500 打印機用的文字
過濾程序。如果是其它的打印機,將gs (Ghostscript)命令的-sDEVICE 參數(shù)換成你能使用
的設備即可。(你可以用gs -h 這個命令得到目前系統(tǒng)安裝的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 轉(zhuǎn)換用的過濾程序
在完成上面簡單的打印機設置這一節(jié)所介紹的設置后,下面要做的就是為我們還想要
使用的文件格式(除了ASCII 純文本外)安裝轉(zhuǎn)換用的過濾程序。
11.4.1.4.1 為什么要安裝轉(zhuǎn)換用的過濾器? 
轉(zhuǎn)換用的過濾程序讓打印不同格式的文件變得很簡單。舉例來說,如果我們常常用TeX 
來產(chǎn)生文件,但是我們的打印機是PostScript 的。因此我們不能直接將由TeX 產(chǎn)生的DVI 
文件由打印機打出,而要先轉(zhuǎn)換成PostScript 的格式才能輸出。這些轉(zhuǎn)換的命令如下: 
% dvips seaweed-analysis.dvi 
% lpr seaweed-analysis.ps 
如果我們安裝了DVI 文件的轉(zhuǎn)換程序,那么我們每次要打印時就可以省去自己轉(zhuǎn)換格式
的動作,而交由LPD 自己轉(zhuǎn)。因此,我們要打印DVI 文件時只要這一步就可以了: 
% lpr -d seaweed-analysis.dvi 
FreeBSD 使用手冊
第29 頁FreeBSD 使用手冊
只要在使用LPD 時加上-d 參數(shù),LPD 就會將DVI 文件轉(zhuǎn)換后再正確的打出。輸出格式及
轉(zhuǎn)換的參數(shù)這一節(jié)里有詳細的列出轉(zhuǎn)換用的參數(shù)。
對于每一個轉(zhuǎn)換用的參數(shù),我們必需為打印機安裝合適的轉(zhuǎn)換用過濾程序,同時在
/etc/printcap 文件里指定該過濾程序。轉(zhuǎn)換用的過濾程序和文字過濾程序很相似(請閱讀
安裝文字過濾程序這一節(jié)),除了它不是打印純文本而是將文件轉(zhuǎn)換成打印機可以處理的格
式。
11.4.1.4.2 我應該如何使用轉(zhuǎn)換用的過濾程序? 
你應該安裝你想使用的轉(zhuǎn)換用過濾程序。如果你要打印DVI 資料,那么你應該要安裝
DVI 過濾程序。如果你要打印troff 資料,那么你應該要安裝troff 過濾程序。
下面這張表整理出可以配合LPD 工作的過濾程序和它們在要設置在/etc/printcap 里的
關鍵詞為何,以及要使用這些過濾程序時在使用lpr 時要加什么參數(shù): 
文件格式/etc/printcap 里的關鍵詞lpr 下的參數(shù)
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 的資料可能都已經(jīng)用不到了。在你的機器上, 
你可以安裝其它格式的過濾程序, 如此一來你就可以將那些轉(zhuǎn)換用的參數(shù)用來轉(zhuǎn)換其它的
格式。舉例來說,你希望可以直接打印Printerleaf 文件(由Interleaf desktop publishing 
program 產(chǎn)生的),而你用不到plot 文件。那么你可以用gf 關鍵詞指定Printerleaf 的轉(zhuǎn)
第30 頁
-c 
-d 
-g 
-n 
-f 
-f 
-v 
none, -p 或-l FreeBSD 使用手冊
換用過濾程序。同時告訴你的使用者lpr -g 命令就是“打印Printerleaf 文件”。
11.4.1.4.3 安裝轉(zhuǎn)換用的過濾程序
轉(zhuǎn)換用過濾程序不屬于FreeBSD 本身的程序,因此它們可能被放在/usr/local 目錄下。
通常我們可以將它們放在/usr/local/libexec 目錄下,因為這些程序是專門給LPD 運行的, 
一般使用者并不會需要去直接執(zhí)行它們。
要使用轉(zhuǎn)換用過濾程序,只要將過濾程序的路徑放在/etc/printcap 設置文件里用合適
的關鍵詞指定即可。
在我們的例子里,我們將為名為bamboo 的打印機設置一個DVI 轉(zhuǎn)換過濾程序。以下是
/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 以過濾模式執(zhí)行dvips (參數(shù)-f) 在標準輸入讀入要打印的工作以處理。
然后激活PostScrpt 打印機文字過濾程序lprps 同時也將LPD 傳給這個script 的參數(shù)傳給
該過濾程序(請閱讀在PostScript 打印機上打印純文本)這一節(jié)。lprps 將根據(jù)這些參數(shù)來
統(tǒng)計打印的頁數(shù)情況。
11.4.1.4.4 更多轉(zhuǎn)換用的過濾程序的例子
因為安裝過濾程序沒有特別固定的方式,所以我們將舉多一點例子來說明。這些例子也
許可以作為日后你自己做過濾程序時的參考,或是如果合適的話,你也可以直接拿來用。
下面這個例子是一個將raster 資料(嗯,其實只能給GIF 文件使用)轉(zhuǎn)成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 格式轉(zhuǎn)成portable anymap,然后再轉(zhuǎn)成portable graymap,接著再轉(zhuǎn)成
portable bitmap,最后再轉(zhuǎn)成與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: 
下面的轉(zhuǎn)換用過濾程序是將由grpff 排版系統(tǒng)所產(chǎn)生的troff 資料轉(zhuǎn)成讓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 
轉(zhuǎn)成激光打印機能處理的格式。首先,先修改/etc/printcap 文件中關于DVI 過濾程序的位
置: 
:df=/usr/local/libexec/hpdf: 
然后,我們要做出這個過濾程序。我們需要一個能將DVI 轉(zhuǎn)成激光打印機PCL 格式的程
序。FreeBSD port 里(請參考The Ports Collection 這一節(jié))有一個:dvi2xx 是這個程序的
名稱。安裝這個程序能提供我們dvilj2p 這個能將DVI 轉(zhuǎn)成LaserJet IIp、LaserJet III 
以及LaserJet 2000 兼容的格式。
dvilj2p 這個程序使得hpdf 這個過濾程序變得十分的復雜,因為dvilj2p 無法從標準
輸入取得資料。它得從文件中讀資料。最糟糕的是,這個文件還必需以.dvi 結(jié)尾,所以用
/dev/fd/0 作為標準輸入是不行的。我們可以用symblic link 產(chǎn)生一個暫時的文件名
(以.dvi 結(jié)尾)指向/dev/fd/0 ,然后強迫dvilj2p 從標準輸入讀取資料。
第34 頁FreeBSD 使用手冊
另一個問題就是我們無法用/tmp 來存放我們暫時的連接。Symbolic links 的使用者及
群組為bin。而過濾程序是以使用者daemon 的身份在執(zhí)行。又/tmp 目錄設置了sticky bit。
因此雖然過濾程序建立了連接,但是因為這個連接屬于其它的使用者而無法刪除。
因此,過濾程序?qū)裺ymbolic 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 自動轉(zhuǎn)換:用過濾程序轉(zhuǎn)換外的另一種選擇
上面這些過濾程序完整地建立了你的打印環(huán)境,但是使用者們必需自己決定要使用哪一
個過濾程序(對lpr 命令下的參數(shù))。如果你的使用者們并不擅長于使用計算機,要它們自己
選擇適當?shù)倪^濾程序來使用可能會造成它們的困擾。更嚴重的是,萬一使用到不正確的過濾
程序來轉(zhuǎn)換格式,那么可能會讓你的打印機浪費許多不必要紙。
除了安裝所有的轉(zhuǎn)換用過濾程序外,你也許會想要試試文字過濾程序(默認的過濾程序) 
自動掃描要打印的文件格式,同時自動呼叫其它的轉(zhuǎn)換用過濾程序做適當?shù)霓D(zhuǎn)換。像file 
這樣的工具對于這方面可能對這會有些幫助。然而,要區(qū)分出某些文件格式可能會有點困難
—當然,你也可以提供專門轉(zhuǎn)換這些格式的過濾程序。
FreeBSD ports 里有一個叫做apsfilter 的文字過濾程序可以做文件類型的自動掃描及
轉(zhuǎn)換。它可以分辨出純文本、PostScript 以及DVI 文件,然后做適當?shù)母袷睫D(zhuǎn)換后再打出。
11.4.1.5 輸出用的過濾程序
LPD spooling 系統(tǒng)還支持一種我們還未介紹的過濾程序:輸出用過濾程序。輸出用過濾
程序和文字過濾程序一樣,只有打印純文本才使用的,但是它簡單多了。如果你用了輸出用
過濾程序但是沒有用文字過濾程序,那么: 
1. LPD 在一份工作里將只執(zhí)行一次輸出用過濾程序,而不是為每一個文件都執(zhí)行一
次。
2. LPD 不會提供任何辨認文件開始或結(jié)束的信息給輸出用的過濾程序。
FreeBSD 使用手冊
第37 頁FreeBSD 使用手冊
3. LPD 不會將使用者的帳戶及機器名稱傳給過濾程序,因此它不能做統(tǒng)計的動作。事
實上,它只有得到兩個參數(shù): 
filter-name -wwidth -llength 
其中width 是由打印機設置里的pw 關鍵詞所設置的,而length 是由pl 關鍵詞所設置
的。請不要被輸出用過濾程序簡單的特性誤導了。如果你想要用輸出用過濾程序讓一份工作
里每個文件都重新的一頁開始打印,那是行不通的。你應該用的是文字過濾程序(也稱為輸
入用過濾程序),請參考安裝文字過濾程序這一節(jié)。嚴格的說,輸出用過濾程序?qū)嶋H上是較
復雜的,因為它必需檢查送給它的數(shù)據(jù)是否含有特殊的字符,并代替LPD 送信號給自己。
如果你需要打印header pages 或是需要送控制字符等其它的初始化字符串使得可以打印
header page,那么一個輸出用過濾程序是必要的。(但是如果你是為了要向使用者收取打印
header page 的費用的話,那么這是沒有用的。因為LPD 不會將任何使用者及機器的信息傳
給輸出用過濾程序。) 
LPD 允許一臺打印機上同時擁有輸出用過濾程序和文字過濾程序。在這個情況下,LPD 
會執(zhí)行輸出用過濾程序打印header page(請閱讀Header Pages 這一節(jié)),然后LPD 會送2 個
字節(jié)給這個過濾程序:ASCII 031 以及ASCII 001 時期望輸出用過濾程序?qū)⒆约和O聛?。?
輸出用過濾程序看到這兩個字節(jié)(031,001)時,它應該要送SIGSTOP 這個信號給自己。當
LPD 運行完其它的過濾程序后,會送SIGCONT 這個信號將輸出用過濾程序重新激活。
如果只有輸出用過濾程序但沒有文字過濾程序,且LPD 是要打印純文本,那么LPD 將
會用輸出用過濾程序來做這些工作。輸出用過濾程序?qū)睂⒌膶⒋蛴」ぷ髦械奈募蜉敵?
到打印機而不會送出form feed 或是其它控制紙張移動的命令。因此這些結(jié)果可能不是你想
要的。幾乎在所有的情況下,你都需要一個文字過濾程序。
我們以前介給過lpf 程序,不但可以作為文字過濾程序,也可以當作輸出用過濾程序使
用。如果你需要快速的設置好輸出用過濾程序,但你不想自己寫掃描資料字符及發(fā)送信號的
程序代碼,那么你可以試試lpf。你也可以在shell script 中使用lpf 將必要的初始化句
柄送給打印機。
11.4.1.6 lpf:文字過濾程序
FreeBSD 里附帶的/usr/libexec/lpr/lpf 是一個文字過濾程序(輸入用過濾程序)。它可
以處理縮進(命令lpr -i)、原封不動地打出資料(以lpr -l 命令送出的工作)、根據(jù)倒退字
第38 頁FreeBSD 使用手冊
符及TAB 字符調(diào)整打印的位置,以及統(tǒng)計打印張數(shù)。它也可以拿來當作輸出用過濾程序。
lpf 適合在許多打印環(huán)境下使用。雖然它無法送初始化句柄給打印機,但是我們可以很容易
的寫一個shell script 送出需要的初始化句柄后再執(zhí)行l(wèi)pf。
為了讓lpf 可以正確的做打印張數(shù)統(tǒng)計,我們需要在/etc/printcap 文件里為pw 及pl 
關鍵詞填入適當?shù)闹怠K鶕?jù)這些值來計算一張紙上可以打多少字,以及打印使用者的工作
需要用幾張紙。關于打印機的統(tǒng)計問題,請閱讀統(tǒng)計打印機使用情況里更詳細的說明。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
99国产精品白浆在线观看免费| 潘金莲一级淫片aaaaaa播放1| 在线综合+亚洲+欧美中文字幕| 93久久精品日日躁夜夜躁欧美| 亚洲综合婷婷久久| 国产精品久久毛片a| 成人在线免费电影| 日韩成人亚洲| 久久久精品在线| 在线视频成人| 最近中文字幕免费在线观看| 91小视频免费观看| 亚欧美无遮挡hd高清在线视频| 欧美日韩一级片在线观看| 99久久伊人精品| 久久97视频| 中文字幕在线观看精品| 国产精品黄色片| 久操国产精品| 日韩在线视频网| 妞干网在线播放| 97超碰免费在线观看| 欧洲精品一区二区三区在线观看| 国产日产精品一区二区三区| 色视频网站在线观看| 亚洲高清视频一区二区| 黄色国产精品| 警花av一区二区三区| 中文字幕亚洲乱码熟女1区2区| 热99精品只有里视频最新| 国产精品免费小视频| 2018亚洲男人天堂| 俄罗斯精品一区二区三区| 日韩av自拍| 国产在线拍揄自揄视频不卡99| 亚洲精品a级片| a日韩av网址| 日韩影院二区| 国产精品久久久国产盗摄| 欧美激情精品久久久久久黑人| 蜜桃av免费在线观看| 日本大胆人体视频| 国产精品黄色大片| 深夜福利日韩在线看| 亚洲欧美99| 四虎影视在线播放| 欧美日韩在线免费播放| jizz内谢中国亚洲jizz| 91超碰这里只有精品国产| av毛片在线| 3d欧美精品动漫xxxx无尽| 99国产精品久久久久久久成人热| 日韩有码在线播放| 8x8x8x视频在线观看| 国产一区在线电影| 日本丰满少妇做爰爽爽| 国产精品一品二品| 中文字幕中文字幕在线中一区高清| 久久久久在线| 日韩午夜一区| 成人在线观看免费完整| 桃花视频大全不卡免费观看网站| 精品一区二区三区在线观看l| 成人黄18免费网站| av网站中文字幕| 国产91色在线|免| 欧美激情精品久久久久久久变态| 欧美日韩亚洲国内综合网俺| 先锋影音网一区| 亚洲天堂免费电影| 国产人妖一区二区| 男女性杂交内射妇女bbwxz| 亚洲女同ⅹxx女同tv| 中文字幕在线不卡一区| 四虎.com| 亚洲欧美日韩一区| 九九热精品国产| 手机视频在线观看| 人人爽香蕉精品| 日本一区二区乱| 2018中文字幕第一页| 四虎影视免费永久在线| 国产第一亚洲| 新的色悠悠久久久| 无码精品黑人一区二区三区| 国产精久久久久久| 日韩午夜在线观看| 韩国毛片一区二区三区| 亚洲一区二区视频在线| 免费成人美女在线观看| 97色婷婷成人综合在线观看| 国内久久视频| 欧美妇性猛交视频| 可以免费看的黄色网址| 嫩草视频免费在线观看| av黄色在线| a在线观看网站| 特级西西444www高清大视频| 国产在线一区视频| 精品一区二区三区的国产在线观看| 久久国产福利国产秒拍| 日韩成人在线看| 欧美91精品久久久久国产性生爱| 日本韩国欧美在线| 国产绳艺sm调教室论坛| 极品颜值美女露脸啪啪| 欧美女人性生活视频| 日韩欧美aⅴ综合网站发布| 国产精品久久久久av福利动漫| 国产成都精品91一区二区三| 欧美一区二区三区电影在线观看| 韩国精品久久久999| 97人人爽人人喊人人模波多| 精品无人区麻豆乱码久久久| 日韩欧美一区在线观看| 波多野结衣视频在线看| 日韩手机在线视频| 97久久天天综合色天天综合色hd| 污污影院在线观看| 欧美视频www| 亚洲综合小说区| 精品一区二区三区影院在线午夜| 一本一本久久a久久精品牛牛影视| 99免费视频| 亚洲另类xxxx| 含羞草www国产在线视频| 亚洲性图一区二区| 天堂av手机版| 欧美a∨亚洲欧美亚洲| 福利在线国产| 欧美精品一区二区久久久| 欧美video巨大粗暴18| xxxx.欧美| 免费av网页| 免费在线a视频| 鬼打鬼之黄金道士1992林正英| 成人一道本在线| 国产传媒在线视频| 天堂va欧美ⅴa亚洲va一国产| 欧美色18zzzzxxxxx| 成人综合在线视频| 亚洲国产一二三区| 香港日本韩国三级| 日本天堂影院在线视频| 日韩精品视频在线播放| 欧美最猛黑人xxxx黑人猛交黄| 亚洲成色777777在线观看影院| av在线免费在线观看| 午夜欧美在线一二页| av片中文字幕| 国产亚洲aⅴaaaaaa毛片| 老牛影视免费一区二区| 亚洲人成网站在线在线观看| 日本高清无吗v一区| www.精品国产| 国产精品视频一二三区| 国产欧美一区二区白浆黑人| 激情av中文字幕| 日本精品视频一区| 激情综合闲人网| av网站免费在线观看| 日本午夜精品理论片a级app发布| 欧美专区在线观看一区| 日本国产一级片| 不卡的电视剧免费网站有什么| 精品熟妇无码av免费久久| 欧美日韩中文字幕综合视频| 2022成人影院| 欧美精品一区三区在线观看| 色婷婷av一区二区三区大白胸| 天天操夜夜草| 国产一级二级在线观看| 亚洲乱码国产乱码精品精软件| 久久国产精品网站| 国产+高潮+白浆+无码| 91av在线免费| 免费成年人视频在线观看| 2色视频网站| 丰满圆润老女人hd| 亚洲午夜无码久久久久| www.国产在线播放| 日本在线电影一区二区三区| 91国产精品| 在线观看亚洲精品福利片| 亚洲h精品动漫在线观看| 国产精品一区二区6| 欧美午夜片欧美片在线观看| 国产视频播放| 首播影院在线观看免费观看电视| 国产免播放器视频| 色橹橹高清视频在线播放| 国产一区二区在线视频你懂的| 日韩成人伦理电影在线观看| 在线观看国产中文字幕| 亚洲国产日本| 免费资源在线观看| 欧美网站免费观看| 精品夜夜嗨av一区二区三区| 精品人妻大屁股白浆无码| 欧美激情视频一区二区三区不卡| 国产精品一区二区三区乱码| 久久久久亚洲av片无码v| 小说区图片区色综合区| www.成人69.com| 69**夜色精品国产69乱| 就去色蜜桃综合| 99色在线播放| 日本一区二区视频在线| 久久99国产成人小视频| 青青热久免费精品视频在线18| zzijzzij亚洲日本少妇熟睡| 欧美精品成人| 国产午夜在线一区二区三区| 国产免费观看久久黄| 亚洲欧美日韩不卡一区二区三区| 日韩精品视频中文字幕| 久久久成人精品视频| 国产伦子伦对白在线播放观看| 水蜜桃免费高清视频在线播放| 日韩激情综合网| 久久99精品久久久野外观看| 欧美黑人精品一区二区不卡| 日产精品一线二线三线芒果| 精品熟妇无码av免费久久| 一本一道波多野毛片中文在线| 国产一区二区不卡视频| 国产三级小视频| 国产综合无码一区二区色蜜蜜| 一本大道五月香蕉| 美女免费免费看网站| 免费成人av在线| 欧美性猛交xxxx乱大交少妇| 中文字幕一区三区| 黄色网址免费在线| 日本久久免费| 天天射天天综合网| 最新福利小视频在线播放| 国产一级二级av| 91色p视频在线| 欧美日韩成人综合在线一区二区| 日本sm残虐另类| 日韩人妻精品中文字幕| 国产黄色免费| 国产精品一二三产区| 成人不卡免费av| 天堂视频在线观看免费| 亚洲xxxx3d动漫| 一区二区三区四区毛片| 久久久久久久久久久久久久久久久久久| 久久婷婷五月综合色丁香| 五月天色婷婷丁香| 成人动漫在线观看视频| 亚洲一区二区中文| 欧美日韩中文字幕综合视频| 国产www免费| 黄毛片在线观看| 亚洲国产激情av| 99在线观看视频免费| 欧美性色综合| 国产亚洲在线播放| 欧洲av一区二区三区| 欧美日韩国产一区精品一区| 亚洲精品久久7777777| 中文字幕在线看人| 午夜久久久久久久久久一区二区| 91最新地址在线播放| 深夜激情久久| ady日本映画久久精品一区二区| 男女日批视频在线观看| 中文字幕一区二区三区人妻不卡| 成人在线视频免费观看| 人人爽人人爽av| av中文字幕亚洲| 亚洲欧美日韩国产成人综合一二三区| 亚洲成在人线免费| 一区二区三区日韩| 日韩一级理论片| 天堂在线观看av| 欧洲亚洲精品在线| 精品亚洲国产成人av制服丝袜| 99热这里有精品| www日韩视频| 成人免费高清在线播放| h网站在线播放| 波多野结衣中文字幕一区二区三区| 蜜臀久久99精品久久久久久9| 亚洲最大的成人网| 欧美日韩在线影院| 亚洲欧美日韩精品久久奇米色影视| 成人ww免费完整版在线观看| 无遮挡的视频在线观看| 一区二区在线中文字幕电影视频| 青青热久免费精品视频在线18| 精品人伦一区二区| 国产欧美一区二区三区精品酒店| 日韩精品自拍偷拍| brazzers精品成人一区| 精品国产免费久久久久久尖叫| 中文字幕在线永久在线视频| 欧美日韩一本| 欧美一区二区三区男人的天堂| 在线激情av| 亚洲天堂a在线| 99中文字幕在线观看| 国产日韩欧美一区二区三区在线观看| 亚洲成人va| 欧亚乱熟女一区二区在线| 欧美性高清videossexo| 51精品国自产在线| 精品成a人在线观看| 国产成人jvid在线播放| 欧美一级高清免费| 日韩av在线第一页| 16—17女人毛片毛片| 国产女人高潮的av毛片| 青青草视频一区| 久久香蕉综合色| 日本888xxxx| 欧美视频国产精品| 97在线视频免费| 不卡av播放| 中文在线三区| 色婷婷视频在线| 国产高清不卡无码视频| 青青草国产精品一区二区| 成人久久久精品国产乱码一区二区| 五月色婷婷综合| 亚洲成人动漫在线播放|