系统管理指南:打印

创建新的打印过滤器

LP 打印服务在必须打印一种打印机无法解释的类型的文件时,都会使用过滤器。创建新的打印过滤器很困难,而且通常需要进行大量的试验。

定义新打印过滤器的过程包括以下两步:

根据需要,打印过滤器可以是简单的或复杂的。过滤器包含输入类型、输出类型以及提供用于在过滤器内处理命令行参数的语言的复杂选项。

如果具有非 PostScript 打印机,则必须根据需要创建和添加打印过滤器。首先,需要了解打印过滤器的内容,以及过滤器程序必须满足的要求。

编写打印过滤器程序

LP 打印服务在 /usr/lib/lp/postscript 目录中提供过滤器程序。这些过滤器涵盖了大多数 PostScript 打印情况(目标打印机要求数据为 PostScript 格式)。打印过滤器程序必须是二进制可执行文件。

过滤器的类型

有以下两种类型的打印过滤器: 快速过滤器和慢速过滤器。

快速过滤器不需要大量的处理时间来准备要打印的文件。它们在运行时必须可以访问打印机。为了能够检测到打印机故障,打印过滤器必须是快速过滤器。将 PRINTER 关键字用作过滤器选项的任何过滤器都必须作为快速过滤器进行安装。

慢速过滤器需要大量的处理时间来准备要打印的文件。它们在运行时不需要访问打印机。慢速过滤器在后台运行,因此它们不会停止打印机,从而允许打印不需要慢速过滤的其他文件。

转换文件

LP 打印服务使用打印过滤器将文件从一种内容类型转换为另一种内容类型。可以为每个打印机指定接受的文件内容类型。用户在提交打印请求时指定文件内容类型。然后,LP 打印服务查找可以打印该内容类型文件的打印机。因为许多应用程序可以生成用于各种打印机的文件,所以此方法通常已经可以满足需要。但是,一些应用程序可能会生成无法在任何可用打印机上打印的文件。

LP 打印服务每次收到打印机无法直接接受其格式的文件类型的打印请求时,都会尝试将打印请求的内容类型与可用的(或指定的)打印机的内容类型进行匹配。如果存在匹配项,则可以直接将文件发送到打印机,而不进行过滤。如果找不到匹配项,或者内容类型指定需要使用过滤器,则 LP 打印服务尝试将文件的内容类型与可用过滤器的输入内容类型进行匹配。此外,LP 打印服务尝试将过滤器的输出类型与打印机的内容类型进行匹配。当找到合适的过滤器时,将通过过滤器传递打印请求。

处理特殊打印模式

打印过滤器处理特殊打印模式并请求打印特定页。打印要求自定义过滤器的打印请求的任何特征时,需要特殊的打印模式。

过滤器处理以下特征:

LP 打印服务提供这些特征的缺省设置。但是,打印过滤器可以更有效地处理某些特征。例如,一些打印机可以比 LP 打印服务更有效地处理多个副本。因此,在这种情况下,可以为多副本页面控制提供过滤器。

检测打印机故障

每个打印机都有自己的方法来检测打印机故障和将故障信号传输到 LP 打印服务。LP 打印服务仅检查在打印时是否存在挂起(载体丢失)和过长的延迟。

一些打印机可以检测很多故障,并可以发送描述故障原因的消息。其他打印机通过使用除载体丢失信号或关闭数据流信号之外的信号来指示故障。解释此附加的打印机故障信息需要过滤器。

过滤器还可以挂起打印请求,等待清除打印机故障,然后恢复打印。借助此功能,不需要全部重新打印已中断的打印请求。只有知道打印机所用控制序列的过滤器才能确定文件中的分页位置。因此,只有这样的过滤器才可以在清除故障之后找到文件中应开始打印的位置。

当打印过滤器生成消息时,那些消息由 LP 打印服务处理。如果启用了警报,则 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

lpfilter 命令

使用过滤器程序的全路径。如果存在程序始终需要的任何固定选项,则此处包括所有选项。

lpfilter 输入类型参数

输入类型是打印过滤器可以处理的文件内容类型的列表。LP 打印服务确实限制输入类型的数目,但是大多数过滤器只能接受一种输入类型。有几种文件类型非常类似,因此过滤器可以处理它们。可以使用喜欢的任何名称,但名称最多只能包含 14 个字母数字字符和短划线。不要将下划线用作输入类型名称的一部分。

LP 打印服务使用这些名称将过滤器与文件类型进行匹配,因此请遵循一致的命名约定。例如,如果多个过滤器可以接受相同的输入类型,则在为每个过滤器指定该输入类型时,请使用相同名称。将这些名称通知用户,以便他们在提交文件进行打印时知道如何标识文件类型。

lpfilter 输出类型参数

输出类型是过滤器可以作为输出生成的文件类型的列表。对于每种输入类型,过滤器将生成一种输出类型。但是,输出类型可能随作业的不同而不同。输出类型的名称不能超过 14 个字母数字字符和短划线。

输出类型的名称应与可用(本地或远程)打印机的类型匹配,或者与其他过滤器处理的输入类型匹配。如果 LP 打印服务发现转换文件需要用不同的过滤器过滤若干遍,则它会将这些过滤器组合在一个 shell 流水线中。您可能不需要此复杂级别,但 LP 打印服务具有此复杂处理功能。请尝试找出这样一组过滤器:它们将用户可能希望打印的所有不同文件作为输入类型,并将那些文件直接转换为打印机可以处理的文件类型。

