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 打印服务将在向管理员报警之前停止过滤器。
识别出故障后,过滤器立即应将打印机故障消息发送到其标准错误。过滤器不必退出,但是可以等待清除故障。
过滤器不该将有关文件中错误的消息发送到标准错误。这些消息应包括在用户可从中进行读取的标准输出中。
如果文件已完成打印(即使文件中的错误阻止它正确打印),则过滤器应以零退出代码退出。
仅当打印机故障阻止了过滤器完成打印请求时,过滤器才应以非零退出代码退出。
在添加到过滤器表时,必须将过滤器作为快速过滤器添加。