9.5. LPD(行列式打印机Daemon)

在背景打印一个档案称作Spooling,缓冲程序(Spooler)让使用者能够继续执行电脑的其他程序而不需要等候打印机缓慢的完成打印工作。

FreeBSD内含的缓冲程序(Spooler)称作lpd(8),而打印工作会使用lpr(1)来提交。

9.5.1. 初始设定

建立要用来储存打印工作的目录、设定拥有关系以及权限来避免其他使用者可以检视这些档案的内容:

# mkdir -p /var/spool/lpd/lp
# chown daemon:daemon /var/spool/lpd/lp
# chmod 770 /var/spool/lpd/lp

印表机会定义在/etc/printcap,每台打印机项目所包含的详细数据有名称、连接的接头以及各种其他设定。建立/etc/printcap使用以下内容:

lp:\				1
	:lp=/dev/unlpt0:\	2
	:sh:\			3
	:mx#0:\			4
	:sd=/var/spool/lpd/lp:\	5
	:lf=/var/log/lpd-errs:	6

1

打印机的名称。lpr(1)会传送打印工作到lp打印机,除非有使用-P来指定其他打印机,所以预的打印机名称应使用lp

2

打印机所连接到装置。替换此行为正确的联机类型,如此处所示。

联机类型/etc/printcap的装置项目
USB
:lp=/dev/unlpt0:\

此为不会重设 USB打印机的装置,若使用上发生问题,请改使用ulpt0,这个装置会在每次使用后重设USB端口。

并列
:lp=/dev/lpt0:\
网络

针对支持LPD通信协定的打印机:

:lp=:rm=network-printer-name:rp=raw:\

针对支持使用端口号9100打印的打印机:

:lp=9100@network-printer-name:\

针对两者皆支持的打印机,请替换network-printer-name为网络打印机的DNS主机名称。

序列
:lp=/dev/cuau0:br=9600:pa=none:\

这些是一般序列打印机连接到主板序列端口会采用的数值,传输速率(Baud rate)是9600且无同位检查(No Parity)。

3

在打印工作开始时不打印首页。

4

不限制打印工作的最大尺寸。

5

此打印机的缓冲(Spooling)目录路径,每台印表机会自己使用一个独立的缓冲(Spooling)目录。

6

回报此打印机的错误的日志档。

在建立/etc/printcap之后,使用chkprintcap(8)测试打印机是否有错误:

# chkprintcap

在继续之前修正任何回报的问题。

开启/etc/rc.conf中的lpd(8)

lpd_enable="YES"

启动服务:

# service lpd start

9.5.2. 使用lpr(1)打印

文档将用 lpr 发送到打印机。要打印的文件可以在命令行上命名,也可以通过管道到lpr中。这两个命令是等效的, 将 doc.txt 的内容发送到默认打印机:

% lpr doc.txt
% cat doc.txt | lpr

可以使用-P选项选择打印机。使用名为laser的打印机打印:

% lpr -Plaser doc.txt

9.5.3. 过滤器

到目前为止显示的示例已将文本文件的内容直接发送到打印机。只要打印机理解这些文件的内容,输出就会被正确打印。

有些打印机无法打印纯文本,输入文件甚至可能不是纯文本。

过滤器允许翻译或处理文件。典型的用法是将一种输入(如纯文本)转换为打印机可以理解的格式,如PostScript® 或 PCL。过滤器还可以用于提供其他功能,例如添加页码或突出显示源代码,以使其更易于阅读。

这里讨论的过滤器是输入过滤器文本过滤器。这些筛选器将传入文件转换为不同的格式。在创建文件之前,使用 su 获得 root 权限。

过滤器在 /etc/printcap 中使用 if= 标识符指定。要使用 /usr/local/libexec/lf2crlf 作为过滤器,请像这样修改/etc/printcap

lp:\
	:lp=/dev/unlpt0:\
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/lp:\
	:if=/usr/local/libexec/lf2crlf:\   1
	:lf=/var/log/lpd-errs:

1

if= 标识将在传入文本上使用的 input filter

提示:

printcap项中行尾的反斜杠行连续字符表明,打印机项实际上只是一个长行,其中的项由冒号字符分隔。前面的示例可以重写为单个可读性较差的行:

lp:lp=/dev/unlpt0:sh:mx#0:sd=/var/spool/lpd/lp:if=/usr/local/libexec/lf2crlf:lf=/var/log/lpd-errs:

9.5.3.1. 避免在纯文字打印机阶梯状打印

典型的 FreeBSD 文本文件在每行末尾只包含一个换行符。标准打印机上将结束此行:

A printed file looks
                    like the steps of a staircase
                                                 scattered by the wind

