11.4 高级打印机设置
11.4.2 Header Pages
如果你有很多使用者使用不同的打印机,那么你也许会觉得需要打印header pages.Header pages,也称做banner 或burst pages,是用来辨认打出来的工作是属于谁的。通常header pages 以粗体的大字,可能再加上外框打出来的,如此,使用者才能快速的在一堆打出的结果找到属于自己的部分。不过header page 的缺点就是每个工作都会多使用一张纸来打印header page.它的功用可能不会超过一分钟,而最后的下场都是丢进资源回收箱或是垃圾筒。(不过header pages 是一份工作一张,而不是一个文件一张,所以纸张的浪费可能没有你想象的那么严重)。
如果你的打印机可以直接打印纯文本的话,那么LPD 可以自动为你的输出加上headerpages.如果你的打印机是PostScript 的,那么你将会需要额外的程序来产生header page;请阅读在PostScript 打印机上打印Header Pages 这一节。
11.4.2.1 启用header pages
在简单的打印机设置这节里,我们在/etc/printcap 文件里利用设置sh 以不打印headerpage (sh 即“suppress header”的意思)。如果某一台打印机要打印header pages 的话,那么只要将sh 关键词删除就行了。
看起来是不是很简单?
没错。你也许需要提供一个输出用过滤程序将初始化句柄送给打印机。下面是一个适用于Hewlett Packard PCL 兼容打印机使用的输出用过滤程序:
#!/bin/sh
#
# hpof - Output filter for Hewlett Packard PCL-compatible printers
# Installed in /usr/local/libexec/hpof
printf “\033&k2G” || exit 2
第39 页FreeBSD 使用手册
exec /usr/libexec/lpr/lpf
我们用of 关键词来指定输出用过滤程序的路径。请阅读输出用的过滤程序这一节以取得更多的信息。
下面是一个为我们先前提到的打印机teak 在teak 文件里设置要打印header pages 及输出用过滤程序的例子:
#
# /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si::lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0::if=/usr/local/libexec/hpif::vf=/usr/local/libexec/hpvf::of=/usr/local/libexec/hpof:
现在,当使用者用teak 打印时,它们每个工作都会有一张header page.如果使用者们愿意花时间自己找出自己打出的东西,那么它们可以用lpr -h 命令设置不打出header pages;请阅读Header Page 参数以得知更多lpr 的参数。
注意: LPD 打完header page 后会送出form feed 字符。如果你的打印机送出纸张的命令不是用这个字符,你可以在/etc/printcap 文件中用ff 关键词指定。
11.4.2.2 控制header pages
如果选择要打印header pages,LPD 将会产生出long header,这将使用者、机器以及工作名称以大字打印在一整页上。这里有一个例子(kelly 从rose 这台印机打印outline 这个工作):
k ll ll
k l l
k l l
k k eeee l l y y
k k e e l l y y
k k eeeeee l l y y
kk k e l l y y
第40 页ll
FreeBSD 使用手册
k k e e l l y yy
k k eeee lll lll yyy y
y
y y
yyyy
t l i
t l
oooo u u ttttt l ii n nnn eeee
? o u u t l i nn n e e
? o u u t l i n n eeeeee
? o u u t l i n n e
? o u uu t t l i n n e e
oooo uuu u tt lll iii n n eeee
r rrr oooo ssss eeee
rr r o o s s e e
r o o ss eeeeee
r o o ss e
r o o s s e e
r oooo ssss eeee
Job: outline
Date: Sun Sep 17 11:04:58 1995
LPD 在打印完这些后会送出form feed 字符,使得真正的打印工作会以新的一页开始打印(除非你在/etc/printcap 文件为指定的打印机设置了sf (supress form feeds))。第41 页FreeBSD 使用手册
如果你希望LPD 打印short header,那么在/etc/printcap 文件里使用sb (short banner)即可。这样打出来的header page 看起来会像下面这个样子:
rose:kelly Job: outline Date: Sun Sep 17 11:07:51 1995
LPD 的默认值是先打印header page 再打印工作。如果你想要调换顺序,那么在/etc/printcap 里使用hl (header last) 即可。
11.4.2.3 统计打印
如果我们打印LPD 内建的header pages,那么在做统计时可能会遇到一个问题:headerpages 得免费提供。为什么?因为只有控制打印header page 的输出用过滤程序可以在打印header pages 时做打印统计,但是这个过滤程序却没有使用者及机器的资料或是一个统计资料文件,所以无法向使用者收钱。我们也不能在文字过滤程序或是转换用过滤程序(这些过滤程序可以直接取得使用者及机的资料)将统计结果都“多加上一页”,因为使用者可以用lpr -h 命令设置不要打印header page,而你可能就向这些使用者多收了打印header page 的费用。基本上,lpr -h 是许多较环保的使用者喜好的参数,你无法鼓励别人不去使用它。而修改每个过滤程序使它们都可以打出header page 也是不可行的(虽然这么做就可以正确的计费)。因为LPD 并不会把使用者有没有使用-h 的信息传给过滤程序,这么一来,即使使用者下了lpr -h 的命令要求不打印header page,它仍然会因为得到一张header page 而多收取了这个费用。
那么,有什么好办法呢?
你可以:
1. 接收LPD 的缺点,不收取打印header page 的费用。
2. 安装可以取代LPD 的程序,比如说LPRng 或是PLP。请参考标准Spooler 之外的选择
这一节所介绍其它可以替代LPD 的程序。
3. 撰写一个聪明的输出用过滤程序。在打印header page 及纯文本时,如果没有文字(输入用)过滤程序,那么一般的输出用过滤程序只做初始化打印机以及一些简单的字符转换工作。如果有设置文字过滤程序,那么LPD 只会用输出用过滤程序来做打印header page的工作。事实上,输出用过滤程序可以根据从LPD 产生的header page 资料来判断打印工作的使用者及机器而加以收费。唯一的问题就是输出用过滤程序会无法取得记录使用情况的记录文件(由af 关键词所指用的记录文件不会被传入),但是如果你的记录文件是固定的,你可以这个文件直接设置在输出用过滤程序里。如果你考虑要用这种方式来第42 页FreeBSD 使用手册处理的话,那么在/etc/printcap 文件使用sh (short header) 关键词使判断的工作较容易。上述的做法其实可能是很麻烦的,比较起来,使用者应该会较感谢让打印header page免费的管理者。
# Check arguments
#
11.4.2.4 在postscript 打印机上打印header pages
前面提到LPD 可以为打印机产生合适的纯文本header page,当然,因为PostScript 不能直接打印纯文本,所以LPD 产生header page 的工能在PostScript 打印机上是用不到的―或是几乎用不到。
一个直接产生header page 的方法是让所有的转换用过滤程序及文字过滤程序产生header page.过滤程序可以让使用者及机器的参数产生合适的header page.这个方法的缺点就是即使使用者以lpr -h 的方式送出工作,它们仍然会得到header pages.让我们来试试这个方法。下面的script 可以接收三个参数(使用者名称、机器名称以及工作名称)并产生PostScript 打印机能打印的header page:
#!/bin/sh
#
# make-ps-header - make a PostScript header page on stdout
# Installed in /usr/local/libexec/make-ps-header
#
#
# These are PostScript units (72 to the inch). Modify for A4 or
# whatever size paper you are using:
#
page_width=612
page_height=792
border=72
#
第43 页if [ $# -ne 3 ]; then
exit 1
fi
#
#
user=$1
host=$2
job=$3
date=‘date‘
#
#
exec cat
%!PS
%
%
save
%
%
$border $border moveto
FreeBSD 使用手册
echo “Usage: ‘basename $0‘ ” 1&2
# Save these, mostly for readability in the PostScript, below.
# Send the PostScript code to stdout.
% Make sure we do not interfere with user’s job that will follow
% Make a thick, unpleasant border around the edge of the paper.
$page_width $border 2 mul sub 0 rlineto
0 $page_height $border 2 mul sub rlineto
第44 页%
%
($user) show
%
%
/y 200 def
[ (Job:) (Host:) (Date:) ] {
forall
/y 200 def
[ ($job) ($host) ($date) ] {
FreeBSD 使用手册
currentscreen 3 -1 roll pop 100 3 1 roll setscreen
$border 2 mul $page_width sub 0 rlineto closepath
0.8 setgray 10 setlinewidth stroke 0 setgray
% Display user’s login name, nice and large and prominent
/Helvetica-Bold findfont 64 scalefont setfont
$page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto
% Now show the boring particulars
/Helvetica findfont 14 scalefont setfont
200 y moveto show /y y 18 sub def }
/Helvetica-Bold findfont 14 scalefont s