python win32print 不会打印
我需要直接打印一些信息(不需要用户确认),我正在使用Python和win32print
模块。
我已经看过了整个Tim Golden的win32print页面(甚至还看了win32print文档,虽然很简短),我用的就是他自己写的那个例子,但我就是打印不出来。
如果我在交互式命令行中一步一步执行,我能看到文档进入打印队列(在StartDocPrinter
之后),然后我能获取文档大小(在StartPagePrinter, WritePrinter, EndPagePrinter
这段代码之后),最后文档在队列中消失(在EndDocPrinter
之后),但就是没有打印出来。
我知道Tim Golden提到的ShellExecute
方法。这个方法在这里可以用,但它需要创建一个临时文件,并且打印的是这个文件名,这两点我都不想要。
有没有什么想法?提前谢谢你。
这是我正在测试的代码(复制自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
返回了应该写入打印机的正确字节数。我没有其他的想法来解决这个问题,只能确认我的打印机没有问题。
3 个回答
问题出在驱动程序的版本上。如果版本是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)
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。比如,有人可能在使用某个功能时,发现它没有按照预期工作,或者出现了错误信息。
这时候,我们可以去一些技术论坛,比如StackOverflow,去寻找解决方案。在这些论坛上,很多有经验的程序员会分享他们的经验和解决办法,帮助我们理解问题的根源。
如果你在某个特定的代码块中遇到问题,比如
# 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
,你可以把这个代码块的内容贴出来,看看有没有人遇到过类似的情况,或者他们是怎么解决的。
总之,遇到问题时,不要害怕寻求帮助,很多人都愿意分享他们的知识和经验,帮助你更好地理解编程。
我还在寻找最好的解决办法,不过我找到了一种能让我满意的解决方案。在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 ()
在回答我自己的问题之前,我在StackOverflow的元网站上查了一下,在这里我发现这是被鼓励的行为,所以我决定这么做。我会再等一段时间,看看是否会有其他人给我答案。