8. 如何进行设置

对于常见的配置,您可能完全可以忽略本节内容 - 相反,您应该直接跳转到下面的第 9 节,或者更好的是,您供应商的文档。大多数 GNU/Linux 发行版提供了一个或多个“傻瓜式”工具,可以为您完成此处描述的所有常见打印机操作。

如果您的供应商工具对您不起作用,或者您希望在打印时能够交互式地控制打印选项,那么您应该使用其他系统。APS Filter 是另一个不错的系统;它可以在几乎任何类型的 Unix 系统上非常轻松地配置 LPD 队列和过滤器。

您还可以使用来自 linuxprinting.org 网站的打印系统接口,将许多免费驱动程序连接到多个假脱机系统。一旦该项目完成,这些接口将提供最佳的功能:支持所有风格的自由软件驱动程序,用户可设置选项可用,并且支持大多数常见的假脱机系统。目前,foomatic 打印系统已在大多数现代发行版中使用。但是,您的发行版可能包含略微过时的 foomatic 版本。

8.1. 配置 CUPS

如果您正在使用带有 CUPS 的客户端,并且已经配置了 CUPS 服务器,那么在您的客户端上安装打印机就再简单不过了:什么都不做。通过广播,客户端应该找到 CUPS 服务器并自动配置安装在该打印服务器上的打印机。这是 CUPS 的一个功能,在大型网络上将非常受欢迎。

使用 CUPS 手动配置打印机也轻而易举。如果您是 CUPS 和/或 Unix 打印的新手,那么最可能的方法是使用 Web 界面。如果您必须配置大量打印机,那么使用命令行可能会更快。

访问 CUPS Web 界面的 URL 默认是 http://hostname:631/admin。如果需要,可以在 cupsd.conf 中更改端口。

要从命令行添加打印机,通用语法是 lpadmin -p printer -E -v device -m ppd。带有 -p 选项的 Lpadmin 添加或修改打印机。打印机保存在文件中。-x 选项删除指定的打印机。阅读 lpadmin 手册页以获取可用选项。

示例 3. 命令行示例

/usr/sbin/lpadmin -p testpr1 -E -v socket://192.168.1.9 -m deskjet.ppd
/usr/sbin/lpadmin -p testpr2 -E -v parallel:/dev/lp0 -m laserjet.ppd
/usr/sbin/lpadmin -x testpr1

有关配置打印机和选项的更多信息,请参阅 CUPS 文档。《软件管理员手册》将教会您配置 CUPS 打印机所需的一切知识。

8.2. 配置 LPD

直到最近,大多数 GNU/Linux 发行版都附带了 LPD。本节描述了 LPD 的非常基本的设置;后续章节详细介绍了复杂过滤器和网络配置的创建。

8.2.1. 基本 LPD 配置

lpd 的最小设置会产生一个可以对文件进行排队和打印的系统。它不会关注您的打印机是否能理解它们,并且可能不会让您产生美观的输出。但我们必须从某个地方开始。

要向 lpd 添加打印队列,您必须在/etc/printcap中添加一个条目,并在/var/spool/lpd.

下创建新的假脱机目录。/etc/printcap中的条目
# LOCAL djet500
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :mx#0:\
        :lp=/dev/lp0:\
        :sh:
这定义了一个名为 lpdjdeskjet 的假脱机,假脱机目录为/var/spool/lpd/dj,没有每个作业的最大尺寸限制,打印到设备/dev/lp0,并且没有横幅页(带有打印者的姓名等)添加到打印作业的开头。

现在去阅读手册页printcap.

上面看起来很简单,但有一个陷阱 - 除非我发送 DeskJet 500 可以理解的文件,否则这台 DeskJet 会打印出奇怪的东西。例如,将普通的 Unix 文本文件发送到 deskjet 会导致字面解释的换行符,并让我得到
This is line one.
	This is line two.
		This is line three.
无穷无尽的阶梯效果。将 PostScript 文件打印到此假脱机将得到 PostScript 命令的美丽列表,并使用这种“阶梯效果”打印出来,但没有有用的输出。

显然需要更多,这就是过滤的目的。你们当中更细心的人阅读了 printcap 手册页可能会注意到假脱机属性ifof。好吧,if,或者输入过滤器,正是我们这里需要的。

如果我们编写一个小型的 shell 脚本,名为 filter,在换行符之前添加回车符,则可以消除阶梯效果。因此,我们必须在上面的 printcap 条目中添加一个if
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :mx#0:\
        :lp=/dev/lp0:\
        :if=/var/spool/lpd/dj/filter:\
        :sh:
一个简单的过滤器脚本可能是
#!perl
# The above line should really have the whole path to perl
# This script must be executable: chmod 755 filter
while(<STDIN>){chomp $_; print "$_\r\n";};
# You might also want to end with a form feed: print "\f";
如果我们这样做,我们将拥有一个可以打印常规 Unix 文本文件并获得有意义结果的假脱机。(是的,有四百万种更好的方法来编写此过滤器,但很少有如此具有说明性的。鼓励您更有效地执行此操作。)

