4

我正在使用 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);
});

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

4

2 回答 2

4

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

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

结论:

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


RFC 8011 5.3.7.1

如果实现是一个从不提供打印作业详细状态的打印系统的网关,那么实现可以将 IPP 作业的状态设置为“已完成”,前提是它还在作业的“工作状态原因”属性

于 2015-05-11T07:22:59.707 回答
0

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

您可以通过运行检查这一点

 lpstat -h cupsservername -v

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

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

  • 但是,如果您看到socket://CUPS 被配置为使用 AppSocket 方法(有时也称为“HP Jet Direct”或“IP Direct Printing”)来转发作业。这是一个“即发即弃”的协议。基本上它就像你运行netcat print-device 9100 < myprintfile将可打印数据铲到打印机的端口 9100 一样。处理此假脱机到打印机的 CUPSsocket后端不会从打印机获得任何其他确认,除了 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
于 2018-12-09T04:53:01.123 回答