对于常见的配置,您可能完全可以忽略本节内容 - 相反,您应该直接跳转到下面的第 9 节,或者更好的是,您供应商的文档。大多数 GNU/Linux 发行版提供了一个或多个“傻瓜式”工具,可以为您完成此处描述的所有常见打印机操作。
如果您的供应商工具对您不起作用,或者您希望在打印时能够交互式地控制打印选项,那么您应该使用其他系统。APS Filter 是另一个不错的系统;它可以在几乎任何类型的 Unix 系统上非常轻松地配置 LPD 队列和过滤器。
您还可以使用来自 linuxprinting.org 网站的打印系统接口,将许多免费驱动程序连接到多个假脱机系统。一旦该项目完成,这些接口将提供最佳的功能:支持所有风格的自由软件驱动程序,用户可设置选项可用,并且支持大多数常见的假脱机系统。目前,foomatic 打印系统已在大多数现代发行版中使用。但是,您的发行版可能包含略微过时的 foomatic 版本。
如果您正在使用带有 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 打印机所需的一切知识。
直到最近,大多数 GNU/Linux 发行版都附带了 LPD。本节描述了 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: |
现在去阅读手册页printcap.
上面看起来很简单,但有一个陷阱 - 除非我发送 DeskJet 500 可以理解的文件,否则这台 DeskJet 会打印出奇怪的东西。例如,将普通的 Unix 文本文件发送到 deskjet 会导致字面解释的换行符,并让我得到
This is line one. This is line two. This is line three. |
显然需要更多,这就是过滤的目的。你们当中更细心的人阅读了 printcap 手册页可能会注意到假脱机属性if和of。好吧,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"; |
唯一剩下的问题是,打印纯文本真的不太好 - 肯定最好能够打印 PostScript 和其他格式化或图形类型的输出。嗯,是的,这将是,而且很容易做到。该方法只是上述换行符修复过滤器的扩展。
这样的过滤器称为魔术过滤器。除非您打印奇怪的东西,否则不要费心自己编写一个 - 已经有很多为您编写好的,并且大多数都具有易于使用的交互式配置工具。您应该只选择一个合适的预先编写的过滤器
foomatic-rip 是一个旨在利用 LinuxPrinting.org 打印机数据库中的数据的过滤器。它基本上支持所有自由软件打印机驱动程序,包括常规 Ghostscript 驱动程序、Uniprint 驱动程序以及在外面流传的各种过滤器程序。foomatic-rip 适用于 CUPS、LPRng、LPD、GNUlpr、PPR、PDQ、无假脱机程序。
apsfilter 是一个旨在用于各种 Unix 系统的过滤器。它基本上支持所有 Ghostscript 驱动程序。它也适用于各种 LPD,包括库存 BSD 和 LPRng。
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 版本都有一个不运行的版本。有关此方面的更多信息,请参阅本文档后面关于网络打印的部分。如果您只有本地连接的打印机,那么这不会影响您。
虽然大多数版本的 LPD 不能很好地处理 PostScript(更不用说用户选项了),但 VA Linux 修改了 LPD 和 Red Hat 的过滤软件以相当好地支持 PostScript 打印机。由于目的是将代码捐赠给 gnu 项目,因此他们将其称为 GNUlpr。
VA 的系统使用 Postscript 打印机定义,或 PPD 文件。PPD 文件由打印机制造商提供,并声明打印机上的可用选项,以及激活它们所需的 Postscript 代码。使用 VA 系统,正常的 LPD 方案的工作方式略有不同
您可以从该项目的 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 配置。
![]() | 可以单独使用 GPR,而无需修改后的 LPD 甚至 rhs-printfilters。GPR 可以编译所有直接处理 Postscript 作业所需的逻辑。对于那些从不需要直接使用 lpr 打印的人来说,这可能是一个更易于安装的选项。 |
一旦您设置了 VA 的支持 Postscript 的 LPD 系统 (GNUlpr),您可以通过两种方式控制打印机的选项
要使用 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 |
% lpr -o PrintQuality:Image file.ps |
除了 PPD 中的选项外,还有许多适用于所有打印机的通用选项。这些包括
您可以指定要打印的页码范围。例如,page-ranges:2-3.
您可以仅打印奇数页或偶数页。例如,page-set:odd.
您可以在每张纸上打印多页。例如,number-up:2.
应大众要求,我在下面列出了我的系统上有趣文件的权限列表。有很多更好的方法可以做到这一点,理想情况下只使用 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 的又一个原因。
大型安装,我的意思是包括两台以上打印机或主机的网络,有特殊的需求。以下是一些提示。
CUPS 有一些不错的功能,使其成为大型网络的良好选择。打印机类、访问控制和自动客户端配置只是其中几个。
如果您使用 LPD,对于真正大型的环境,仅仅分发 printcap/过滤器信息就变成了一个难题;思科企业打印系统解决了这个问题,并且可能是一个好的起点或几乎完整的解决方案,具体取决于您的需求。中型到大型环境可以通过本机 LPRng 功能得到很好的支持。
每台打印机都应该有一个控制点,管理员可以在其中暂停、重新排序或重定向队列。为了实现这一点,让每个人都打印到本地服务器,然后本地服务器将对作业进行排队并将它们定向到正确的打印机。对于大型校园或分布式网络,每个建筑物或其他合适的网络子集都应该有一个服务器。
至少在服务器上使用 CUPS 或 LPRng;BSD LPD 的错误太多,不适合“真正”使用。但不要只听我的 - 您应该测试多个假脱机程序,看看哪个最适合您。
客户端系统不应具有唯一的打印配置。CUPS 提供同一子网上打印机的自动客户端配置。您甚至可以配置 CUPS (BrowsePoll) 以轮询其他子网上的服务器以查找可用的打印机。这些功能限制了需要在客户端进行的配置量。要使用 LPRng 实现统一的打印配置,请使用 LPRng 的扩展 printcap 语法,以便您可以使用一个 printcap 用于所有地方。CEPS 通过构建在轻量级分布式数据库之上而不是传统的 printcap 文件来提供此功能。
打印队列不应以制造商或型号命名;以有意义的名称命名打印队列,例如位置 (floor2_nw) 或功能 (color_transparency)。三年后,当打印机坏了时,您将能够更换为不同的制造商或型号,而不会引起混乱。
运营一个网页,其中显示每台打印机的详细信息,包括位置、功能等。考虑使其显示队列并包含一个从队列中删除作业的按钮。对于没有适当文档的用户来说,复杂的网络环境是难以管理的。
在 Windows 和 Apple 系统上,在所有地方使用特定于平台的驱动程序(Samba 支持 Windows 自动驱动程序下载机制),或者,更好的是,在所有地方使用通用的 Postscript 驱动程序。不要混用和匹配;当安装的打印机驱动程序更改时,原始的文字处理器通常会产生不同的输出;用户无法处理根据特定的客户端/打印机对而变化的输出。
如果可能,购买大容量打印机用于大容量打印。如果在预算有限的情况下,请使用 LPRng 的多台打印机/一个队列设施或 CUPS 打印机类并分配一个管理员;打印机是复杂的机械设备,在这种配置中经常会卡纸并耗尽纸张。
不要觉得打印机必须插入工作站;以太网“打印服务器”现在的成本低于 100 美元。在您可以联网的任何地方定位打印机的能力比强制位于主机附近是一个很大的改进;将打印机放置在合理、中心的位置。
使用任何 SNMP trap 或其他可用的监控/警报工具 - 应该有人负责四处奔走并修复没有墨水或纸张的打印机。Npadmin(请参阅 第 11.10.1 节)可用于使用 SNMP 打印机执行一些管理操作。
常规 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 节。