“我是这样处理的:[...] 将 *cupsFilter 添加到打印机 PPD”
请注意,在将作业数据传递到相应队列的后端(将其发送到最终目标打印机或文件)之前*cupsFilter:
,打印队列的 PPD 中的 -entry 确定将哪个过滤器作为该队列的过滤链的最后一个实例运行.
所以这真的取决于你的 PPD 背后隐藏着什么具体设置*cupsFilter:
。如果您*cupsFilter:
告诉 CUPS 将相应数据作为“原始”作业处理,那么它可能永远不会看到任何创建会计信息的过滤器。您的作业数据可能未经过滤就进入打印设备。在这种情况下,CUPS 唯一的选择是将副本数写入1
文件page_log
。
如果您弄乱了 CUPS 过滤(通过任何方式:编写您自己的过滤器或包装脚本、*cupsFilter:
PPD 中的行或其他任何东西......),那么您有责任创建一个过滤器链,在page_log
.
“有没有办法链式过滤?”
当然有。
CUPS 过滤器对参数的数量和调用它们的确切顺序非常挑剔。他们通过在终端中手动调用其中一个而无需任何参数来告诉您它是哪种方式。这是来自 Mac OSX 的示例:
kp@mbp:> /usr/libexec/cups/filter/pstops
Usage: /usr/libexec/cups/filter.orig/pstops job-id user title copies options [file]
所以它是:
- 论据号
0
:过滤器本身的路径+名称
- 论据号
1
: CUPS 作业 ID
- 论据号
2
: CUPS 用户名
- 论据号
3
: 职称
- 论据号
4
: 要求的份数
- 论据号
5
:此作业的打印作业选项。过滤器只应用它理解的选项!
- 论据号
6
:要处理的文件。可选参数。如果缺少,则表示:“过程<stdin>
”。
CUPS 过滤器总是<stdout>
向<stdin>
.
如果您手动或通过脚本调用和运行过滤器,则上述某些参数可能为空或带有虚拟值。如果为空,请使用像这样的空双引号:""
.
第六个参数(输入文件名)是可选的。如果它丢失,那么过滤器应该期望它的输入来自<stdin>
.
因此,您可以编写自己的 CUPS 过滤器。有两种不同的类型适合您:
- 要么从头开始编写 CUPS 过滤器。
- 或者编写一个 CUPS 过滤器作为包装器,运行一个原始的 CUPS 过滤器(或一系列 CUPS 过滤器)
在任何情况下,您的过滤器调用约定必须遵循上述关于参数数量及其在命令行中出现顺序的规则。
还要注意这一点:如果CUPS运行导致输出到 的过滤器<stderr>
,它会将此输出重定向到 CUPS 日志文件。因此,如果您编写自己的 CUPS 过滤器,您可以通过控制<stderr>
. 如果您不希望它出现在 CUPS 日志中,请重定向到/dev/null
.
如果您在终端中手动运行过滤器,则<stderr>
输出当然会出现在该终端中。
因此,要将 Mac 上的 PDF 文件手动输入到手动调用的 CUPS 过滤器链,我会尝试:
in=a-one-page-pdf-file.pdf
/usr/libexec/cups/filter/cgpdftops 1 kp "testing filter-chain" "1" "" ${in} \
| /usr/libexec/cups/filter/pstops 1 kp "testing filter-chain" "1" "" \
| /usr/libexec/cups/filter/pstopdffilter 1 kp "testing filter-chain" "1" "" \
| /usr/libexec/cups/filter/cgpdftoraster 1 kp "testing filter-chain" "1" "" \
| /usr/libexec/cups/filter/rastertotiff 1 kp "testing filter-chain" "1" "" \
| /opt/local/bin/convert - -mattecolor red -scale 25% -frame 1x1 output.png
(不要告诉我,这个特定的过滤链没有多大意义。我知道。它仅用于演示目的。但它有效。)
该命令处理 PDF,首先调用 5 个 CUPS 过滤器的过滤链。然后作为它的最后一个过滤器,它调用 ImageMagickconvert
命令,该命令创建一个带有细红线的 PNG 图像,作为页面周围的框架。
它还有很多内容,例如:
- 现在一些过滤器如何读取和解释 PPD 文件,以及如何应用他们在命令行上读取的作业选项,以及在 PPD 文件中指定的详细信息。他们从环境变量中获取要使用的 PPD
PPD
。
- 如果您在过滤器吐出的消息行前
<stderr>
加上关键字EMERG:
, ALERT:
, CRIT:
, ERROR:
, WARN:
, NOTICE:
, INFO:
,或者只有当cupsd.conf中的相应设置(或更高设置)处于活动状态时,DEBUG:
这些相应的行才会出现在日志中:, , , ,或. _LogLevel
alert
crit
error
warn
notice
info
debug
但我暂时就这样吧……