Python-如何与打印机通信

时间:2017-03-10 20:11:08

标签: python-3.x printing pywin32 pycups

我一直在寻找如何改进我为工作写的程序的几天。该程序使用python 3.6,只是将预先格式化的.doc文件发送到打印机,但我似乎无法找到一种方法来告诉函数如何在打印机用完后停止发送文件进行打印。纸。打印的文档数量各不相同,因此我不能只使用简单的范围函数。

我已经研究过win32print模块和pycups模块(不管怎样我都不会尝试安装)。信号模块中是否有某些东西可以捕获来自其他应用程序的外部错误消息?理想情况下,如果python脚本在发送文件之前可以首先检查打印队列的状态,那么最棒的是。

我发现下面的代码,使用win32print模块,应该完成此任务,但它似乎不起作用。

import win32print

p = win32print.OpenPrinter("Canon Inkjet iP1800 series")

raw = win32print.EnumJobs(p, 0, 999)

def main():
    while len(raw) > 0:
        #does some function

    if #receives error from printer:
        break

main()

win32print.ClosePrinter(p)

1 个答案:

答案 0 :(得分:0)

旁注:我必须说 pywin32 Win ,而 pycups (或任何 > cups 包装器)基于 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系列)。这就是为什么我必须编写一些额外的代码(我没有在这里包括)来枚举所有可用的打印机并得到它们的名字。