【问题标题】:Python Win32print Job StatusPython Win32print 作业状态
【发布时间】:2018-12-13 16:00:26
【问题描述】:

我一直在尝试在 Python 中使用 win32print 获取打印作业的状态。

win32print 提供的状态代码似乎与相关作业的状态代码不匹配。我在不同的打印机上尝试过,但总是得到相同的结果。

import win32print
import subprocess

printer_name = win32print.GetDefaultPrinter()

print("Printer: %s" % (printer_name))

hPrinter = win32print.OpenPrinter(printer_name)

try:
    hJob = win32print.StartDocPrinter(hPrinter, 1, ("test of raw data", None, "RAW"))
    try:
        f = open("test2.ps", "r")
        win32print.StartPagePrinter(hPrinter)
        win32print.WritePrinter(hPrinter, bytes(f.read(), "utf-8"))
        win32print.EndPagePrinter(hPrinter)
    finally:
        win32print.EndDocPrinter(hPrinter)
finally:
    print("Printing: %s" % (hJob))
    win32print.ClosePrinter(hPrinter)

hPrinter = win32print.OpenPrinter(printer_name)
past_status_code = -0
while True:
    try:
        job = win32print.GetJob(hPrinter, hJob, win32print.JOB_INFO_1)
    except:
        break
    status_code = job['Status']

    if (status_code != past_status_code):
        print("Job Status Code: %s" % (status_code))

    past_status_code = status_code

    if (job['Status'] == win32print.JOB_STATUS_BLOCKED_DEVQ):
        print("BLOCKED_DEVQ")

    if (job['Status'] == win32print.JOB_STATUS_DELETED):
        print("Deleted")

    if (job['Status'] == win32print.JOB_STATUS_DELETING):
        print("Deleting")

    if (job['Status'] == win32print.JOB_STATUS_ERROR):
        print("Error")

    if (job['Status'] == win32print.JOB_STATUS_OFFLINE):
        print("Offline")

    if (job['Status'] == win32print.JOB_STATUS_PAPEROUT):
        print("PaperOut")

    if (job['Status'] == win32print.JOB_STATUS_PAUSED):
        print("Paused")

    if (job['Status'] == win32print.JOB_STATUS_RESTART):
        print("Restart")

    if (job['Status'] == win32print.JOB_STATUS_USER_INTERVENTION):
        print("User intervention")

    if (job['Status'] == win32print.JOB_STATUS_SPOOLING):
        print("Spooling")

    if (job['Status'] == win32print.JOB_STATUS_PRINTING):
        print("Printing")

    if (job['Status'] == win32print.JOB_STATUS_PRINTED):
        print("Printed")

    if (job['Status'] == win32print.JOB_STATUS_COMPLETE):
        print("Complete")

运行上面的脚本后,我总是得到相同的结果/状态代码,我似乎得到了 8208,然后是 148。

我试图做的是检查作业何时完成。

【问题讨论】:

  • 你有没有想过这个问题?
  • @panofish 不,我没有。一直坚持到今天。你有运气吗?我不敢相信 python 没有统一的跨平台打印库。
  • 如果网络打印机尚未添加到您的客户端计算机,您将获得 8208 状态码。
  • “win32print 提供的状态码似乎与相关作业的状态码不匹配”是什么意思?
  • 另外,8208 和 148 都是无效的作业状态。你确定这些数字是job['Status'] 的值吗?

标签: python python-3.x winapi printing


【解决方案1】:

你可以从这里开始:

此脚本允许您查看打印作业队列。如果您想查看特定作业的信息,可以使用Get Job documentation 对其进行自定义。

import time
import win32print

#----------------------------------------------------------------------
def print_job_checker():
    """
    Prints out all jobs in the print queue every 5 seconds
    """
    jobs = [1]
    while jobs:
        jobs = []
        for p in win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL,
                                         None, 1):
            flags, desc, name, comment = p

            phandle = win32print.OpenPrinter(name)
            print_jobs = win32print.EnumJobs(phandle, 0, -1, 1)
            if print_jobs:
                jobs.extend(list(print_jobs))
            for job in print_jobs:
                print "printer name => " + name
                document = job["pDocument"]
                print "Document name => " + document
            win32print.ClosePrinter(phandle)

        time.sleep(5)
    print "No more jobs!"

#----------------------------------------------------------------------
if __name__ == "__main__":
    print_job_checker()

脚本取自this post

【讨论】:

  • 我可以测试一下,当某个文档刚刚打印时 => 将文档的名称保存到数据库中吗?我有兴趣检测文档何时打印,我不想错过它。因为,在“Microsoft Print to PDF”上打印小文档时速度非常快,我只看到“没有更多作业”
【解决方案2】:

返回的状态是位掩码,如here 所述,例如 。多个值可以进行或运算,所以你的值 8208(hex 0x00002010) 表示打印机有(全部)状态。

  • 十六进制 0x00002000 = PRINTER_STATUS_WAITING
  • 十六进制 0x00000010 = PRINTER_STATUS_PAPER_OUT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 2011-08-05
    • 2021-01-25
    相关资源
    最近更新 更多