旁注:我必须说pywin32是基于Win的,而pycups(或任何杯子包装器)是基于Ux的,所以除非有一些我不知道的Win杯子端口,否则您应该选择上述 2 之一(最好,与您所在的平台/拱门相匹配)。
我做了一些研究,没有必要遍历所有打印机作业,以检查打印机是否处于错误状态。此外,循环从 0 到 999 的作业并不能保证检查所有作业,因此上面的逻辑(即使它是正确的 - 这不是)不会成立。
这是一个示例实现(我冒昧地添加了比问题中指定的错误更多的错误:用完纸(win32print.PRINTER_STATUS_PAPER_OUT
)并将它们放入
PRINTER_ERROR_STATES
(注释掉那些你不认为是错误的错误):
import win32print
PRINTER_ERROR_STATES = (
win32print.PRINTER_STATUS_NO_TONER,
win32print.PRINTER_STATUS_NOT_AVAILABLE,
win32print.PRINTER_STATUS_OFFLINE,
win32print.PRINTER_STATUS_OUT_OF_MEMORY,
win32print.PRINTER_STATUS_OUTPUT_BIN_FULL,
win32print.PRINTER_STATUS_PAGE_PUNT,
win32print.PRINTER_STATUS_PAPER_JAM,
win32print.PRINTER_STATUS_PAPER_OUT,
win32print.PRINTER_STATUS_PAPER_PROBLEM,
)
def printer_errorneous_state(printer, error_states=PRINTER_ERROR_STATES):
prn_opts = win32print.GetPrinter(printer)
status_opts = prn_opts[18]
for error_state in error_states:
if status_opts & error_state:
return error_state
return 0
def main():
printer_name = "Canon Inkjet iP1800 series" # or get_printer_names()[0]
prn = win32print.OpenPrinter(printer_name)
error = printer_errorneous_state(prn)
if error:
print("ERROR occurred: ", error)
else:
print("Printer OK...")
# Do the real work
win32print.ClosePrinter(prn)
if __name__ == "__main__":
main()
注意:显然,Win不会存储打印机上设置的打印机名称。就我而言,我有一台名为EPSON******的打印机。但是在Win中,它的名字是EPSON******(WF-7610 系列)。这就是为什么我必须编写一些额外的代码(我没有在这里包含)来枚举所有可用的打印机并获取它们的名称。