过滤器可以将换行符转换为回车和换行符。回车使打印机在每行之后回到左边。用下列内容创建/usr/local/libexec/lf2crlf

#!/bin/sh
CR=$'\r'
/usr/bin/sed -e "s/$/${CR}/g"

设置可执行权限权限:

# chmod 555 /usr/local/libexec/lf2crlf

修改/etc/printcap以使用新的过滤器:

:if=/usr/local/libexec/lf2crlf:\

通过打印相同的纯文本文件来测试筛选器。回车将使每一行从页面的左侧开始。

9.5.3.2. 使用print/enscriptPostScript®打印机美化纯文字内容

GNU Enscript将纯文本文件转换为格式精美的PostScript®,以便在PostScript®打印机上打印。它添加页码,换行,并提供许多其他功能,使打印的文本文件更易于阅读。根据本地纸张大小,安装 Port 中的print/enscript-letterprint/enscript-a4

使用下列内容创建/usr/local/libexec/enscript

#!/bin/sh
/usr/local/bin/enscript -o -

设置可执行权限权限:

# chmod 555 /usr/local/libexec/enscript

修改/etc/printcap以使用新的过滤器:

:if=/usr/local/libexec/enscript:\

通过打印纯文本文件来测试过滤器。

9.5.3.3. 打印PostScript®到PCL打印机

有许多程序用于生成PostScript®文档。但便宜的打印机只认纯文本或PCL。在其被送到打印机之前这个过滤器将PostScript®转换为PCL

从 Port 安装 Ghostscript PostScript®解释器。

使用这些内容创建/usr/local/libexec/ps2pcl

#!/bin/sh
/usr/local/bin/gs -dSAFER -dNOPAUSE -dBATCH -q -sDEVICE=ljet4 -sOutputFile=- -

设置可执行权限权限:

# chmod 555 /usr/local/libexec/ps2pcl

在被发送到打印机之前,这个脚本将PostScript®转换为PCL

修改/etc/printcap来启用新的输入过滤器:

:if=/usr/local/libexec/ps2pcl:\

发送PostScript®程序到过滤器,用于测试:

% printf "%%\!PS \n /Helvetica findfont 18 scalefont setfont \
72 432 moveto (PostScript printing successful.) show showpage \004" | lpr

9.5.3.4. 智能过滤器

一个能检测输入类型并自动将其转换为打印机能识别的格式的过滤器能缩短打印流程。PostScript®文件的开头两个字符一般是%!。筛选器可以检测到这两个字符。 PostScript®文件可以原样发送到PostScript®打印机。可以使用Enscript将文本文件转换成PostScript®文件,使用以下内容创建/usr/local/libexec/psif

#!/bin/sh
#
#  psif - Print PostScript or plain text on a PostScript printer
#
IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

case "$first_two_chars" in
%!)
    # %! : PostScript job, print it.
    echo "$first_line" && cat && exit 0
    exit 2
    ;;
*)
    # otherwise, format with enscript
    ( echo "$first_line"; cat ) | /usr/local/bin/enscript -o - && exit 0
    exit 2
    ;;
esac

设置可执行权限权限:

# chmod 555 /usr/local/libexec/psif

修改/etc/printcap来启用新的输入过滤器:

:if=/usr/local/libexec/psif:\

使用PostScript®和纯文本文件测试过滤器。

9.5.3.5. 其他智能过滤器

编写一个过滤器来检测许多不同类型的输入并正确设置它们的格式是很有挑战性的。Port 中的print/apsfilter是一个智能过滤器,它可以检测多种文件类型并将其自动转换为打印机可以理解的PDL。更多信息请参阅http://www.apsfilter.org

9.5.4. 多序列

/etc/printcap中的条目实际上是queues的定义。单个打印机可以有多个队列。当与筛选器结合使用时,多个队列使用户能够更好地控制其作业的打印方式。

例如,考虑在办公室中使用联网的PostScript®激光打印机。 大多数用户希望打印纯文本,但一些高级用户希望能够直接打印PostScript®文件。可在/etc/printcap中为同一打印机创建两个条目:

textprinter:\
	:lp=9100@officelaser:\
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/textprinter:\
	:if=/usr/local/libexec/enscript:\
	:lf=/var/log/lpd-errs:

psprinter:\
	:lp=9100@officelaser:\
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/psprinter:\
	:lf=/var/log/lpd-errs:

发送到textprinter的文档将使用/usr/local/libexec/enscript格式化,就像之前展示的那样。高级用户可以使用psprinter打印PostScript®文件,这将不适用过滤器。

这种多队列技术可用于提供对各种打印机功能的直接访问。带有双面打印器的打印机可以使用两个队列,一个用于普通单面打印,另一个带有一个筛选器,该筛选器发送命令序列以启用双面打印,然后发送传入文件。

