我需要直接打印一些信息(没有用户确认),我正在使用Python和win32print
模块。
我已经阅读了整个Tim Golden win32print page(甚至读了win32print doc,这很小)我正在使用他自己写的那个例子,但我什么都不打印。
如果我转到交互式shell并一次执行一步,我将文档放在打印机队列上(在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
返回应该写入打印机的正确字节数。我没有其他想法如何解决这个问题,但只是认为我的打印机没有任何问题。
答案 0 :(得分:4)
我仍然在寻找最好的方法来做到这一点,但我找到了一个让我自己解决问题的答案。在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中搜索了here我发现这是一种鼓励行为,因此我正在这样做。我会再等一下,看看我是否得到任何其他答案。
答案 1 :(得分: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