3

我需要直接打印一些信息(无需用户确认)并且我正在使用 Python 和win32print模块。

我已经阅读了整个Tim Golden win32print 页面(甚至阅读了很小的win32print 文档),并且我正在使用他自己在那里编写的相同示例,但我什么也没打印。

如果我进入交互式 shell 并一次迈出一步,我会在打印机队列中获取文档(在 之后StartDocPrinter),然后我得到文档大小(在StartPagePrinter, WritePrinter, EndPagePrinter块之后),然后文档从队列中消失(在EndDocPrinter) 不打印。

我知道ShellExecuteTim Golden 展示的方法。它在这里工作,但它需要创建一个临时文件并打印这个文件名,这是我不想要的两件事。

有任何想法吗?提前致谢。

这是我正在测试的代码(Tim Golden 的复制和粘贴):

import os, sys  
import win32print
import time
printer_name = win32print.GetDefaultPrinter()
if sys.version_info >= (3,):
    raw_data = bytes ("This is a test", "utf-8")
else:
    raw_data = "This is a test"

hPrinter = win32print.OpenPrinter (printer_name)
try:
    hJob = win32print.StartDocPrinter (hPrinter, 1, ("test of raw data", None, "RAW"))
    try:
        win32print.StartPagePrinter (hPrinter)
        win32print.WritePrinter (hPrinter, raw_data)
        win32print.EndPagePrinter (hPrinter)
    finally:
        win32print.EndDocPrinter (hPrinter)
finally:
    win32print.ClosePrinter (hPrinter)

[编辑]

我在我的计算机中安装了一台 pdf 打印机,以使用另一台打印机(CutePDF Writer)进行测试,我可以生成test of raw data.pdf文件,但是当我查看内部时,什么也没有。含义:除了WritePrinter似乎在做他们应该做的事情之外的所有命令。但是,正如我在评论中所说,WritePrinter返回应该写入打印机的正确字节数。我不知道如何解决这个问题,但只是确认我的打印机没有问题。

4

3 回答 3

3

我仍在寻找最好的方法来做到这一点,但我找到了一个让我自己满意的答案。在 Tim Golden 的网站(有问题的链接)中,您可以找到以下示例:

import win32ui
import win32print
import win32con

INCH = 1440

hDC = win32ui.CreateDC ()
hDC.CreatePrinterDC (win32print.GetDefaultPrinter ())
hDC.StartDoc ("Test doc")
hDC.StartPage ()
hDC.SetMapMode (win32con.MM_TWIPS)
hDC.DrawText ("TEST", (0, INCH * -1, INCH * 8, INCH * -2), win32con.DT_CENTER)
hDC.EndPage ()
hDC.EndDoc ()

在阅读了大量文档后,我对其进行了一些调整。我将使用win32ui库和TextOut(设备上下文方法对象)。

import win32ui
# X from the left margin, Y from top margin
# both in pixels
X=50; Y=50
multi_line_string = input_string.split()
hDC = win32ui.CreateDC ()
hDC.CreatePrinterDC (your_printer_name)
hDC.StartDoc (the_name_will_appear_on_printer_spool)
hDC.StartPage ()
for line in multi_line_string:
     hDC.TextOut(X,Y,line)
     Y += 100
hDC.EndPage ()
hDC.EndDoc ()

在回答我自己的问题之前,我在 meta stackoverflow 中进行了搜索,在这里我发现这是一种受鼓励的行为,因此我正在这样做。我会再等一会儿,看看我是否得到任何其他答案。

于 2013-01-30T23:15:45.857 回答
2
# U must install pywin32 and import modules:
import win32print, win32ui, win32con  
# X from the left margin, Y from top margin 
# both in pixels
X=50; Y=50
# Separate lines from Your string 
# for example:input_string and create 
# new string for example: multi_line_string 
multi_line_string = input_string.splitlines()  
hDC = win32ui.CreateDC ()
# Set default printer from Windows:
hDC.CreatePrinterDC (win32print.GetDefaultPrinter ())
hDC.StartDoc (the_name_will_appear_on_printer_spool)
hDC.StartPage ()
for line in multi_line_string:
     hDC.TextOut(X,Y,line)
     Y += 100
hDC.EndPage ()
hDC.EndDoc ()
#I like Python
于 2013-09-23T17:04:45.027 回答
0

问题是驱动程序版本。如果版本是 4,您需要提供 XPS_PASS 而不是 RAW,这里是一个示例。

drivers = win32print.EnumPrinterDrivers(None, None, 2)
hPrinter = win32print.OpenPrinter(printer_name)
printer_info = win32print.GetPrinter(hPrinter, 2)
for driver in drivers:
    if driver["Name"] == printer_info["pDriverName"]:
        printer_driver = driver
raw_type = "XPS_PASS" if printer_driver["Version"] == 4 else "RAW"

try:
  hJob = win32print.StartDocPrinter(hPrinter, 1, ("test of raw data", None, raw_type))
  try:
    win32print.StartPagePrinter(hPrinter)
    win32print.WritePrinter(hPrinter, raw_data)
    win32print.EndPagePrinter(hPrinter)
  finally:
    win32print.EndDocPrinter(hPrinter)
finally:
  win32print.ClosePrinter(hPrinter)
于 2021-12-24T13:43:15.447 回答