我正在使用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);
});
有谁知道为什么我有这个问题或..如何让它工作?谢谢!
2 回答
CUPS只能转发从打印机接收的作业状态 . 许多打印机驱动程序和协议的工作方式类似于“即发即忘” .
通常,IPP打印机允许CUPS和其他客户端监视当前的作业状态,直到完成/打印为止 . 有些制造商没有正确实施IPP并将提交的作业分类为打印 - 即使打印机有卡纸!
结论:
如果您的打印机不支持指定的IPP,您可能无法检查“打印成功” .
@Jakub, you 可能正在使用IPP与 CUPS 进行通信......但是你确定 CUPS 正在通过IPP与 print device 进行通信吗?
您可以通过运行来检查
这应该返回分配给每个打印队列的设备URI,CUPS用它来寻址实际的打印设备:
如果该URI确实包含
ipp://
,ipps://
,http://
或https://
CUPS确实会将IPP与打印设备进行对话,您应该能够获得实际正确的状态消息 .但是如果你看到
socket://
,那么CUPS被配置为使用AppSocket方法(有时也称为'HP Jet Direct'或'IP Direct Printing')来转发作业 . 这是一个"fire and forget"协议 . 基本上它就像你运行netcat print-device 9100 < myprintfile
将可打印数据铲到打印机的端口9100一样 . 处理此假脱机到打印机的CUPSsocket
后端将不会从打印机获得任何其他确认,而不是TCP / IP提供的确认最后一个数据包被转移的确认 . 因此,它必须关闭其进程并向CUPS守护程序successful-ok
报告,即使打印机仍在忙着吐出大量纸张,并且可能永远不会完成整个作业,因为它会发生卡纸...如果您看到
lpd://
情况类似(但使用端口515) .通过将CUPS-to-printdevice路径从AppSocket或LPD切换到IPP,您可以获得完整的状态报告,如下所示:
要么