9.5.5. 监视与控制打印

有几个程序可用于监视打印作业以及检查和控制打印机操作。

9.5.5.1. lpq(1)

lpq(1) 它显示用户打印作业的状态。不会显示来自其他用户的打印作业。

在单个打印机上显示当前用户的待处理作业:

% lpq -Plp
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     0    (standard input)                      12792 bytes

在所有打印机上显示当前用户的待处理作业:

% lpq -a
lp:
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     1    (standard input)                      27320 bytes

laser:
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     287  (standard input)                      22443 bytes

9.5.5.2. lprm(1)

lprm(1)用于删除打印作业。普通用户只能删除自己的作业。root 可删除任意作业。

从打印机中删除所有未解决的作业:

# lprm -Plp -
dfA002smithy dequeued
cfA002smithy dequeued
dfA003smithy dequeued
cfA003smithy dequeued
dfA004smithy dequeued
cfA004smithy dequeued

从打印机中删除单个作业。lpq(1)用于找出作业编号。

% lpq
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     5    (standard input)                      12188 bytes
% lprm -Plp 5
dfA005smithy dequeued
cfA005smithy dequeued

9.5.5.3. lpc(8)

lpc(8)用于查看和修改打印机状态。lpc 之后是命令和可选的打印机名称。可以使用all代替特定的打印机名称,并且该命令将应用于所有打印机。普通用户可使用 lpc(8)查看打印机状态. 只有root可使用该命令修改打印机状态。

显示所有打印机的状态:

% lpc status all
lp:
	queuing is enabled
	printing is enabled
	1 entry in spool area
	printer idle
laser:
	queuing is enabled
	printing is enabled
	1 entry in spool area
	waiting for laser to come up

防止打印机接受新作业, 然后再次开始接受新作业:

# lpc disable lp
lp:
	queuing disabled
# lpc enable lp
lp:
	queuing enabled

停止打印, 但继续接受新作业。然后重新开始打印:

# lpc stop lp
lp:
	printing disabled
# lpc start lp
lp:
	printing enabled
	daemon started

在出现某些错误情况后重新启动打印机:

# lpc restart lp
lp:
	no daemon to abort
	printing enabled
	daemon restarted

关闭打印队列并禁用打印,并向用户返回错误信息:

# lpc down lp Repair parts will arrive on Monday
lp:
	printer and queuing disabled
	status message is now: Repair parts will arrive on Monday

重新启用已关闭的打印机:

# lpc up lp
lp:
	printing enabled
	daemon started

更多信息请参阅lpc(8)

9.5.6. 分享打印机

在企业和学校,打印机通常由多个用户共享。有些功能使共享打印机更加方便。

9.5.6.1. 别名

打印机名称在/etc/printcap第一行设置。其他别名可以添加在那个名字之后。别名通过竖线与名称分开:

lp|repairsprinter|salesprinter:\

可以使用别名代替打印机名称。例如,销售部门的用户使用

% lpr -Psalesprinter sales-report.txt

维修部门的用户使用

% lpr -Prepairsprinter repairs-report.txt

所有的文件都在那台打印机上打印。当销售部门增长到需要自己的打印机时,可以从共享打印机条目中删除别名,并将其用作新打印机的名称。两个部门的用户继续使用相同的命令,但销售文档将发送到新打印机。

9.5.6.2. 标题页

用户很难在繁忙的共享打印机生成的页面堆栈中找到他们的文档。标题页(Header Page)用于解决此问题。在每个打印作业之前都会打印带有用户名和文档名的标题页。这些页面有时也被称为banner page 或 separator page。

启用Header Pages的方式不同,具体取决于打印机是通过USB、并行或串行电缆直接连接到计算机,还是通过网络远程连接。

直接连接打印机上的页眉页是通过从/etc/printcap中的条目中删除:sh:\(Suppress Header)行来启用的这些标题页仅将换行符用于新行。一些打印机需要/usr/share/examples/printing/hpif过滤器以防止阶梯式文本(stairstepped text)。过滤器将PCL打印机配置为在接收到换行符时同时打印回车和换行符。

必须在打印机本身上配置网络打印机的页眉。忽略/etc/printcap中的标题页条目。通常可以从打印机前面板或可通过Web浏览器访问的配置网页上进行设置。

9.5.7. 参考文献

示例文件: /usr/share/examples/printing/

The 4.3BSD Line Printer Spooler Manual, /usr/share/doc/smm/07.lpd/paper.ascii.gz.

手册页:printcap(5), lpd(8), lpr(1), lpc(8), lprm(1), lpq(1)

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.