唯一剩下的问题是,打印纯文本真的不太好 - 肯定最好能够打印 PostScript 和其他格式化或图形类型的输出。嗯,是的,这将是,而且很容易做到。该方法只是上述换行符修复过滤器的扩展。

这样的过滤器称为魔术过滤器。除非您打印奇怪的东西,否则不要费心自己编写一个 - 已经有很多为您编写好的,并且大多数都具有易于使用的交互式配置工具。您应该只选择一个合适的预先编写的过滤器

foomatic-rip

foomatic-rip 是一个旨在利用 LinuxPrinting.org 打印机数据库中的数据的过滤器。它基本上支持所有自由软件打印机驱动程序,包括常规 Ghostscript 驱动程序、Uniprint 驱动程序以及在外面流传的各种过滤器程序。foomatic-rip 适用于 CUPS、LPRng、LPD、GNUlpr、PPR、PDQ、无假脱机程序。

APS Filter

apsfilter 是一个旨在用于各种 Unix 系统的过滤器。它基本上支持所有 Ghostscript 驱动程序。它也适用于各种 LPD,包括库存 BSD 和 LPRng。

RHS-Printfilters

RHS-Printfilters 是 Red Hat 构建的过滤器系统。我认为它从 Red Hat Linux 的版本 4 开始发货,作为易于使用的 printtool GUI 打印机配置工具的后端。

rhs 过滤器系统建立在随附的 ASCII 数据库列表之上。此列表支持许多 Ghostscript 和 Uniprint 驱动程序,但不包括过滤器式驱动程序。构建的过滤器在打印时也不支持太多用户可控制的选项。

printtool 将名为postscript.cfg的配置文件放置在假脱机目录中。在这个 Bourne shell 风格的文件中,每个设置都是一个变量。在不寻常的情况下,您可以直接对 printtool 不允许的配置文件进行有用的更改;通常这将是不寻常的 Ghostscript 驱动程序的规范,或者是 VA rhs-printfilters 版本的 PPD 文件名。

VA Linux 在 HP 的合同下对 rhs-printfilters 系统进行了一些增强。使用正确的版本,可以在 Adobe PPD 文件的控制下为 Postscript 打印机选择选项。我在第 8.2.2 节中介绍了这个系统。

这种过滤器有一个陷阱:旧版本的 lpd 不会为远程打印机运行 if 过滤器,而大多数较新的版本会运行(尽管通常没有参数)。现代 GNU/Linux 和 FreeBSD 发行版附带的 LPD 版本会运行;大多数仍然附带 LPD 的商业 Unix 版本都有一个不运行的版本。有关此方面的更多信息,请参阅本文档后面关于网络打印的部分。如果您只有本地连接的打印机,那么这不会影响您。

8.2.2. LPD 用于 PostScript 打印机

虽然大多数版本的 LPD 不能很好地处理 PostScript(更不用说用户选项了),但 VA Linux 修改了 LPD 和 Red Hat 的过滤软件以相当好地支持 PostScript 打印机。由于目的是将代码捐赠给 gnu 项目,因此他们将其称为 GNUlpr

8.2.2.1. 工作原理

VA 的系统使用 Postscript 打印机定义,或 PPD 文件。PPD 文件由打印机制造商提供,并声明打印机上的可用选项,以及激活它们所需的 Postscript 代码。使用 VA 系统,正常的 LPD 方案的工作方式略有不同

  1. 用户可以使用-o标志指定选项。例如,您可能会指定-o MediaType:Transparency如果您即将打印在投影胶片上。或者,可以使用前端 GPR 在对话框中指定选项;您可以在 第 3.4.3 节中看到 GPR 的屏幕截图。

  2. LPR 将选项作为扩展属性传递给 LPD 控制文件。

  3. 修改后的 rhs-printfilters 软件包在环境变量中获得了扩展选项数据,并使用 ppdfilt 将这些选项添加到打印数据中。

8.2.2.2. 获取和安装

您可以从该项目的 SourceForge 上的网站获取 RPM 软件包或源代码 tarball。有关安装详细信息,请查阅该项目的 安装微型 HOWTO。本质上,您需要完全卸载 Red Hat 版本的 printtool、lpd 和 rhs-printfilters,然后安装 VA 版本,以及 ppdfilt、gpr 和其他一些实用程序。

您还需要 Postscript 打印机的 PPD 文件。PPD 文件通常很容易找到。VA Linux 和 HP 为许多 Laserjet 型号分发 PPD 文件。其他供应商为其自己的打印机提供 PPD,Adobe 为许多打印机分发 PPD 文件

目前,其中大部分安装起来有点困难。但是,未来的安装工具将建立在打印机配置库 libprinterconf 之上,该库支持网络打印机和本地打印机的自动检测和 rhs-printfilter 配置。

Note

可以单独使用 GPR,而无需修改后的 LPD 甚至 rhs-printfilters。GPR 可以编译所有直接处理 Postscript 作业所需的逻辑。对于那些从不需要直接使用 lpr 打印的人来说,这可能是一个更易于安装的选项。

8.2.2.3. 控制 Postscript 选项

一旦您设置了 VA 的支持 Postscript 的 LPD 系统 (GNUlpr),您可以通过两种方式控制打印机的选项

