如何通过CUPS API了解CUPS打印作业失败的原因?
使用CUPS API,我打印了两个无法打印的作业。在CUPS Web界面上,我可以看到它们失败的原因:"不支持的打印数据。"和"无法写入打印数据。"
但是,API似乎并不包含这些原因。 cupsGetJobs()
方法返回cups_job_s
结构,如下所示:
struct cups_job_s {
time_t completed_time;
time_t creation_time;
char *dest;
char *format;
int id;
int priority;
time_t processing_time;
int size;
ipp_jstate_t state;
char *title;
char *user;
};
我检查了所有这些字段,其中没有一个字段包含屏幕截图中显示的错误字符串。
答案 0 :(得分:4)
我相信这归结为job-state-message
属性。要检索作业属性,我相信您必须使用IPP API,例如(未经测试):
ipp_t *request = ippNewRequest(IPP_GET_JOBS);
...
ipp_t *response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
...
ipp_attribute_t *attr = ippFindAttribute(response, "job-state-message", IPP_TAG_TEXT);
值得注意的是,与job-state
相关的属性可能会在作业被接受后的某个时刻更新。由于服务器不知道打印是否真的成功(因为 Murphy定律许多因素),作业被接受,失败时它会相应地更新job-state
和相关属性。 job-state-message
不是强制性的。
如果您希望应用程序对这些事件做出反应而不是以固定间隔查询CUPS服务器,则可以订阅一些 D-Bus事件(see Apple's implementation) 。如果您想要一个消费者实施示例,您可以阅读Printer's Panel code from gnome-control-center。
下面我尝试引用RFC 2911(IPP 1.1)的部分相关部分:
...
在作业处理时,由于Printer对象已经存在 在响应创建时响应成功的状态代码 如果Printer对象检测到错误,则请求Printer对象 无法通过操作通知最终用户错误 状态代码。在这种情况下,打印机可以根据错误而定 设置工作对象的“工作状态”,“工作状态原因”或“工作 - state-message“属性到适当的值,以便以后 查询可以报告正确的工作状态。
注意:事件的异步通知超出了范围 这份IPP / 1.1文件。
...
6''处理已停止':处理时作业已停止 由于种种原因而将返回 一旦原因不再存在,就处理'处理'状态 本。
作业的“作业状态 - 原因”属性可以指出原因 这份工作已停止处理。例如,如果 输出设备停止,'打印机停止'值可以 被列入工作的“工作状态 - 原因”属性。
注意:当输出设备停止时,设备 通常以人类可读的形式表明其状况 在设备本地。客户可以获得更完整的 通过查询Printer对象远程设备状态 “打印机状态”,“打印机状态原因”和“打印机 - 状态消息“属性。
此属性指定有关“工作状态”和“工作 - 的信息 状态原因“人类可读文本中的属性。如果是打印机 object支持这个属性,Printer对象必须能够 用任何自然语言生成此消息 打印机的“生成自然语言支持”属性(请参阅 中指定的“attributes-natural-language”操作属性 第3.1.4.1节。
值不应包含未包含的其他信息 “工作状态”和“工作状态 - 原因”属性的值, 如解释器错误信息。否则,申请 程序可能会尝试解析(本地化文本)。对于这样 其他信息,如应用程序的解释器错误 程序消费或特定文档访问错误,新的 需要开发和注册具有关键字值的属性。
脚注:我没有亲自完成,但RFC确实告诉了您应该期待的内容。
答案 1 :(得分:0)
在 Debian 8.6 Cinnamon 2.2.16(linux)从开始菜单执行此操作:
这将打开打印疑难解答程序。它会告诉你下一步该做什么。
您可能只需在打印设置中选中CUPS打印机的Enabled属性即可。 (你需要先解锁)。
最后,为避免再次发生这种情况,请在上述打印机设置中(在属性|策略下)将打印机“策略”更改为“重试作业”。
为我修好了!
导致此问题的原因:如果我打印到CUPS PRINTER时我的wifi打印机电源关闭,而我的政策是“停止打印机”,那么我收到一条消息,说明我无法打印并禁用打印机(未选中“已启用”)。仅当策略设置为“重试作业”时才会取消选中“已启用”。打印机重新启动几分钟后,您的作业将开始打印。
(我other关于此事的帖子。)