Printing 使用自定义筛选器的CUPS页面记帐

Printing 使用自定义筛选器的CUPS页面记帐,printing,postscript,accounting,cups,Printing,Postscript,Accounting,Cups,我有两台Konica Bizhub打印机,希望Windows机器通过Samba打印 问题是,这些打印机使用帐户跟踪进行复制/扫描。我是这样处理的:(被另一篇文章修改:在打印机PPD中添加*cupsFilter) 但现在我无法计算打印的页面,因为每个作业都有1个 如果我理解正确,则必须应用“pstops”过滤器才能正确计数。有没有一种方法可以连锁过滤 CUPS管理的另一台打印机(不带自定义过滤器)已正确记帐,并使用相同的驱动程序方法(具有打印机特定PPD的Windows PS驱动程序) “我这样处

我有两台Konica Bizhub打印机,希望Windows机器通过Samba打印

问题是,这些打印机使用帐户跟踪进行复制/扫描。我是这样处理的:(被另一篇文章修改:在打印机PPD中添加*cupsFilter)

但现在我无法计算打印的页面,因为每个作业都有1个

如果我理解正确,则必须应用“
pstops
”过滤器才能正确计数。有没有一种方法可以连锁过滤

CUPS管理的另一台打印机(不带自定义过滤器)已正确记帐,并使用相同的驱动程序方法(具有打印机特定PPD的Windows PS驱动程序)

“我这样处理:[…]在打印机PPD中添加*cupsFilter”

请注意,打印队列的PPD中的
*cupsFilter:
-条目在将作业数据传递到相应队列的后端(将其发送到最终目标打印机或文件)之前,确定要作为该队列的筛选链的最后一个实例运行的筛选器

因此,这取决于你的PPD背后隐藏着什么样的具体设置
*cupsFilter:
。如果您的
*cupsFilter:
告诉CUPS将各自的数据作为“原始”作业处理,那么它可能永远不会看到任何创建会计信息的过滤器。您的作业数据可能未过滤到打印设备。在这种情况下,CUPS唯一的选择是将副本数
1
写入
page\u log
文件

如果你搞砸了CUPS过滤(不管用什么方法:编写你自己的过滤器或包装器脚本,
*cupsFilter:
行在PPD中,或者其他什么…),那么你自己的责任就是创建一个过滤器链,在
页面日志
中创建正确的条目

“有没有办法进行链式过滤?”

当然有

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
    :要处理的文件。可选参数。如果缺少,则表示“进程
  • CUPS过滤器始终将输出传送到
    ,并且必须能够从
    获取输入

    如果手动或通过脚本调用并运行筛选器,则上述某些参数可能为空,或者可能带有伪值。如果为空,请使用如下空双引号:
    “”

    第六个参数(输入文件名)是可选的。如果缺少,则过滤器应期望其输入来自

    因此,您可以编写自己的CUPS过滤器。有两种不同的类型供您选择:

  • 要么从头开始写一个CUPS过滤器
  • 或者编写一个CUPS过滤器作为包装,运行一个原始CUPS过滤器(或一系列CUPS过滤器)
  • 在任何情况下,您的筛选器调用约定都必须遵循上述关于参数数量及其在命令行中出现顺序的规则

    还要注意:如果CUPS运行一个导致输出为
    的过滤器,它会将此输出重定向到CUPS日志文件。因此,如果您编写自己的CUPS过滤器,您可以通过控制转到
    的内容来控制CUPS日志中的内容。如果不希望它出现在CUPS日志中,请重定向到
    /dev/null

    如果您在终端中手动运行过滤器,
    输出当然会出现在该终端中

    因此,要手动将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过滤器组成的过滤链。然后,作为最后一个过滤器,它调用ImageMagick
    convert
    命令,该命令创建一个PNG图像,页面周围有一条细红线作为框架

    还有很多,比如:

    • 一些过滤器现在可以过滤如何读取和解释PPD文件,以及如何应用在命令行上读取的作业选项,这些作业选项的详细信息在PPD文件中指定。他们从环境变量
      PPD
      中获取要使用的PPD
    • 如果在过滤器吐出的消息行前面加上关键字
      EMERG:
      警报:
      临界值:
      错误:
      警告:
      注意:
      信息:
      ,或
      DEBUG:
      则只有当cupsd.conf中相应的
      LogLevel
      设置(或更高设置)处于活动状态时,这些相应的行才会出现在日志中:
      警报
      临界值
      错误
      警告
      注意
      信息
      调试

    但是我现在就不说了…

    这是一个很好的答案,但是需要注意的两件事是CUPS调用过滤器设置
    argv[0]
    不是调用可执行文件的名称,而是调用它正在执行的打印机的名称(虽然我不确定实际有多少个过滤器采用这种方式,因为打印机的名称也应该在
    printer
    环境变量中可用)。其次,我认为大多数系统都配备了
    cupsfilter
    ,它可以用来列出特定输入和输出类型所需的过滤器(甚至可以为您设置管道)。@dreamlax:不。您使用的
    argv[0]
    与我说的完全一样。(CUPS会重新设置管道。)