Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Printing 杯子返回';完成';在仍在打印的作业上_Printing_Cups_Ipp Protocol - Fatal编程技术网

Printing 杯子返回';完成';在仍在打印的作业上

Printing 杯子返回';完成';在仍在打印的作业上,printing,cups,ipp-protocol,Printing,Cups,Ipp Protocol,我正在使用IPP协议与CUPS通信。我的打印机的所有驱动程序都安装在CUPS中(使用.ppd文件),打印机得到了最新的固件 当我查询打印机正在打印的作业时,它会在打印机完成打印之前说明该作业的状态为“完成”。似乎CUPS在完成文件“上传”后会将作业标记为“完成” 我不希望出现这种情况,我基本上需要知道打印机打印作业的最后一张纸的确切时间。 代码如下所示。self.printer().ippPrinter()是节点ipp的一个实例,它指向打印机。要读取作业状态,我使用属性“作业状态” var ms

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

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

我不希望出现这种情况,我基本上需要知道打印机打印作业的最后一张纸的确切时间。 代码如下所示。
self.printer().ippPrinter()
节点ipp
的一个实例,它指向打印机。要读取作业状态,我使用属性
“作业状态”

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);
});
有人知道我为什么会有这个问题吗。。如何让它工作?
谢谢大家!

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

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

结论:

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

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

您可以通过运行

 lpstat -h cupsservername -v
这将返回分配给每个打印队列的设备URI,CUPS使用该URI来寻址实际的打印设备:

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

  • 但如果您看到
    socket://
    ,则CUPS配置为使用AppSocket方法(有时也称为“HP Jet Direct”或“IP Direct Printing”)转发作业。这是一个“开火后忘记”的协议。基本上,这与运行netcat打印设备9100将可打印数据铲到打印机端口9100的情况相同。CUPS
    socket
    后端处理此后台打印到打印机时,除了TCP/IP提供的确认最后一个数据包已传输的确认之外,不会从打印机获得任何其他确认。因此,它必须关闭进程并向CUPS守护进程报告“成功确定”,即使打印机仍在忙于吐出大量纸张,并且可能永远无法完成全部作业,因为它遇到卡纸

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

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

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


Peter,当打印机甚至没有打印一页(但它已收到所有输入数据,我可以稍后要求打印机手动继续打印作业)时,我将以完成的作业结束。我猜,谈论打印机协议的用户(即HP的AppSocket)只能执行您提到的“点火并忘记”,CUPS只能将该作业标记为已完成。对于lpd和套接字协议,更改驱动程序是否有可能改善这种情况?不同的驱动程序可以安装更好的后端吗?谢谢。我不知道lpd或套接字协议提供了更好的方法来监控作业。在任何情况下,打印机都必须支持这种监控。根据我的经验,ipp提供了更多选项,但这可能是一种偏见:-)如果URI包含
usb://
?@JoeVanDyk:…那么可以肯定的是,CUPS没有通过ipp与打印设备通信。
 sudo lpadmin -p printername http://ipaddress-of-printer:631