【问题标题】:Print document name that is actually being printed to printer打印实际正在打印到打印机的文档名称
【发布时间】:2020-06-11 16:39:27
【问题描述】:

我想要实现的是用win32print打印一个文件,这样我就可以 通知用户实际正在打印的作业。

使用print函数将文件名打印到标准输出就足够了。

我从here 获取这段代码来说明问题。

from win32 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)

您将如何通知用户正在打印的内容(检测开始新作业)?

Here 是状态码。

例如0x00000400 表示打印机正在打印。我找不到实际打印作业的方法。

【问题讨论】:

  • 要获取文档名称吗?你可以先EnumJobs,然后检查JOB_INFO_x.StatusJOB_STATUS_PRINTED还是JOB_STATUS_PRINTINGJOB_INFO_x.pDocument是文档名。
  • @DrakeWu-MSFT 能否请您编写代码 sn-p 以查看检查和通知?现在,在命令行中打印一条消息就足够了,以查看所有文档的连续打印。稍后(不是这个问题的一部分),我想在状态栏中通知或使用一些进度条。

标签: python python-3.x winapi printing


【解决方案1】:

如果要打印处于打印状态的作业的文档名称。 您可以尝试以下示例:

import win32print

if __name__ == "__main__":
    hPrinter= win32print.OpenPrinter(name)
    job_info_level = 1
    job_infos = win32print.EnumJobs(hPrinter, 0, -1, job_info_level)
    for job_info in job_infos:
        if (job_info['Status'] == win32print.JOB_STATUS_PRINTING)
            print("Printing "+job_info['pDocument'])
    win32print.ClosePrinter(hPrinter)\

更新:

打印时获取文档名称,可以使用FindFirstPrinterChangeNotificationFindNextPrinterChangeNotification

FindFirstPrinterChangeNotification 中设置JOB_NOTIFY_FIELD_DOCUMENT。 你可以参考this answer

【讨论】:

  • 是否可以这样写:虽然有要打印的作业:打印文档名称
  • 谢谢,一旦我在 Windows 笔记本电脑上,我会尝试你链接到的答案,无论如何它看起来很大。对我来说,检测打印机是否只是打印了一个文档和 save_it_to_db() 就足够了。
猜你喜欢
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 2012-11-01
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
相关资源
最近更新 更多