Python Win32print 作业状态

标签 python python-3.x winapi printing

我一直在尝试使用 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。

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

最佳答案

你可以从这里开始:

此脚本允许您查看打印作业队列。您可以使用 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

关于Python Win32print 作业状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53765699/

相关文章:

python - 用 SVG 椭圆弧计算?

python - Pycharm 中的 "Jupyter package is not installed"错误消息(使用 Windows)。我该如何解决?

python - 旋转多索引数据

python - 如何同时使用Tensorflow tf.nn.Conv2d进行训练和预测?

python-3.x - 通过 HTTP 请求的 Json 响应与网站上的不同

python使用for循环更新嵌套字典值与理解

c++ - 在通过 ReadFile() 函数读取文件期间检查文件结尾

c++ - IExecuteCommand 与 IContextMenu 的多功能性

winapi - 将 COM 变体序列化为 BLOB 或 IStream

python - 清除 `deque` s : is it thread-safe?