Links
Comment on page

11.5.LPD(行式打印机程序)

将文件在后台打印的过程称为spooling,假脱机。假脱机使用户在计算机上可继续执行其他程序,而无需等待打印机慢慢完成打印任务。
FreeBSD 包含一个名为 lpd(8) 的假脱机。使用 lpr(1) 提交打印作业。

11.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:\
:lp=/dev/unlpt0:\
:sh:\
:mx#0:\ ④
:sd=/var/spool/lpd/lp:\
:lf=/var/log/lpd-errs: ⑥
①此打印机的名称。lpr(1) 将打印作业发送到 lp 打印机,除非使用 -P 指定其他打印机,因此默认打印机应命名为 lp
②打印机连接的设备。根据此处显示的连接类型替换此行。
③阻止打印作业开始时的页头打印。 ④不限制打印作业的最大大小。 ⑤此打印机的排队目录的路径。每台打印机使用其自己的排队目录。 ⑥报告此打印机上的错误的日志文件。
创建 /etc/printcap 后,使用 chkprintcap(8) 检查是否有错误:
# chkprintcap
在继续之前解决任何报告的问题。
/etc/rc.conf 中启用 lpd(8)
lpd_enable="YES"
启动服务:
# service lpd start

11.5.2. 使用 lpr(1) 打印

使用 lpr 将文档发送到打印机。要打印的文件可以在命令行上命名,也可以通过管道传递给 lpr。以下两个命令是等效的,将 doc.txt 的内容发送到默认打印机:
% lpr doc.txt
% cat doc.txt | lpr
可以使用 -P 选择打印机。要打印到名为 laser 的打印机:
% lpr -Plaser doc.txt

11.5.3. 过滤器

到目前为止,所示的示例直接将文本文件的内容发送到打印机。只要打印机理解这些文件的内容,输出就会正确打印。
某些打印机无法打印纯文本,而输入文件甚至可能不是纯文本。
过滤器 允许对文件进行翻译或处理。典型用途是将一种类型的输入(如纯文本)翻译为打印机能理解的形式,如 PostScript® 或 PCL。过滤器还可用于提供其他功能,如添加页码或突出显示源代码以便于阅读。
这里讨论的过滤器是 输入过滤器文本过滤器。这些过滤器将输入文件转换为不同的形式。在创建文件之前,请使用 su(1) 切换为 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:\
:lf=/var/log/lpd-errs:
if= 标识将在传入文本上使用的 输入过滤器
技巧
printcap 条目中行末的反斜杠 行继续 字符显示打印机条目实际上只是一个由冒号字符分隔的条目的一行。可以将较早的示例重写为单个不太可读的行:
lp:lp=/dev/unlpt0:sh:mx#0:sd=/var/spool/lpd/lp:if=/usr/local/libexec/lf2crlf:lf=/var/log/lpd-errs:

11.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:\
通过打印相同的纯文本文件测试过滤器。回车将使每行从页面的左侧开始。

11.5.3.2. 使用 print/enscript在 PostScript® 打印机上打印漂亮的纯文本

GNU Enscript 将纯文本文件转换为格式良好的 PostScript®,以便在 PostScript® 打印机上打印。它添加页面编号、换行长行,并提供许多其他功能,使得打印的文本文件更容易阅读。根据本地纸张尺寸,从 Ports Collection 安装 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:\
通过打印一个纯文本文件来测试该过滤器。

11.5.3.3. 将 PostScript® 打印到PCL打印机

许多程序生成 PostScript® 文档。然而,廉价的打印机通常只能理解纯文本或PCL。此过滤器在将 PostScript® 文件发送到打印机之前将其转换为PCL
从 Ports 安装 Ghostscript PostScript® 解释器 print/ghostscript9-base
使用以下内容创建 /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

11.5.3.4. 智能过滤器

