我的任務是將大量的.doc文件轉換爲.pdf。我的主管希望我這樣做的唯一方法是通過MSWord 2010.我知道我應該能夠使用python COM自動化實現自動化。唯一的問題是我不知道如何以及從哪裏開始。我試圖尋找一些教程,但無法找到任何(可能我可能有,但我不知道我在找什麼)。.doc to pdf using python
現在我正在閱讀通過this。不知道這將是多麼有用。
我的任務是將大量的.doc文件轉換爲.pdf。我的主管希望我這樣做的唯一方法是通過MSWord 2010.我知道我應該能夠使用python COM自動化實現自動化。唯一的問題是我不知道如何以及從哪裏開始。我試圖尋找一些教程,但無法找到任何(可能我可能有,但我不知道我在找什麼)。.doc to pdf using python
現在我正在閱讀通過this。不知道這將是多麼有用。
使用comtypes,轉換單個文件一個簡單的例子,輸入和輸出的文件名給出命令行參數:
import sys
import os
import comtypes.client
wdFormatPDF = 17
in_file = os.path.abspath(sys.argv[1])
out_file = os.path.abspath(sys.argv[2])
word = comtypes.client.CreateObject('Word.Application')
doc = word.Documents.Open(in_file)
doc.SaveAs(out_file, FileFormat=wdFormatPDF)
doc.Close()
word.Quit()
也可以使用pywin32,這將是除了同一對:
import win32com.client
然後:
word = win32com.client.Dispatch('Word.Application')
如果您不介意使用PowerShell看看這個Hey, Scripting Guy! article。所提供的代碼可以採用wdFormatPDF
枚舉值WdSaveFormat
(請參閱here)。 This blog article提出了相同想法的不同實現。
我是Linux/Unix用戶,更傾向於Python。但ps腳本看起來很簡單,正是我所期待的。謝謝:) – nik 2011-05-15 21:44:11
我會建議忽略你的主管,並使用OpenOffice,它有一個Python API。 OpenOffice內置了對Python的支持,並且有人爲此創建了一個特定庫(PyODConverter)。
如果他對輸出不滿意,告訴他可能需要幾個星期才能完成。
您應該從調查所謂的虛擬PDF打印驅動程序開始。 只要你找到一個你應該能夠寫入批處理文件,打印您的DOC文件到PDF文件。您可能也可以在Python中執行此操作(設置打印機驅動程序輸出並在MSWord中發出文檔/打印命令,稍後可以使用命令行AFAIR完成)。
它'值得注意的是Stevens回答了工作,但要確保如果使用for循環導出多個文件以將循環前面的ClientObject或Dispatch語句 - 它只需要創建一次 - 請參閱我的問題:Python win32com.client.Dispatch looping through Word documents and export to PDF; fails when next loop occurs
unoconv用python寫)和openoffice作爲無頭守護進程運行。 http://dag.wiee.rs/home-made/unoconv/
適用於doc,docx,ppt,pptx,xls,xlsx。 非常有用,如果你需要轉換文檔或保存/轉換爲服務器上的某些格式
我已經在這個問題上工作了半天,所以我想我應該分享一些我在這個問題上的經驗。史蒂文的回答是正確的,但它會在我的電腦上失敗。有兩個關鍵點需要在此修復:
(1)。第一次創建'Word.Application'對象時,我應該在打開任何文檔之前將它(app這個詞)顯示出來。 (實際上,即使我自己也無法解釋爲什麼這會起作用,如果我不在計算機上這樣做,當我試圖在不可見模型中打開一個文檔時,程序會崩潰,那麼'Word.Application'對象將被刪除OS)。
(2)。做完(1)之後,該程序有時會運行良好,但可能經常失敗。崩潰錯誤"COMError: (-2147418111, 'Call was rejected by callee.', (None, None, None, 0, None))"
意味着COM服務器可能無法很快響應。所以我在嘗試打開文檔之前添加了一段延遲。
做這兩個步驟後,程序將完全無故障工作了。演示代碼如下。如果遇到同樣的問題,請嘗試遵循以下兩個步驟。希望能幫助到你。
import os
import comtypes.client
import time
wdFormatPDF = 17
# absolute path is needed
# be careful about the slash '\', use '\\' or '/' or raw string r"..."
in_file=r'absolute path of input docx file 1'
out_file=r'absolute path of output pdf file 1'
in_file2=r'absolute path of input docx file 2'
out_file2=r'absolute path of outputpdf file 2'
# print out filenames
print in_file
print out_file
print in_file2
print out_file2
# create COM object
word = comtypes.client.CreateObject('Word.Application')
# key point 1: make word visible before open a new document
word.Visible = True
# key point 2: wait for the COM Server to prepare well.
time.sleep(3)
# convert docx file 1 to pdf file 1
doc=word.Documents.Open(in_file) # open docx file 1
doc.SaveAs(out_file, FileFormat=wdFormatPDF) # conversion
doc.Close() # close docx file 1
word.Visible = False
# convert docx file 2 to pdf file 2
doc = word.Documents.Open(in_file2) # open docx file 2
doc.SaveAs(out_file2, FileFormat=wdFormatPDF) # conversion
doc.Close() # close docx file 2
word.Quit() # close Word Application
我試過接受的答案,但並不是特別熱衷於臃腫的PDF文件正在產生,這通常是比預期的數量級更大的數量級。尋找如何使用虛擬PDF打印機時,禁用對話框後,我碰到的BullZip PDF打印機,我已經相當深刻的印象,它的特點。現在它已被我以前使用的其他虛擬打印機取代。你會在他們的下載頁面找到一個「免費社區版」。
可以找到COM API here並且可以找到可用設置的列表here。這些設置被寫入一個「runonce」文件,該文件僅用於一個打印作業,然後自動刪除。在打印多個PDF時,我們需要確保一個打印作業完成後再啓動另一個打印作業,以確保每個文件的設置都正確使用。
import os, re, time, datetime, win32com.client
def print_to_Bullzip(file):
util = win32com.client.Dispatch("Bullzip.PDFUtil")
settings = win32com.client.Dispatch("Bullzip.PDFSettings")
settings.PrinterName = util.DefaultPrinterName # make sure we're controlling the right PDF printer
outputFile = re.sub("\.[^.]+$", ".pdf", file)
statusFile = re.sub("\.[^.]+$", ".status", file)
settings.SetValue("Output", outputFile)
settings.SetValue("ConfirmOverwrite", "no")
settings.SetValue("ShowSaveAS", "never")
settings.SetValue("ShowSettings", "never")
settings.SetValue("ShowPDF", "no")
settings.SetValue("ShowProgress", "no")
settings.SetValue("ShowProgressFinished", "no") # disable balloon tip
settings.SetValue("StatusFile", statusFile) # created after print job
settings.WriteSettings(True) # write settings to the runonce.ini
util.PrintFile(file, util.DefaultPrinterName) # send to Bullzip virtual printer
# wait until print job completes before continuing
# otherwise settings for the next job may not be used
timestamp = datetime.datetime.now()
while((datetime.datetime.now() - timestamp).seconds < 10):
if os.path.exists(statusFile) and os.path.isfile(statusFile):
error = util.ReadIniString(statusFile, "Status", "Errors", '')
if error != "0":
raise IOError("PDF was created with errors")
os.remove(statusFile)
return
time.sleep(0.1)
raise IOError("PDF creation timed out")
這正是我一直在尋找的。謝謝:) – nik 2011-05-17 21:02:18
對於許多文件,考慮設置:'word.Visible = FALSE'救我已經成功地得到了這個詞的文件的時間和處理(MS字不會顯示這種方式,代碼將在後臺運行的本質) – ecoe 2014-04-10 14:09:48
這爲PowerPoint文件工作。使用'Powerpoint.Application','Presentations.Open'和'FileFormat = 32'。 – Snorfalorpagus 2015-03-25 13:39:22