LP 打印服务在必须打印一种打印机无法解释的类型的文件时,都会使用过滤器。创建新的打印过滤器很困难,而且通常需要进行大量的试验。
定义新打印过滤器的过程包括以下两步:
编写打印过滤器程序
创建打印过滤器定义
根据需要,打印过滤器可以是简单的或复杂的。过滤器包含输入类型、输出类型以及提供用于在过滤器内处理命令行参数的语言的复杂选项。
如果具有非 PostScript 打印机,则必须根据需要创建和添加打印过滤器。首先,需要了解打印过滤器的内容,以及过滤器程序必须满足的要求。
LP 打印服务在 /usr/lib/lp/postscript 目录中提供过滤器程序。这些过滤器涵盖了大多数 PostScript 打印情况(目标打印机要求数据为 PostScript 格式)。打印过滤器程序必须是二进制可执行文件。
有以下两种类型的打印过滤器: 快速过滤器和慢速过滤器。
快速过滤器不需要大量的处理时间来准备要打印的文件。它们在运行时必须可以访问打印机。为了能够检测到打印机故障,打印过滤器必须是快速过滤器。将 PRINTER 关键字用作过滤器选项的任何过滤器都必须作为快速过滤器进行安装。
慢速过滤器需要大量的处理时间来准备要打印的文件。它们在运行时不需要访问打印机。慢速过滤器在后台运行,因此它们不会停止打印机,从而允许打印不需要慢速过滤的其他文件。
LP 打印服务使用打印过滤器将文件从一种内容类型转换为另一种内容类型。可以为每个打印机指定接受的文件内容类型。用户在提交打印请求时指定文件内容类型。然后,LP 打印服务查找可以打印该内容类型文件的打印机。因为许多应用程序可以生成用于各种打印机的文件,所以此方法通常已经可以满足需要。但是,一些应用程序可能会生成无法在任何可用打印机上打印的文件。
LP 打印服务每次收到打印机无法直接接受其格式的文件类型的打印请求时,都会尝试将打印请求的内容类型与可用的(或指定的)打印机的内容类型进行匹配。如果存在匹配项,则可以直接将文件发送到打印机,而不进行过滤。如果找不到匹配项,或者内容类型指定需要使用过滤器,则 LP 打印服务尝试将文件的内容类型与可用过滤器的输入内容类型进行匹配。此外,LP 打印服务尝试将过滤器的输出类型与打印机的内容类型进行匹配。当找到合适的过滤器时,将通过过滤器传递打印请求。
打印过滤器处理特殊打印模式并请求打印特定页。打印要求自定义过滤器的打印请求的任何特征时,需要特殊的打印模式。
过滤器处理以下特征:
打印机类型
字符间距
行间距
页长
页宽
要打印的页数
字符集
表单名称
份数
LP 打印服务提供这些特征的缺省设置。但是,打印过滤器可以更有效地处理某些特征。例如,一些打印机可以比 LP 打印服务更有效地处理多个副本。因此,在这种情况下,可以为多副本页面控制提供过滤器。
每个打印机都有自己的方法来检测打印机故障和将故障信号传输到 LP 打印服务。LP 打印服务仅检查在打印时是否存在挂起(载体丢失)和过长的延迟。
一些打印机可以检测很多故障,并可以发送描述故障原因的消息。其他打印机通过使用除载体丢失信号或关闭数据流信号之外的信号来指示故障。解释此附加的打印机故障信息需要过滤器。
过滤器还可以挂起打印请求,等待清除打印机故障,然后恢复打印。借助此功能,不需要全部重新打印已中断的打印请求。只有知道打印机所用控制序列的过滤器才能确定文件中的分页位置。因此,只有这样的过滤器才可以在清除故障之后找到文件中应开始打印的位置。
当打印过滤器生成消息时,那些消息由 LP 打印服务处理。如果启用了警报,则 LP 打印服务将警报发送给系统管理员。有关详细信息,请参见使用 LP 打印命令设置打印机故障警报。
无论打印过滤器简单或复杂,都必须满足以下要求:
过滤器应从其标准输入获取文件内容,并将转换后的文件发送到标准输出。
如果程序引用外部文件,则不能将它用作过滤器。可能很想将诸如 troff、nroff 之类的程序或类似的字处理程序用作过滤器。LP 打印服务无法从过滤器程序识别对其他文件的引用(称为包含文件)。由于 troff 和 nroff 程序允许包含文件,因此它们在用作过滤器时可能会失败。如果程序需要其他文件才能完成其处理,则不应将该程序用作过滤器。
过滤器不应依赖于用户通常无法访问的文件。如果过滤器在由用户直接运行时失败,则它在由 LP 打印服务运行时也将失败。
慢速过滤器可以将有关文件中错误的消息发送到标准错误。快速过滤器则不会发送。收集慢速过滤器中的错误消息,并将其发送给提交打印请求的用户。
如果慢速过滤器由于收到信号而停止,则停止打印请求,并通知提交请求的用户。同样,如果慢速过滤器以非零退出代码退出,则停止打印请求并通知用户。快速过滤器的退出代码的处理方式不同。
如果希望过滤器检测打印机故障,则还应该满足以下要求:
如果可能,过滤器应先等待清除故障再退出。清除故障后,过滤器还应在打印停止时所在页的顶部继续打印。如果不希望使用延续功能,则 LP 打印服务将在向管理员报警之前停止过滤器。
识别出故障后,过滤器立即应将打印机故障消息发送到其标准错误。过滤器不必退出,但是可以等待清除故障。
过滤器不该将有关文件中错误的消息发送到标准错误。这些消息应包括在用户可从中进行读取的标准输出中。
如果文件已完成打印(即使文件中的错误阻止它正确打印),则过滤器应以零退出代码退出。
仅当打印机故障阻止了过滤器完成打印请求时,过滤器才应以非零退出代码退出。
在添加到过滤器表时,必须将过滤器作为快速过滤器添加。
打印过滤器定义通知 LP 打印服务有关过滤器、要运行的打印过滤器程序、打印过滤器执行的转换种类等的信息。在 /etc/lp/fd 目录中提供了一组过滤器描述符文件。这些文件描述过滤器的特征(例如,快速过滤器或慢速过滤器),并指向过滤器程序(例如 /usr/lib/lp/postscript/postdaisy)。
定义新的打印过滤器时,必须创建打印过滤器定义。
打印过滤器定义包含 LP 打印服务所用的以下信息:
要运行的过滤器程序的名称
过滤器程序接受的输入类型
过滤器程序生成的输出类型
过滤器程序可以向其发送作业的打印机类型
过滤器程序可以向其发送作业的特定打印机的名称
过滤器类型(快速或慢速)
选项
可以将特征作为直接输入键入 lpfilter 命令中。还可以创建一个指定过滤器特征的文件,并将该文件的名称作为 lpfilter 命令参数的输入。这样的文件称为过滤器描述符文件,应位于 /etc/lp/fd 目录中。这些文件本身不是过滤器。但它们指向过滤器。
不管是在文件中存储信息,还是直接在命令行上键入信息,请使用以下格式:
Command: command-pathname [options] Input types: input-type-list Output types: output-type-list Printer types: printer-type-list Printers: printer-list Filter type: fast or slow Options: template-list |
如果为除 Options 之外的任何过滤器特征提供多个定义(即多行),则打印服务仅使用第二个定义。
信息可以按任何顺序进行排列,并不是所有信息都是必需的。如果不指定值,则缺省情况下赋予下表所示的值。这些值不是非常有用,这就是应指定值的原因。
表 10–1 lpfilter 命令的缺省值
项 |
缺省值 |
---|---|
Input types(输入类型) |
any |
Output type(输出类型) |
any |
Printer types(打印机类型) |
any |
Printers(打印机) |
any |
Filter type(过滤器类型) |
slow |
使用过滤器程序的全路径。如果存在程序始终需要的任何固定选项,则此处包括所有选项。
输入类型是打印过滤器可以处理的文件内容类型的列表。LP 打印服务确实限制输入类型的数目,但是大多数过滤器只能接受一种输入类型。有几种文件类型非常类似,因此过滤器可以处理它们。可以使用喜欢的任何名称,但名称最多只能包含 14 个字母数字字符和短划线。不要将下划线用作输入类型名称的一部分。
LP 打印服务使用这些名称将过滤器与文件类型进行匹配,因此请遵循一致的命名约定。例如,如果多个过滤器可以接受相同的输入类型,则在为每个过滤器指定该输入类型时,请使用相同名称。将这些名称通知用户,以便他们在提交文件进行打印时知道如何标识文件类型。
输出类型是过滤器可以作为输出生成的文件类型的列表。对于每种输入类型,过滤器将生成一种输出类型。但是,输出类型可能随作业的不同而不同。输出类型的名称不能超过 14 个字母数字字符和短划线。
输出类型的名称应与可用(本地或远程)打印机的类型匹配,或者与其他过滤器处理的输入类型匹配。如果 LP 打印服务发现转换文件需要用不同的过滤器过滤若干遍,则它会将这些过滤器组合在一个 shell 流水线中。您可能不需要此复杂级别,但 LP 打印服务具有此复杂处理功能。请尝试找出这样一组过滤器:它们将用户可能希望打印的所有不同文件作为输入类型,并将那些文件直接转换为打印机可以处理的文件类型。
打印机类型是打印过滤器可以将文件转换成的打印机类型的列表。对于大多数打印机和过滤器,可以将过滤器定义的此部分留空,因为此列表与输出类型的列表完全相同。但是,此列表可能是不同的。例如,为达到初始化目的,可能具有仅包含一种打印机类型的打印机。但是,该打印机可以识别几种不同的文件内容类型。在本质上,此打印机具有将各种文件类型转换为它可以处理的过滤器类型的内部过滤器。因此,过滤器可能生成与打印机可以处理的文件类型匹配的几种输出类型之一。应将打印过滤器标记为使用该打印机类型。
作为另一个示例,您可能具有列为接受相同文件类型的两种不同型号的打印机。但是,由于产品制造中的细微差异,一个打印机会偏离它所产生的结果。将打印机标记为不同的打印机类型,比如说 A 和 B,其中 B 是偏离的打印机。创建一个调整文件的过滤器,以说明 B 类型打印机产生的偏差。由于 B 打印机类型才需要此过滤器,因此将此过滤器列为仅在 B 类型打印机上起作用。
打印过滤器通常可以处理接受其输出的所有打印机,因此通常可以跳过过滤器定义的此部分。
但是,可能具有一些不适合于过滤器生成的输出的打印机。例如,可能希望将一台打印机专用于快速周转,仅将不需要过滤的文件发送到该打印机。对于需要先进行广泛过滤才能打印的文件,可以使用类型相同的其他打印机。
LP 打印服务可识别快速过滤器和慢速过滤器,如过滤器的类型中所述。
打印模式通过使用 lp -y 命令调用的慢速过滤器必须运行在从其发出打印请求的系统上。LP 打印服务无法将模式值传递到打印服务器。但是,它可以将文件内容类型(在 lp 命令的 -T 选项之后指定)与打印服务器上的内容类型进行匹配。因此,如果要在打印服务器上激活特殊模式,则必须指定允许 LP 打印服务将输入类型和输出类型进行匹配的内容类型。
选项指定如何将不同类型的信息转换为过滤器命令的命令行参数。此信息可以包括来自用户的规范(通过打印请求)、打印机定义和用于处理请求的任何过滤器实现的规范。
定义打印过滤器选项的信息源有 13 个,其中每个信息源都由一个关键字表示。每个选项都是在模板中定义的。模板是过滤器定义中的一条语句,定义要基于过滤器特征之一的值传递到过滤器命令的选项。
在过滤器定义中指定的选项可以不包括任何关键字、包括全部 13 个关键字或 13 个关键字的任何子集。此外,如果完整的过滤器定义需要多个定义,则可以多次定义单个关键字。下表包含可用于在打印过滤器定义中定义选项的 13 个关键字的描述。
表 10–2 打印过滤器选项的关键字
关键字 |
模式 |
示例 |
|
---|---|---|---|
内容类型(输入) |
INPUT |
content-type |
troff |
内容类型(输出) |
OUTPUT |
content-type |
postscript, impress |
打印机类型 |
TERM |
printer-type |
att495 |
打印机名称 |
PRINTER |
printer-name |
lp1 |
字符间距 |
CPI |
scaled-decimal |
10 |
行间距 |
LPI |
scaled-decimal |
6 |
页长 |
LENGTH |
scaled-decimal |
66 |
页宽 |
WIDTH |
scaled-decimal |
80 |
要打印的页数 |
PAGES |
page-list |
1-5,13-20 |
字符集 |
CHARSET |
character-set |
finnish |
表单名称 |
FORM |
form-name |
invoice2 |
份数 |
COPIES |
integer |
3 |
MODES |
mode |
landscape |
打印过滤器定义可以包括多个模板。多个模板可在同一行上输入,由逗号分隔;也可在不同的行上输入,在前面加 Options: 前缀。
模板的格式如下: keyword pattern = replacement
keyword 标识为过滤器的特定特征注册的选项类型。
pattern 是关键字的特定选项。
replacement 是关键字具有指定值时发生的情况。
作为如何为特定过滤器定义选项的示例,假定希望打印服务调度程序按照以下条件将打印请求指定给过滤器:
如果要由过滤器生成的 OUTPUT 类型为 impress,则将 -I 选项传递到过滤器。
如果要由过滤器生成的 OUTPUT 类型为 postscript,则将 -P 选项传递到过滤器。
要指定这些条件,请将以下模板作为 lpfilter 命令的选项提供:
Options: OUTPUT impress=-I, OUTPUT postscript=-P |
如果 Options 行变得太长,则将每个模板放置在单独的行上,如下所示:
Options: OUTPUT impress=-I Options: OUTPUT postscript=-P |
在这两个模板中,keyword 被定义为 OUTPUT。在第一个模板中,模式为 impress,replacement 的值为 --I。在第二个模板中,pattern 的值为 postscript,replacement 的值为 -P。
要确定为每种类型的模板(即,对于每个关键字的 pattern 和 replacement 参数)提供哪些值,请考虑以下事项:
INPUT 模板的值来自需要由过滤器转换的文件内容类型。
OUTPUT 模板的值来自必须由过滤器生成的输出类型。
TERM 模板的值是打印机类型。
PRINTER 模板的值是将打印最终输出的打印机的名称。
CPI、LPI、LENGTH 和 WIDTH 模板的值来自用户的打印请求、所用表单或打印机缺省值。
PAGES 模板的值是应打印的页的列表。通常,该值由用逗号分隔的页范围的列表组成。每个页范围由用短划线分隔的数字对或单个数字组成。(例如,1–5,6,8,10 指示第 1 页到第 5 页,以及第 6 页、第 8 页和第 10 页。)但是,在 -P 选项中为打印请求提供的任何值在传递后都保持不变。
CHARSET 模板的值是要使用的字符集的名称。
FORM 模板的值是由 lp -f 命令(用于提交打印请求的命令)请求的表单的名称。
COPIES 模板的值是要打印的文件的份数。如果过滤器使用此模板,则 LP 打印服务将它打印的已过滤文件份数减少到一份。此“单个副本”包括由过滤器生成的多个副本。
MODES 模板的值来自 lp -y 命令。由于用户可以指定几个 -y 选项,因此 MODES 模板可能具有几个值。这些值按用户指定的从左到右的顺序进行应用。
replacement 选项显示应如何将模板的值提供给过滤器程序。此部分通常为文字选项,有时包含占位符星号 (*) 以显示将值传递到的位置。pattern 和 replacement 选项还可以使用 ed 命令的正则表达式语法,进行从用户输入选项到过滤器选项的更复杂转换。支持 ed 的所有正则表达式语法,其中包括 \( ... \) 和 \n 结构。这些结构可用于提取 pattern 选项的部分,以复制到 replacement 选项,而 & 选项可用于将整个 pattern 选项复制到 replacement 选项。有关更多信息,请参见 ed(1) 手册页。
如果在 pattern 或 replacement 选项中包括了逗号或等号 (=),则在该字符前面添加反斜杠 (\)。在使用 pattern 或 replacement 选项时,将删除其中任何字符前面的反斜杠。
在打印服务器上,成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
创建打印过滤器程序。
有关打印过滤器程序的信息,请参见编写打印过滤器程序。按照惯例,PostScript 打印机的过滤器程序位于 /usr/lib/lp/postscript 目录中。应将您创建的程序放置在所选目录中的 /usr/lib/lp 目录下。
创建打印过滤器定义。
有关打印过滤器定义的信息,请参见创建打印过滤器定义。应将打印过滤器定义保存在文本文件中。按照惯例,过滤器定义位于 /etc/lp/fd 目录中,并使用 .fd 后缀进行标识。
将打印过滤器添加到打印服务器。
有关说明,请参见如何添加打印过滤器。
此示例说明用于将 N37 或 Nlp 转换为 simple 的打印过滤器定义。
Input types: N37, Nlp, simple Output types: simple Command: /usr/bin/col Options: MODES expand = -x Options: INPUT simple = -p -f |
在此示例中,打印过滤器程序被命名为 col。在将新的打印过滤器添加到打印服务器后,将对用户的打印请求进行如下处理:
当用户键入以下命令时:
$ lp -y expand report.doc |
使用以下参数运行打印过滤器程序以转换文件:
/usr/bin/col -x -p -f |
当用户键入以下命令时:
$ lp -T N37 -y expand report.doc |
使用以下参数运行打印过滤器程序以转换文件:
/usr/bin/col -x |
此示例说明用于从 troff 转换为 PostScript 文件的打印过滤器定义。
Input types: troff Output types: postscript Printer types: PS Filter type: slow Command: /usr/lib/lp/postscript/dpost Options: LENGTH * = -l* Options: MODES port = -pp, MODES land = -pl Options: MODES group \=\([1-9]\) = -n\l |
在此示例中,过滤器程序被命名为 dpost。过滤器程序采用一种输入类型 troff,生成 postscript 输出,并适用于 PS (PostScript) 类型的任何打印机。用户在要求页面方向为纵向模式或横向模式时,只需要提供缩写 port 或 land。由于这些选项不是 LP 打印服务所固有的,因此用户必须通过使用 lp -y 命令指定它们。
在将新的打印过滤器添加到打印服务器后,将对打印请求进行如下处理:
如果用户键入以下命令提交 troff 文件类型,以便在类型为 PS 的 PostScript 打印机上打印(要求横向且页长为 60 行):
$ lp -T troff -o length=60 -y land -d luna ch1.doc |
使用以下参数运行打印过滤器程序 dpost 以转换文件:
/usr/lib/lp/postscript/dpost -l60 -pl |
如果用户输入以下命令:
$ lp -T troff -y group=4 -d luna ch1.doc |
使用以下参数运行打印过滤器程序 dpost 以转换文件:
/usr/lib/lp/postscript/dpost -n4 |