一个能够检测输入类型并自动将其转换为打印机理解的正确格式的过滤器可能非常方便。PostScript® 文件的前两个字符通常是 %!。过滤器可以检测这两个字符。PostScript® 文件可以无修改地发送到 PostScript® 打印机。纯文本文件可以像前面展示的那样使用 Enscript 转换为 PostScript®。使用以下内容创建 /usr/local/libexec/psif
#!/bin/sh
#
# psif——在 PostScript 打印机上打印 PostScript 或纯文本
#
IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`
case "$first_two_chars" in
%!)
# %! : PostScript 任务,打印它。
echo "$first_line" && cat && exit 0
exit 2
;;
*)
# 否则,使用 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® 和纯文本文件来测试该过滤器。

11.5.3.5. 其他智能过滤器

编写一个能够检测许多不同类型的输入并正确格式化它们的过滤器是具有挑战性的。Ports Collection 中的 print/apsfilter 是一个智能的“魔术”过滤器,可以检测数十种文件类型并自动将它们转换为打印机理解的PDL。有关更多详细信息,请参见 http://www.apsfilter.org

11.5.4. 多个打印队列

/etc/printcap 中的条目实际上是对队列的定义。对于单个打印机,可以有多个队列。与过滤器结合使用时,多个队列使用户能够更好地控制打印作业的打印方式。
例如,假设办公室中有一台网络 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® 文件,该队列不进行任何过滤。
这种多队列技术可用于提供对各种打印机功能的直接访问。具有双面打印机的打印机可以使用两个队列,一个用于普通的单面打印,另一个使用过滤器发送命令序列以启用双面打印,然后发送传入的文件。

11.5.5. 监控和控制打印

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

11.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

11.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

11.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)

11.5.6. 共享打印机

在企业和学校中,打印机通常由多个用户共享。提供了一些额外的功能,使共享打印机更加方便。

11.5.6.1. 别名

打印机名称设置在 /etc/printcap 条目的第一行。可以在该名称之后添加附加名称,即 别名。别名与名称和彼此之间使用竖线分隔:
lp|repairsprinter|salesprinter:\
可以使用别名代替打印机名称。例如,销售部门的用户可以使用以下命令将文档打印到他们的打印机:
% lpr -Psalesprinter sales-report.txt
维修部门的用户可以使用以下命令将文档打印到 他们的 打印机:
% lpr -Prepairsprinter repairs-report.txt
所有文档都打印在同一台打印机上。当销售部门发展壮大到需要自己的打印机时,可以从共享打印机条目中删除别名,并将其用作新打印机的名称。两个部门的用户继续使用相同的命令,但销售文档发送到新打印机。

11.5.6.2. 页眉页

对于用户来说,在繁忙的共享打印机产生的一叠页面中找到他们的文档可能会很困难。页眉页 是为解决这个问题而创建的。在每个打印作业之前打印一个包含用户名和文档名称的页眉页。这些页面有时也称为 横幅分隔符 页。
启用页眉页的方式取决于打印机是通过 USB、并行还是串行电缆直接连接到计算机,还是通过网络远程连接的。
在直接连接打印机的情况下,通过从 /etc/printcap 条目中删除 :sh:(抑制页眉)行来启用页眉页。这些页眉页仅使用换行符进行新行。某些打印机将需要 /usr/share/examples/printing/hpif 过滤器以防止楼梯状文本。该过滤器配置 PCL 打印机在接收到换行符时同时打印回车符和换行符。
网络打印机的页眉页必须在打印机本身上进行配置。/etc/printcap 中的页眉页条目将被忽略。通常,可以从打印机前面板或使用 Web 浏览器访问的配置 Web 页上找到设置。

11.5.7. 参考

示例文件:/usr/share/examples/printing/
4.3BSD Line Printer Spooler Manual/usr/share/doc/smm/07.lpd/paper.ascii.gz
手册页:[printcap(5)](https://man.freebsd.org/cgi/man.cgi?query=printcap&sektion
=5&format=html),lpd(8)lpr(1)lpc(8)lprm(1)lpq(1)
FreeBSD 中文社区