python win32print不打印

时间:2013-01-24 17:02:24

标签: python printing

我需要直接打印一些信息(没有用户确认),我正在使用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返回应该写入打印机的正确字节数。我没有其他想法如何解决这个问题,但只是认为我的打印机没有任何问题。

2 个答案:

答案 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