当前位置: 首页 > 知识库问答 >
问题:

CUPS在仍在打印的作业上返回“完成”

端木高邈
2023-03-14

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

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

我不希望出现这种行为,我基本上需要知道打印机何时打印出作业的最后一张纸。代码如下所示。自身。打印机()。ippPrinter()是节点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个答案

能文华
2023-03-14

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

你可以通过运行

 lpstat -h cupsservername -v

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

>

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

    但是如果您看到soc://,则CUPS被配置为使用AppSocket方法(有时也称为“HP Jet Direct”或“IP Direct Prting”)来转发作业。这是一个“开火并忘记”协议。基本上它与您确实运行netcat print-device9100是一样的

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

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

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

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

  • 李烨烁
    2023-03-14

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

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

    结论:

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

    RFC 80115.3.7.1

    如果实现是从不提供打印作业详细状态的打印系统的网关,则实现可以将IPP作业的状态设置为“已完成”,前提是它还设置了作业的“工作状态原因”属性中的“设备排队”值

     类似资料:
    • > 我试图在作业完成之前返回Spring Batch作业ID。 我当前的实现只在作业完成后返回信息。 我使用批处理程序控制器和批处理服务,发布在下面。谢谢,我是新来的Spring Batch,经过详尽的搜索,找不到太多与我的问题相关的。有一个帖子有人使用Apache骆驼,但我没有。 控制器 服务 再次感谢。 编辑 我已将其添加到批处理配置中 编辑 在马哈茂德·本·哈辛的评论的帮助下,我解决了这个问

    • 有没有一种方法可以让CUPS在尚未完成最后一个作业的情况下将作业排队到IPP打印机? 背景:我们有一台XEROX Workcenter打印机,它有自己的作业队列。每次有人想要打印时,他们都必须将作业假脱机,将他们的支付卡插入打印机,然后在打印机触摸板上选择他们的作业。但是,当在中央服务器上使用CUPS时,CUPS只在最后一个作业完成时后台处理下一个作业,因此只有第一个后台处理的人才能看到并支付他们

    • 我需要在服务器端区分本地和远程CUPS打印作业。我认为可以使用打印作业的原始主机,但我无法找到可靠获取其值的方法,最接近的是IPP作业属性之一“作业原始主机名”,但当我用“ipptool”检查从一个主机打印到另一个主机的暂停作业时,它是空的。“lpq”报告与“localhost”相同的作业,因此也没有多大帮助。 这是用于虚拟OS X打印机的自定义CUPS后端部分,但如果您知道如何获取此信息,这可能

    • 我正在做一个项目,我们正在使用Spring Boot、Spring Batch和Camel。 关于如何在JobExecution数据可用时立即返回它,有什么想法吗?

    • 问题内容: 我需要编写一个小的日志分析器应用程序来处理由我的项目中使用的第三方封闭源库(内部具有自定义记录器)生成的一些日志文件。 如果日志中有异常条目,我需要从堆栈顶部到异常的实际位置收集有关堆栈跟踪中所涉及方法的汇总信息。 不幸的是,默认情况下,Java printStackTrace()不会打印调用堆栈中的每个方法,但是最多可以打印一个特定的数目,其余的仅被引用为。 如果我自己可以捕获到该异

    • 我有两台固定IP地址的linux计算机: 打印服务器,通过CUPS共享连接的打印机 (服务器的IP地址为“192.168.1.2”,打印机称为“test_printer”。) 不幸的是,通过CUPS的打印机传播似乎无法可靠地工作(可能是由于网络结构)。 我可以将打印作业直接从python程序发送到CUPS打印服务器吗? 如果是,你能提供一个小例子吗? 理论上,我只会将格式正确的数据发送到IP地址端