2012-03-13 104 views
3

我有報告說我正在發送到需要報告爲可讀PDF格式的系統。我嘗試了所有免費的圖書館和應用程序,而我發現的唯一工作是Adobe的acrobat系列。使用Python,win32api和Acrobat Reader打印PDF文件9

我在python中編寫了一個快速腳本,它使用win32api以默認註冊應用程序(Acrobat Reader 9)將PDF打印到我的打印機,然後在完成後終止任務,因爲acrobat喜歡在從命令行。

予編譯成一個可執行與通過命令行 中的值傳遞(例如printer.exe%OUTFILE%%PRINTER%),這是一個隨後批處理文件

import os,sys,win32api,win32print,time 

# Command Line Arguments. 
pdf = sys.argv[1] 
tempprinter = sys.argv[2] 

# Get Current Default Printer. 
currentprinter = win32print.GetDefaultPrinter() 
# Set Default printer to printer passed through command line. 
win32print.SetDefaultPrinter(tempprinter) 
# Print PDF using default application, AcroRd32.exe 
win32api.ShellExecute(0, "print", pdf, None, ".", 0) 
# Reset Default Printer to saved value 
win32print.SetDefaultPrinter(currentprinter) 
# Timer for application close 
time.sleep(2) 
# Kill application and exit scipt 
os.system("taskkill /im AcroRd32.exe /f") 

這似乎內調用在3-4小時內爲大量工作〜2000份報告,但我有一些下降,我不知道腳本是否被壓倒,或者如果我應該看看多線程或其他東西。

事實上,它處理如此大量的數據而沒有丟棄,這讓我相信問題不在於腳本,但我不確定它是否與主機系統或Adobe Reader或其他問題有關。

任何建議或意見將不勝感激。

+1

'win32api.ShellExecute()'是否同步?即是否等到AcrobatReader完成打印? – 2012-03-13 16:34:09

+0

根據文檔我不這麼認爲,這就是爲什麼我設置計時器,我總是可以擴展時間範圍。我考慮了產卵過程,以便我可以知道應用程序何時結束。問題是我不知道打印作業何時在打印機上實際打印。它的變量取決於網絡流量,打印命令需要處理多長時間。 – dwtorres 2012-03-13 21:29:08

+0

我對你的第一句話有點困惑;什麼不適用於「免費圖書館和應用程序」?打印的PDF是不可讀的,還是根本沒有打印,或者它們是否無法創建正確的PDF? – 2012-03-14 08:32:54

回答

2

根據您的意見(win32api.ShellExecute()可能是而不是同步),您的問題是超時:如果您的計算機或打印隊列繁忙,kill命令可能會過早。

如果您的腳本同時運行(即,您一次打印所有文檔而不是一個接一個地打印),kill命令甚至可以殺死錯誤的進程(即由另一個腳本調用啓動的acrobat進程)。

所以你需要它更好的同步。有一對夫婦的事情,你可以嘗試:

  1. 轉換成一次啓動Acrobat中的服務器腳本本,然後將許多打印命令相同的過程和事後終止。

  2. 使用全局鎖定來確保只有一個腳本正在運行。我建議在某處創建一個文件夾;這是對每個文件系統的原子操作。如果該文件夾存在,該腳本在某處處於活動狀態。

最重要的是,您需要知道作業何時完成。爲此使用win32print.EnumJobs()

如果失敗了,另一個解決方案可能是在某處安裝Linux服務器。您可以在此框上運行Python服務器,該服務器接受您在客戶端計算機上藉助於小型Python腳本發送的打印作業。然後服務器可以在後臺打印PDF文件。

此方法允許您添加任何類型的監控(如果發生故障,發送郵件或在所有作業完成後發送狀態郵件)。

相關問題