分享
 
 
 

FreeBSD handbook中文版 11 打印 (2)高级打印机设置 A.过滤器

王朝system·作者佚名  2006-11-23
窄屏简体版  字體: |||超大  

=============================================================

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 - adde

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有