使用 GUI

要使用 GPR,您首先要确保已指定正确的 PPD 文件。然后,打印机的选项将在“高级”面板上可用。基本的 ppdfilt 选项将在“通用”面板上可用。

使用命令行

lpr 支持-o选项。您可以使用-o从打印机的 PPD 文件中指定任何选项/值对。例如,考虑以下 PPD 文件选项子句
*OpenUI *PrintQuality/Print Quality: PickOne
*DefaultPrintQuality: None
*OrderDependency: 150 AnySetup *PrintQuality
*PrintQuality None/Printer Setting: ""
*PrintQuality Quick/QuickPrint:  "<< /DeviceRenderingInfo ...
*PrintQuality Normal/Normal: "<< /DeviceRenderingInfo << /...
*PrintQuality Pres/Presentation: "<< /DeviceRenderingInfo ...
*PrintQuality Image/1200 Image Quality: "<< /DeviceRenderi...
*CloseUI: *PrintQuality
对于选项PrintQuality,可能的值为Quick, Normal,Pres,或Image。您可以给出类似这样的命令
% lpr -o PrintQuality:Image file.ps

除了 PPD 中的选项外,还有许多适用于所有打印机的通用选项。这些包括

page-ranges

您可以指定要打印的页码范围。例如,page-ranges:2-3.

page-set

您可以仅打印奇数页或偶数页。例如,page-set:odd.

number-up

您可以在每张纸上打印多页。例如,number-up:2.

其他选项在 ppdfilt 手册页中详细介绍。

8.2.3. 文件权限

应大众要求,我在下面列出了我的系统上有趣文件的权限列表。有很多更好的方法可以做到这一点,理想情况下只使用 SGID 二进制文件,而不是使所有内容都成为 SUID root,但这是我的系统出厂时的状态,它对我很有效。(坦率地说,如果您的供应商甚至无法提供可用的 lpd,那么您将面临艰难的旅程)。
-r-sr-sr-x   1 root     lp    /usr/bin/lpr*
-r-sr-sr-x   1 root     lp    /usr/bin/lprm*
-rwxr--r--   1 root     root  /usr/sbin/lpd*
-r-xr-sr-x   1 root     lp    /usr/sbin/lpc*
drwxrwxr-x   4 root     lp    /var/spool/lpd/
drwxr-xr-x   2 root     lp    /var/spool/lpd/lp/

Lpd 目前必须以 root 身份运行,以便它可以绑定到低编号的 lp 服务端口。它可能应该在绑定后变成 UID lp.lp 或其他东西,但我认为它没有。这只是避免使用库存 BSD LPD 的又一个原因。

8.3. 大型安装

大型安装,我的意思是包括两台以上打印机或主机的网络,有特殊的需求。以下是一些提示。

CUPS 有一些不错的功能,使其成为大型网络的良好选择。打印机类、访问控制和自动客户端配置只是其中几个。

如果您使用 LPD,对于真正大型的环境,仅仅分发 printcap/过滤器信息就变成了一个难题;思科企业打印系统解决了这个问题,并且可能是一个好的起点或几乎完整的解决方案,具体取决于您的需求。中型到大型环境可以通过本机 LPRng 功能得到很好的支持。

8.4. 记帐

常规 LPD 提供的记帐帮助非常少。您可以在afprintcap 属性中指定记帐文件的名称,但这只是作为参数传递给您的if过滤器。这取决于您让您的if过滤器将条目写入记帐文件,并取决于您稍后处理记帐文件(传统格式主要用于行式打印机,并且在 Perl 中很难解析,因此没有理由保留它)。此外,如果您使用 foomatic-rip 程序作为过滤器,您需要进行更改,因为它依赖于将配置文件作为“记帐”文件名给出。

CUPS 通过 pstops 过滤器传递作业来提供页面记帐。此过滤器需要 Postscript 输入。如果您使用打印“原始”作业,则始终计为 1 页。这意味着如果您从带有本机打印机驱动程序的 Windows 客户端打印,则记帐将不起作用。

Ghostscript 提供了一个 PageCount 运算符,您可以使用它来计算每个作业中的页数;基本上,您只需在作业末尾添加几行 postscript 代码,以写入记帐文件条目;有关此方面的最佳示例,请参见文件unix-lpr.sh在 Ghostscript 源代码发行版中。

请注意,unix-lpr 记帐的实现从 Ghostscript 解释器写入文件,因此与推荐的 -dSAFER 选项不兼容。更好的解决方案可能是在每个作业后使用 PJL 命令查询打印机,或者编写一个 postscript 代码片段,该代码片段将页数打印到 stdout,可以在不写入文件的情况下捕获它。

LPRng 打印假脱机程序包含 HP 特定的记帐示例实现;我假设它使用 PJL 查询打印机。此技术应适用于大多数具有双向通信的 PJL、Postscript 或 SNMP 打印机。

如果您有支持 SNMP 的网络打印机,则可以使用 npadmin 程序在每个作业后查询页数。这应该适用于所有打印作业。有关 npadmin 的更多信息,请参阅 第 11.10.1 节