【问题标题】:CUPS returns 'complete' on jobs which are still printingCUPS 对仍在打印的作业返回“完成”
【发布时间】:2014-08-20 18:07:48
【问题描述】:

我正在使用 IPP 协议与 CUPS 通信。我在 CUPS 中安装了我的打印机的所有驱动程序(使用 .ppd 文件),并且打印机获得了最新固件。

当我查询打印机正在打印的作业时,它说作业的状态在打印机完成打印之前就已经“完成”了。似乎 CUPS 在完成“上传”文件时将作业标记为“完成”。

我不希望出现这种行为,我基本上需要知道打印机打印作业的最后一张纸的确切时间。 代码如下所示。 self.printer().ippPrinter()node-ipp 的一个实例,它指向一台打印机。要读取我正在使用属性'job-state' 的作业状态。

var msg = {
  "operation-attributes-tag": {
    'job-id': id
  }
};

self.printer().ippPrinter().execute("Get-Job-Attributes", msg, function(err, res){
  var attributes = res['job-attributes-tag'];

  self.setAttributes = attributes;
  callback.call(self, attributes);
});

有谁知道我为什么会遇到这个问题或..如何使它工作? 谢谢!

【问题讨论】:

    标签: printing cups ipp-protocol


    【解决方案1】:

    CUPS 只能转发从打印机接收到的作业状态。许多打印机驱动程序和协议的工作方式类似于“即发即弃”。

    通常 IPP 打印机允许 CUPS 和其他客户端监控当前的作业状态,直到它完成/打印。一些制造商未正确实施 IPP 并将提交的作业归类为已打印 - 即使打印机卡纸!

    结论:

    如果您的打印机不完全支持 IPP,您可能无法检查“打印成功”。


    RFC 8011 5.3.7.1

    如果实现是一个打印系统的网关,它从不提供有关打印作业的详细状态,则实现可以将 IPP 作业的状态设置为“已完成”,前提是它还设置了“设备排队”值在 Job 的“job-state-reasons”属性中

    【讨论】:

    • 彼得,当打印机甚至没有打印一页时,我将完成作业结束(但它已收到所有输入数据,我稍后可以要求打印机手动继续作业) .我猜backend 谈论打印机协议(即 HP 的 AppSocket)只能执行您提到的“即发即忘”,而 CUPS 只能将该工作标记为已完成。对于 lpd 和 socket 协议,是否有机会改变驱动程序这种情况可以得到改善?不同的驱动程序可以安装更好的后端?谢谢。
    • 我不知道 lpd 或套接字协议提供了更好的方法来监视作业。在任何情况下,打印机也必须支持这种监控。根据我的经验,ipp 提供了更多选择,但这可能是一种有偏见的观点 :-)
    【解决方案2】:

    @Jakub,很可能正在使用 IPP 与 CUPS 进行通信......但你确定吗CUPS 正在通过 IPP 与 打印设备 通信?

    你可以通过运行来检查这个

     lpstat -h cupsservername -v
    

    这应该返回分配给每个打印队列的设备 URI,CUPS 使用它来寻址实际的打印设备:

    • 如果该 URI 确实包含 ipp://ipps://http://https:// CUPS 确实将 IPP 与打印设备通信,您应该能够获得实际正确的状态消息。

    • 但是,如果您看到 socket://,则 CUPS 配置为使用 AppSocket 方法(有时也称为“HP Jet Direct”或“IP Direct Printing”)来转发作业。这是一个“即发即弃”的协议。基本上就像你运行 netcat print-device 9100 < myprintfile 将可打印数据铲到打印机的端口 9100 一样。处理此假脱机到打印机的 CUPS socket 后端不会从打印机获得任何其他确认,除了 TCP/IP 提供的确认最后一个数据包已传输的确认。因此它必须关闭它的进程并向 CUPS 守护进程successful-ok 报告,即使打印机仍在忙于吐出大量纸张并且可能永远无法完成整个作业,因为它遇到了卡纸......

    • 如果您看到lpd://,情况类似(但使用端口 515)。

    您可以通过将 CUPS 到打印设备的路径从 AppSocket 或 LPD 切换到 IPP 来成功完成完整的状态报告,如下所示:

     sudo lpadmin -p printername ipp://ipaddress-of-printer
    

     sudo lpadmin -p printername http://ipaddress-of-printer:631
    

    【讨论】:

    • 如果URI包含usb://怎么办?
    • @JoeVanDyk:...那么可以肯定的是,CUPS通过 IPP 与打印设备通信。
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2018-03-16
    • 2016-08-05
    相关资源
    最近更新 更多