lpfilter 打印机类型参数

打印机类型是打印过滤器可以将文件转换成的打印机类型的列表。对于大多数打印机和过滤器,可以将过滤器定义的此部分留空,因为此列表与输出类型的列表完全相同。但是,此列表可能是不同的。例如,为达到初始化目的,可能具有仅包含一种打印机类型的打印机。但是,该打印机可以识别几种不同的文件内容类型。在本质上,此打印机具有将各种文件类型转换为它可以处理的过滤器类型的内部过滤器。因此,过滤器可能生成与打印机可以处理的文件类型匹配的几种输出类型之一。应将打印过滤器标记为使用该打印机类型。

作为另一个示例,您可能具有列为接受相同文件类型的两种不同型号的打印机。但是,由于产品制造中的细微差异,一个打印机会偏离它所产生的结果。将打印机标记为不同的打印机类型,比如说 A 和 B,其中 B 是偏离的打印机。创建一个调整文件的过滤器,以说明 B 类型打印机产生的偏差。由于 B 打印机类型才需要此过滤器,因此将此过滤器列为仅在 B 类型打印机上起作用。

lpfilter 打印机参数

打印过滤器通常可以处理接受其输出的所有打印机,因此通常可以跳过过滤器定义的此部分。

但是,可能具有一些不适合于过滤器生成的输出的打印机。例如,可能希望将一台打印机专用于快速周转,仅将不需要过滤的文件发送到该打印机。对于需要先进行广泛过滤才能打印的文件,可以使用类型相同的其他打印机。

lpfilter 过滤器类型参数

LP 打印服务可识别快速过滤器和慢速过滤器,如过滤器的类型中所述。

打印模式通过使用 lp -y 命令调用的慢速过滤器必须运行在从其发出打印请求的系统上。LP 打印服务无法将模式值传递到打印服务器。但是,它可以将文件内容类型(在 lp 命令的 -T 选项之后指定)与打印服务器上的内容类型进行匹配。因此,如果要在打印服务器上激活特殊模式,则必须指定允许 LP 打印服务将输入类型和输出类型进行匹配的内容类型。

lpfilter 选项参数

选项指定如何将不同类型的信息转换为过滤器命令的命令行参数。此信息可以包括来自用户的规范(通过打印请求)、打印机定义和用于处理请求的任何过滤器实现的规范。

使用模板定义打印过滤器选项

定义打印过滤器选项的信息源有 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 是关键字具有指定值时发生的情况。

作为如何为特定过滤器定义选项的示例,假定希望打印服务调度程序按照以下条件将打印请求指定给过滤器:

要指定这些条件,请将以下模板作为 lpfilter 命令的选项提供:


Options: OUTPUT impress=-I, OUTPUT postscript=-P

如果 Options 行变得太长,则将每个模板放置在单独的行上,如下所示:


Options: OUTPUT impress=-I
Options: OUTPUT postscript=-P 

在这两个模板中,keyword 被定义为 OUTPUT。在第一个模板中,模式为 impressreplacement 的值为 --I。在第二个模板中,pattern 的值为 postscriptreplacement 的值为 -P

要确定为每种类型的模板(即,对于每个关键字的 patternreplacement 参数)提供哪些值,请考虑以下事项:

replacement 选项显示应如何将模板的值提供给过滤器程序。此部分通常为文字选项,有时包含占位符星号 (*) 以显示将值传递到的位置。patternreplacement 选项还可以使用 ed 命令的正则表达式语法,进行从用户输入选项到过滤器选项的更复杂转换。支持 ed 的所有正则表达式语法,其中包括 \( ... \)\n 结构。这些结构可用于提取 pattern 选项的部分,以复制到 replacement 选项,而 & 选项可用于将整个 pattern 选项复制到 replacement 选项。有关更多信息,请参见 ed(1) 手册页。


注 –

如果在 patternreplacement 选项中包括了逗号或等号 (=),则在该字符前面添加反斜杠 (\)。在使用 patternreplacement 选项时,将删除其中任何字符前面的反斜杠。


Procedure如何创建新的打印过滤器

  1. 在打印服务器上,成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 创建打印过滤器程序。

    有关打印过滤器程序的信息,请参见编写打印过滤器程序。按照惯例,PostScript 打印机的过滤器程序位于 /usr/lib/lp/postscript 目录中。应将您创建的程序放置在所选目录中的 /usr/lib/lp 目录下。

  3. 创建打印过滤器定义。

    有关打印过滤器定义的信息,请参见创建打印过滤器定义。应将打印过滤器定义保存在文本文件中。按照惯例,过滤器定义位于 /etc/lp/fd 目录中,并使用 .fd 后缀进行标识。

  4. 将打印过滤器添加到打印服务器。

    有关说明,请参见如何添加打印过滤器


示例 10–7 创建新的打印过滤器

此示例说明用于将 N37Nlp 转换为 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


示例 10–8 通过将一种输入类型转换为其他输出类型来创建新的打印过滤器

此示例说明用于从 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) 类型的任何打印机。用户在要求页面方向为纵向模式或横向模式时,只需要提供缩写 portland。由于这些选项不是 LP 打印服务所固有的,因此用户必须通过使用 lp -y 命令指定它们。

在将新的打印过滤器添加到打印服务器后,将对打印请求进行如下处理: