FreeBSD handbook中文版 11 打印 (2)高级打印机设置 A.过滤器 (1)
=============================================================
11.4高级打印机设置
=============================================================
这一节我们要讨论的是处理特定文件格式的过滤程序、headerpages、用网络打印机打
印以及打印机访问权限及打印情况统计的设置方式。
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命令打印TeXDVI资料,或是用lpr-v命令打印raster
影像资料,等等。我建议阅读这一节。
5.输出用的过滤程序这一节说明一个LPD不常用的功能输出用的过滤程序。除非你要
打印headerpages(请阅读HeaderPages),不然你可以略过这一节。
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-nlogin-hhostacct-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-nlogin-hhostacct-file
其中pixel-width是由px要害词所指定(默认为0)而pixel-height是由py要害词所
指定(默认为0)。
第24页FreeBSD使用手册
3.输出用过滤程序是当你没有文字过滤程序,或是要打印headerpages时才使用。在我
的经验里,输出用过滤程序是很少用到的。输出用的过滤程序这一节将介绍这些过滤
程序。输出用过滤程序只接收两个参数,如下所示
filter-name-wwidth-llength
参数-w和-l的意思和文字过滤程序中的意思是一样的。
而过滤程序也应该要以下列的结束码结束程序
exit0
假如过滤程序成功地把文件打出。
exit1
假如过滤程序打印失败了而想要让LPD再呼叫一次过滤程序重新打印,那么就以这
个值结束。LPD收到这个值之后,就会再重试打印。
exit2
假如过滤程序打印失败且不想再尝试了,那么就以这个值结束。LPD收到这个值将
不会再重试同时放弃打印这个文件。
FreeBSD里提供的过滤程序/usr/libexec/lpr/lpf利用每页字符宽度及每页行数来判
断什么时候要送出formfeed字符以及统计打印机打印情况。而以使用者帐户、机器以及统
计资料文件来记录打印的情况。
假如你想要购买过滤程序,得先了解它们是否兼容于LPD。假如要兼容的话,它们必需
能处理上面所列的参数。假如你想要自己写过滤程序来用,那么它们一样要处理上面所列的
参数以及程序结束码。
11.4.1.2在postscript打印机上打印纯文本
假如你的计算机只有你一个人在用而且你使用的是PostScript(或是其它的打印机语
言)打印机,你也确定你决不会将纯文本的资料交给你的打印机打印,且你不会使用其它会
将纯文本送给你的打印机的程序,那么你就不需要阅读这一节。
但是,假如你需要能处理PostScript及纯文本的资料,那么你就得对你的打印机再做
一番设置。我们首先要有一个文字过滤程序可以查出送过来的资料是纯文本还是
PostScript。所有的PostScript文件都是%!(对于其它的打印机语言,请参考你的打印机
手册)假如一份工作的最前面两个字符是这样的话,我们收到的就是PostScript的工作,
第25页FreeBSD使用手册
而我们可以直接把这份工作交给打印机处理。假如不是的话,那么过滤程序就得把这些文字
转换成PostScript然后再打印这些结果。
那我们要怎么设置呢?
假如你是用串行端口上的打印机,有一个好方法就是安装lprps。lprps是给PostScript
打印机用的过滤程序,它负责做打印机的双向沟通。它会将打印机的状态具体的更新到记录
文件里,如此使用者及治理者都可以清楚地看到打印机的状态。(假如说“tonerlow”或是
“卡纸”)。更重要的是,它还包括了一个叫做psif的程序,假如查出输入的工作是纯文本,
则呼叫textps这个程序(这是由lprps所提供的)将纯文本转换成PostScript。最后,它会
呼叫lprps将工作送给打印机打印。
你可以在FreeBSDports里找到lprps(请阅读ThePortsCollection这一节)。当然,
你可以自己取得、编译及安装。安装lprps之后,只要指定psif(lprps的程序之一)的路
径即可。假如你从ports里安装了lprps,那么在/etc/printcap文件里为串口的PostScript
打印机设置
:if=/usr/local/libexec/psif:
你应该要使用rw要害词以告诉LPD将打印机打开为读写模式。
假如你是使用接在并口的PostScript打印机(因此无法使用lprps和打印机双向沟通),
那么你可以使用下列的shellscript作为文字过滤程序
#!/bin/sh
#
#psif-PrintPostScriptorplaintextonaPostScriptprinter
#Scriptversion;NOTtheversionthatcomeswithlprps
#Installedin/usr/local/libexec/psif
#
readfirst_line
first_two_chars=‘expr“$first_line”:‘\(..\)’‘
if[“$first_two_chars”=“%!”];then
#
#PostScriptjob,printit.
第26页FreeBSD使用手册
#
echo“$first_line”%26amp;%26amp;cat%26amp;%26amp;printf“\004”%26amp;%26amp;exit0
exit2
else
#
#Plaintext,convertit,thenprintit.
#
(echo“$first_line”;cat)|/usr/local/bin/textps%26amp;%26amp;printf“\004”%26amp;%26amp;exit
0
exit2
fi
在上面的script里,textps这个命令是我们个别安装来将纯文本转成PostScript的程
序。你可以使用任何将文字转换成PostScript程序。FreeBSDports里(请阅读ThePorts
Collection)有一个叫做a2ps的程序能做文字转成PostScript的工作,你也许可以试试看。
11.4.1.3在没有postscript的打印机上模拟postscript
PostScript是高品质打印的defacto标准。然而,PostScript也是一个昂贵的标准。
值得庆幸的是,在FreeBSD下有个叫做Ghostscript的程序能仿真PostScript工作,这是
由AlladinEnterprises所发展的免费程序。Ghostscript可以读取大部分PostScript文
件并且将其结果输出至许多不同的设备上,包括许多非PostScript的打印机。只要安装
Ghostscript并为打印机设置一个非凡的文字过滤程序,你可以让你的非PostScript打印
机接收PostScript的命令。
假如你从FreeBSDports里安装Ghostscript,那么你一样也可以很快的取得、编译并
安装它。
要仿真PostScript,我们要有一个过滤程序来判定我们要打印的是不是PostScript文
件。假如不是,那么这个文件就直接交由打印机处理;否则,我们得先用Ghostscript将文
件转换成打印机可以处理的。
这里有一个例子下面的script是给HewlettPackardDeskJet500打印机用的文字
过滤程序。假如是其它的打印机,将gs(Ghostscript)命令的-sDEVICE参数换成你能使用
的设备即可。(你可以用gs-h这个命令得到目前系统安装的Ghostscript支持哪些设备)。
第27页FreeBSD使用手册
#!/bin/sh
#
#ifhp-PrintGhostscript-simulatedPostScriptonaDeskJet500
#Installedin/usr/local/libexec/hpif
#
#TreatLFasCR+LF:
#
printf“\033%26amp;k2G”||exit2
#
#Readfirsttwocharactersofthefile
#
readfirst_line
first_two_chars=‘expr“$first_line”:‘\(..\)’‘
if[“$first_two_chars”=“%!”];then
#
#ItisPostScript;useGhostscripttoscan-convertandprintit.
#
#notethatPostScriptfilesareactuallyinterpretedprograms,
#andthoseprogramsareallowedtowritetostdout,whichwill
#messuptheprintedoutput.So,weredirectstdouttostderr
#andthenmakedescriptor3gotostdout,andhaveGhostscript
#writeitsoutputthere.Exerciseforthecleverreader:
#capturethestderroutputfromGhostscriptandmailitbackto
#theuseroriginatingtheprintjob.
#
exec3%26gt;%26amp;11%26gt;%26amp;2
/usr/local/bin/gs-dSAFER-dNOPAUSE-q-sDEVICE=djet500\
第28页sOutputFile=/dev/fd/3-%26amp;%26amp;exit0·
#
/usr/local/bin/gs-dSAFER-dNOPAUSE-q-sDEVICE=djet500-sOutputFile=--\
%26amp;%26amp;exit0
else
#
#PlaintextorHP/PCL,sojustprintitdirectly;printaform
#attheendtoejectthelastpage.
#
echo$first_line%26amp;%26amp;cat%26amp;%26amp;printf“\033%26amp;l0H”%26amp;%26amp;exit0
fi
exit2
最后,你需要用if要害词指定这个过滤程序
:if=/usr/local/libexec/hpif:
这么一来,你可以输入lprplain.text和lprwhatever.ps而这两者应该都要可以正
确打印。
11.4.1.4转换用的过滤程序
在完成上面简单的打印机设置这一节所介绍的设置后,下面要做的就是为我们还想要
使用的文件格式(除了ASCII纯文本外)安装转换用的过滤程序。
11.4.1.4.1为什么要安装转换用的过滤器?
转换用的过滤程序让打印不同格式的文件变得很简单。举例来说,假如我们经常用TeX
来产生文件,但是我们的打印机是PostScript的。因此我们不能直接将由TeX产生的DVI
文件由打印机打出,而要先转换成PostScript的格式才能输出。这些转换的命令如下
%dvipsseaweed-analysis.dvi
%lprseaweed-analysis.ps
假如我们安装了DVI文件的转换程序,那么我们每次要打印时就可以省去自己转换格式
的动作,而交由LPD自己转。因此,我们要打印DVI文件时只要这一步就可以了
%lpr-dseaweed-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下的参数
cifplotcf
DVIdf
plotgf
ditroffnf
FORTRANtextrf
troffrf
rastervf
ifplaintext
在我们的例子里,使用lpr-d意思就是说打印机会需要用到/etc/printcap文件里由
df要害词所指定的过滤程序。
不管别人怎么说,像FORTRAN或是plot的资料可能都已经用不到了。在你的机器上,
你可以安装其它格式的过滤程序,如此一来你就可以将那些转换用的参数用来转换其它的
格式。举例来说,你希望可以直接打印Printerleaf文件(由Interleafdesktoppublishing
program产生的),而你用不到plot文件。那么你可以用gf要害词指定Printerleaf的转
第30页
-c
-d
-g
-n
-f
-f
-v
none,-p或-lFreeBSD使用手册
换用过滤程序。同时告诉你的使用者lpr-g命令就是“打印Printerleaf文件”。
11.4.1.4.3安装转换用的过滤程序
转换用过滤程序不属于FreeBSD本身的程序,因此它们可能被放在/usr/local目录下。
通常我们可以将它们放在/usr/local/libexec目录下,因为这些程序是专门给LPD运行的,
一般使用者并不会需要去直接执行它们。
要使用转换用过滤程序,只要将过滤程序的路径放在/etc/printcap设置文件里用合适
的要害词指定即可。
在我们的例子里,我们将为名为bamboo的打印机设置一个DVI转换过滤程序。以下是
/etc/printcap这个文件,其中打印机bamboo使用了df要害词。
#
#/etc/printcapforhostrose-addeddffilterforbamboo
#
rattan|line|diablo|lp|Diablo630LinePrinter:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|PanasonicKX-P4455PostScriptv51.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过滤程序是一个shellscript/usr/local/libexec/psdf。以下是它的原始代
码
#!bin/sh
#
第31页FreeBSD使用手册
#psdf-DVItoPostScriptprinterfilter
#Installedin/usr/local/libexec/psdf
#
#Invokedbylpdwhenuserrunslpr-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
PackardLaserJetIII-Si打印机所能处理的过滤程序
#!/bin/sh
#
#hpvf-ConvertGIFfilesintoHP/PCL,thenprint
#Installedin/usr/local/libexec/hpvf
PATH=/usr/X11R6/bin:$PATH;exportPATH
giftopnm|ppmtopgm|pgmtopbm|pbmtolj-resolution300\
%26amp;%26amp;exit0\
||exit2
它先将GIF格式转成portableanymap,然后再转成portablegraymap,接着再转成
portablebitmap,最后再转成与LaserJet/PCL兼容的资料。
第32页FreeBSD使用手册
下面是使用这个过滤程序的/etc/printcap例子
#
#/etc/printcapforhostorchid
#
teak|hp|laserjet|HewlettPackardLaserJet3Si:\
: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-Convertgroff’stroffdataintoPS,thenprint.
#Installedin/usr/local/libexec/pstf
#
execgrops|/usr/local/libexec/lprps“$@”
上面的script再一次使用lprps与打印机沟通。假如我们的打印机接在并口上,那么
我们可以用下面这个script取代上面的script
#!/bin/sh
#
#pstf-Convertgroff’stroffdataintoPS,thenprint.
#Installedin/usr/local/libexec/pstf
#
execgrops
而假如要使这个过滤程序,我们在/etc/printcap里的设置
第33页FreeBSD使用手册
:tf=/usr/local/libexec/pstf:
这里有一个让熟悉FORTRAN的老手惭愧的例子。这是一个让所有可以打印纯文本的打印
机打出FORTRAN-text的过滤程序。我们将在teak这台打印机上安装
#!/bin/sh
#
#hprf-FORTRANtextfilterforLaserJet3si:
#Installedin/usr/local/libexec/hprf
#
printf“\033%26amp;k2G”%26amp;%26amp;fpr%26amp;%26amp;printf“\033%26amp;l0H”%26amp;%26amp;exit0
exit2
我们只要将这个过滤程序在/etc/printcap文件里指定给teak这台打印机即可
:rf=/usr/local/libexec/hprf:
最后一个有点复杂的例子。我们要为先前提到的teak这台打印机新增一个可以将DVI
转成激光打印机能处理的格式。首先,先修改/etc/printcap文件中关于DVI过滤程序的位
置
:df=/usr/local/libexec/hpdf:
然后,我们要做出这个过滤程序。我们需要一个能将DVI转成激光打印机PCL格式的程
序。FreeBSDport里(请参考ThePortsCollection这一节)有一个dvi2xx是这个程序的
名称。安装这个程序能提供我们dvilj2p这个能将DVI转成LaserJetIIp、LaserJetIII
以及LaserJet2000兼容的格式。
dvilj2p这个程序使得hpdf这个过滤程序变得十分的复杂,因为dvilj2p无法从标准
输入取得资料。它得从文件中读资料。最糟糕的是,这个文件还必需以.dvi结尾,所以用
/dev/fd/0作为标准输入是不行的。我们可以用symbliclink产生一个暂时的文件名
(以.dvi结尾)指向/dev/fd/0,然后强迫dvilj2p从标准输入读取资料。
第34页FreeBSD使用手册
另一个问题就是我们无法用/tmp来存放我们暂时的连接。Symboliclinks的使用者及
群组为bin。而过滤程序是以使用者daemon的身份在执行。又/tmp目录设置了stickybit。
因此虽然过滤程序建立了连接,但是因为这个连接属于其它的使用者而无法删除。
因此,过滤程序将会把symboliclink建立在目前的目录下,也就是spooling目录(由
/etc/printcap文件中的sd要害词所指定)。这是让过滤程序来做这件事最好的地方,因为
(通常)这里的可用空间会比/tmp下来得多。
所以,这个过滤程序应该要这么写
#!/bin/sh
#
#hpdf-PrintDVIdataonHP/PCLprinter
#Installedin/usr/local/libexec/hpdf
PATH=/usr/local/bin:$PATH;exportPATH
#
#Defineafunctiontocleanupourtemporaryfiles.Theseexist
#inthecurrentdirectory,whichwillbethespoolingdirectory
#fortheprinter.
#
cleanup(){
rm-fhpdf$$.dvi
}
#
#Defineafunctiontohandlefatalerrors:printthegivenmessage
#andexit2.Exitingwith2tellsLPDtodonottrytoreprintthe
#job.
#
第35页FreeBSD使用手册
fatal(){
echo“$@”1%26gt;%26amp;2
cleanup
exit2
}
#
#Ifuserremovesthejob,LPDwillsendSIGINT,sotrapSIGINT
#(andafewothersignals)tocleanupafterourselves.
#
trapcleanup1215
#
#Makesurewearenotcollidingwithanyexistingfiles.
#
cleanup
#
#LinktheDVIinputfiletostandardinput(thefiletoprint).
#
ln-s/dev/fd/0hpdf$$.dvi||fatal“Cannotsymlink/dev/fd/0”
#
#MakeLF=CR+LF
#
printf“\033%26amp;k2G”||fatal“Cannotinitializeprinter”
#
#Convertandprint.Returnvaluefromdvilj2pdoesnotseemtobe
#reliable,soweignoreit.
第36页#
dvilj2p-M1-q-e-dfhp$$.dvi
#
#Cleanupandexit
#
cleanup
exit0
11.4.1.4.5自动转换用过滤程序转换外的另一种选择
上面这些过滤程序完整地建立了你的打印环境,但是使用者们必需自己决定要使用哪一
个过滤程序(对lpr命令下的参数)。假如你的使用者们并不擅长于使用计算机,要它们自己
选择适当的过滤程序来使用可能会造成它们的困扰。更严重的是,万一使用到不正确的过滤
程序来转换格式,那么可能会让你的打印机浪费许多不必要纸。
除了安装所有的转换用过滤程序外,你也许会想要试试文字过滤程序(默认的过滤程序)
自动扫描要打印的文件格式,同时自动呼叫其它的转换用过滤程序做适当的转换。像file
这样的工具对于这方面可能对这会有些帮助。然而,要区分出某些文件格式可能会有点困难
—当然,你也可以提供专门转换这些格式的过滤程序。
FreeBSDports里有一个叫做apsfilter的文字过滤程序可以做文件类型的自动扫描及
转换。它可以分辨出纯文本、PostScript以及DVI文件,然后做适当的格式转换后再打出。
11.4.1.5输出用的过滤程序
LPDspooling系统还支持一种我们还未介绍的过滤程序输出用过滤程序。输出用过滤
程序和文字过滤程序一样,只有打印纯文本才使用的,但是它简单多了。假如你用了输出用
过滤程序但是没有用文字过滤程序,那么
1.LPD在一份工作里将只执行一次输出用过滤程序,而不是为每一个文件都执行一
次。
2.LPD不会提供任何辨认文件开始或结束的信息给输出用的过滤程序。
FreeBSD使用手册
第37页FreeBSD使用手册
3.LPD不会将使用者的帐户及机器名称传给过滤程序,因此它不能做统计的动作。事
实上,它只有得到两个参数
filter-name-wwidth-llength
其中width是由打印机设置里的pw要害词所设置的,而length是由pl要害词所设置
的。请不要被输出用过滤程序简单的特性误导了。假如你想要用输出用过滤程序让一份工作
里每个文件都重新的一页开始打印,那是行不通的。你应该用的是文字过滤程序(也称为输
入用过滤程序),请参考安装文字过滤程序这一节。严格的说,输出用过滤程序实际上是较
复杂的,因为它必需检查送给它的数据是否含有非凡的字符,并代替LPD送信号给自己。
假如你需要打印headerpages或是需要送控制字符等其它的初始化字符串使得可以打印
headerpage,那么一个输出用过滤程序是必要的。(但是假如你是为了要向使用者收取打印
headerpage的费用的话,那么这是没有用的。因为LPD不会将任何使用者及机器的信息传
给输出用过滤程序。)
LPD答应一台打印机上同时拥有输出用过滤程序和文字过滤程序。在这个情况下,LPD
会执行输出用过滤程序打印headerpage(请阅读HeaderPages这一节),然后LPD会送2个
字节给这个过滤程序ASCII031以及ASCII001时期望输出用过滤程序将自己停下来。当
输出用过滤程序看到这两个字节(031,001)时,它应该要送SIGSTOP这个信号给自己。当
LPD运行完其它的过滤程序后,会送SIGCONT这个信号将输出用过滤程序重新激活。
假如只有输出用过滤程序但没有文字过滤程序,且LPD是要打印纯文本,那么LPD将
会用输出用过滤程序来做这些工作。输出用过滤程序将会直将的将打印工作中的文件序输出
到打印机而不会送出formfeed或是其它控制纸张移动的命令。因此这些结果可能不是你想
要的。几乎在所有的情况下,你都需要一个文字过滤程序。
我们以前介给过lpf程序,不但可以作为文字过滤程序,也可以当作输出用过滤程序使
用。假如你需要快速的设置好输出用过滤程序,但你不想自己写扫描资料字符及发送信号的
程序代码,那么你可以试试lpf。你也可以在shellscript中使用lpf将必要的初始化句
柄送给打印机。
11.4.1.6lpf:文字过滤程序
FreeBSD里附带的/usr/libexec/lpr/lpf是一个文字过滤程序(输入用过滤程序)。它可
以处理缩进(命令lpr-i)、原封不动地打出资料(以lpr-l命令送出的工作)、根据倒退字
第38页FreeBSD使用手册
符及TAB字符调整打印的位置,以及统计打印张数。它也可以拿来当作输出用过滤程序。
lpf适合在许多打印环境下使用。虽然它无法送初始化句柄给打印机,但是我们可以很轻易
的写一个shellscript送出需要的初始化句柄后再执行lpf。
为了让lpf可以正确的做打印张数统计,我们需要在/etc/printcap文件里为pw及pl
要害词填入适当的值。它根据这些值来计算一张纸上可以打多少字,以及打印使用者的工作
需要用几张纸。关于打印机的统计问题,请阅读统计打印机使用情况里更具体的说明。





