1 FreeBSD handbook中文版 11 打印 基本设置( 九 )


这个问题,你可以让你的文字过滤程序送出FORM FEED 字符(或是其它需要的字符)给打印机 。
这个动作让打印机打出目前打印机缓存区里的资料 。同时也确定每个工作的最后一页可以完
整的输出,使得下个工作不会从前一个工作的最后一页中间输出 。
下面这个shell script 取代/usr/local/libexec/if-simple 。将工作送给打印机后,
会再送出一个form feed 字符:
#!/bin/sh
第18 页FreeBSD 使用手册
#
# if-simple - Simple text input filter for lpd
# Installed in /usr/local/libexec/if-simple
#
# Simply copies stdin to stdout. Ignores all filter arguments.
# Writes a form feed character (f) after printing job.
/bin/cat && printf “f” && exit 0
exit 2
打出了“阶梯效应” 。
你的结果可能是这个样子:
!”#$%&’()* ,-./01234
“#$%&’()* ,-./012345
#$%&’()* ,-./0123456
这时你已经成为因为换行字符冲突而产生的阶梯效应受害者 。Unix 风格的操作系统只
使用ASCII 码10,line feed (LF) 作为换行字符 。MS-Dos、OS/2 以及其它的操作系统使用
两个字符ASCII 码10 以及ASCII 码13 (称做carriage return 或CR) 。很多打印机使用MS-DOS
的表示法来代表换行字符 。
当你用FreeBSD 打印时,你的文件只用line feed 字符换行 。当打印机看到一个line feed
字符时,将纸卷了一行,仍然从同一个位置继续往后打印 。这就是为什么要用carriage
return 字符的原因:将下一个字的打印位置移到纸张的最左边 。
FreeBSD 希望你的打印机可以:
打印机收到CR 打印机打印CR
打印机收到LF 打印机打印CRLF
有一些方法可以达到这个目地:
1. 用打印机上的开关或控制面板设置这些字符的处理方式 。请查阅你的打印机手册并做正
确的设置 。
注意: 如果你的计算机安装了除了FreeBSD 外的操作系统,你也许得常常重新
设置打印机处理CR 和LF 的设置 。因此,你可能会希望使用下面其中之一的方
第19 页FreeBSD 使用手册
法:
2. 让FreeBSD 的串口驱动程序自动将LF 转换成CR LF 。当然,你的打印机只能在串行口
上 。如果要打开这个功能,只要在/etc/printcap 设置文件里为你的打印机用fs 关键词设
置CRMOD 这个位即可 。
3. 送一个句柄给打印机告诉它暂时把LF 字符做额外的处理 。请参阅你的打印机手册以了
解你的打印机是否支持此功能 。如果你找到适用的句柄,修改你的文字过滤程序先送出这些
句柄,再送出要打印的工作 。
下面这个文字过滤程序的例子是使用Hewlett-Packard PCL 句柄 。先让打印机将LF 视
为LF 和CR 处理,再送出工作 。最后,再送出将整页送出的句柄 。这个过滤程序应该可以应
付大部分Hewlett-Packard 的打印机 。
#!/bin/sh
#
# hpif - Simple text input filter for lpd for HP-PCL based printers
# Installed in /usr/local/libexec/hpif
#
# Simply copies stdin to stdout. Ignores all filter arguments.
# Tells printer to treat LF as CR LF. Ejects the page when done.
printf “33&k2G” && cat && printf “33&l0H” && exit 0
exit 2
而下面这个/etc/printcap 的例子是设置一台叫做orchid 计算机 。它在第一个并口连
接了一台叫做teak 的Hewlett-Packard LaserJet 3Si 打印机 。同时,它使用了上述的script
作为它的文字过滤程序:
#
# /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:
第20 页每一行都重迭在一起
打印机从不换行,把每一行都印在同一行上 。这个问题和上述的阶梯效应“相反” 。而
且也较罕见 。FreeBSD 用来换行的LF 字符被当成CR 字符使得打印机一直回到纸张的最左边

推荐阅读