2010-12-17 74 views
3

我有taht將重複執行的Python應用程序。它將PDF保存爲一個文件,然後將其打印出來。打印結束時會刪除文件。打印PDF和刪除文件時,打印完成

當前的解決方案(用於打印和刪除部分)是這樣的:

win32api.ShellExecute(0, "print", file_path, None, ".", 0) 
time.sleep(10) 
os.remove(self.options.dest_name) 

time.sleep(10)給印刷工藝文件刪除之前運行的時間。如果沒有它,Acrobat Reader將打開(無論如何會打開)並警告它找不到該文件。這是因爲文件刪除已經發生。

問題是:

  1. 我怎麼能做到這一點沒有這種不可靠的把戲?最好的辦法是爲打印過程設置一個處理程序,並獲取有關打印狀態的信息:我等待它報告它已完成,然後刪除該文件。

  2. 它甚至會更好,如果Acrobat Reader軟件打不開,但是這不是一個很大的問題。

編輯:我試圖切換到福昕閱讀器作爲默認PDF閱讀器,現在它不會打開時,我不想要。 ;)

其他可能的解決方案: Cylically檢查文件是否可用(不是由另一個進程使用),當它的可用再刪除它。我怎麼能在Python中做到這一點?

+2

老實說,有沒有知道的東西其實* *打印真正的出路。打印隊列中可能發生100個不同的問題,這些問題永遠不會報告給您。 – 2010-12-17 12:04:02

+0

@Nick Mhm,假設我只需要知道文檔何時發送到打印機。所以我可以把它扔掉。 – bluish 2010-12-17 12:37:35

回答

4

我總算找到了一個很好的解決方案,這要歸功於this answer(也@Lennart提到它的註釋):

install Ghostscript

install GSview(包括gsprint.exe

寫這代碼:

file_path = "C:\\temp\\test.pdf" 
p = subprocess.Popen(["C:\\Ghostgum\\gsview\\gsprint.exe", "-printer", printer_name, "-colour", file_path], 
     stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
stdout, stderr = p.communicate() # waits for the gs process to end 
os.remove(file_path) # now the file can be removed 

沒有Acrobat窗口打開,在打印前沒有刪除文件ing ...煩惱:安裝GS。

參見:gsprint reference

2

而不是硬編碼的文件名和打印,你應該使用tempfile模塊來創建一個臨時文件具有唯一名稱。

import tempfile 
file_name = tempfile.NamedTemporaryFile(suffix=".pdf", delete=False) 

如果需要,可以使用Window的計劃工具運行常規整理腳本來刪除創建的文件。

+0

你是對的,但在我的情況下,選擇一個命令行參數,用戶可以選擇打印或保存文檔。所以我寧願將它保存爲一個文件,如果用戶決定打印並刪除它,請執行此操作。 – bluish 2010-12-17 12:45:43

1

的Adobe Acrobat具有(或至少曾經有)的參數「/噸」,這使得它打開,打印並退出。通過使用它,您可以調用acrobat reader並等待它退出,然後刪除該文件。

未經測試的代碼:

>>> import subprocess 
# You will have to figure out where your Acrobate reader is located, can be found in the registry: 
>>> acrobatexe = "C:\Program Files\Adobe\Acrobat 4.0\Reader\AcroRd32.exe" 
>>> subprocess.call([acrobatexe, "/t", tempfilename, "My Windows Printer Name"]) 
>>> os.unlink(tempfilename) 

類似的東西。

如果你不想雜技演員開放,有開源軟件,這將在命令行打印PDF文件。你可以在你的軟件中加入一個。

+0

謝謝!你說的開源軟件,他們是我可以在我的Python程序中導入的東西嗎?你能建議其中一個嗎? – bluish 2010-12-17 12:48:56

+1

也許不會導入,但至少要打電話。你當然可以用Ghostscript來做,但這是一個非常大的程序,你可能會找到更好的。我不是那個話題的專家。您可以提出另一個問題,或詢問Google。 :) – 2010-12-17 12:57:55

0

爲什麼不使用os.system,它會等到處理完成?

+0

@Jason在哪個方面?我如何指出我從win32api.ShellExecute(...)開始的具體過程? – bluish 2010-12-17 13:44:18

+0

我的意思是,使用os.system(command)來啓動執行打印而不是使用win32api.ShellExecute的進程。它將等待進程完成,然後返回退出代碼。 – JasonFruit 2010-12-17 13:55:13

+0

(我看到我誤解了win32api.ShellExecute。)例如,您可以使用os.system通過Lennart的/ t開關啓動Adobe Reader。 – JasonFruit 2010-12-17 13:58:20