2013-01-24 273 views
1

我需要直接打印一些信息(沒有用戶確認),我使用Python和win32print模塊。蟒蛇win32print不打印

我已經讀過整個Tim Golden win32print page(甚至讀win32print doc,這很小),我使用的是他自己寫的那個例子,但我什麼也沒有打印。

如果我進入交互式shell並一次完成一個步驟,我在打印機隊列中獲取文檔(在StartDocPrinter之後),然後獲取文檔大小(在StartPagePrinter, WritePrinter, EndPagePrinter塊之後),然後文檔消失從隊列中(EndDocPrinter之後)不打印。

我知道0123金色的ShellExecute方法。它在這裏工作,但它需要創建一個臨時文件,它打印這個文件名,我不想要的兩件事。

任何想法?提前致謝。

這是我測試(蒂姆·金的複製和粘貼)代碼:

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作家),我可以生成test of raw data.pdf文件,但是當我向內看時,什麼也沒有。含義:除WritePrinter之外的所有命令似乎都在執行它們應該執行的操作。但是,正如我在評論中所說的那樣,WritePrinter返回應該寫入打印機的正確字節數。我沒有其他想法如何解決這個問題,但只是簡單地說我的打印機沒有問題。

+0

要查看是否有問題並瞭解它是什麼,請更改異常處理,以便將出現的任何內容打印到控制檯而不是用'finally'忽略它們。 – martineau

+0

剛剛測試過。沒有例外發生。 – marcelocra

+0

其實代碼不處理異常,所以如果我有任何它會在控制檯中顯示,我猜。但是,無論如何感謝= D。 – marcelocra

回答

2

我仍在尋找最好的方法來做到這一點,但我找到了一個滿足自己的問題的答案。在蒂姆·金的網站(有問題的鏈接),你可以找到這個例子:

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() 

我搜索的元計算器回答我的問題和here我發現這是一個鼓勵的行爲之前,因此我這樣做。我會再等一等,看看我是否有其他答案。

+0

Hm,字節類型的對象不能轉換爲Unicode。所以只有編碼字符串 –

+0

@HrvojeT Windows API以UTF-16工作。我只能假設'DrawText'正在進行轉換。 –

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