2014-07-21 194 views
0

我正在使用下面的方式將單獨的PDF文件合併到一個PDF中。使用Python組合PDF - 合併PDF文件時合併

它工作正常,但留下所有PDF打開。如何在腳本結束時關閉涉及的PDF文件(即4個文件,包括aaa,bbb,ccc和abc)?

f.clos()但我不知道如何在這裏插入。

from pyPdf import PdfFileWriter, PdfFileReader 

def append_pdf(input,output): 
    [output.addPage(input.getPage(page_num)) for page_num in range(input.numPages)] 

output = PdfFileWriter() 

append_pdf(PdfFileReader(file("C:\\aaa.pdf","rb")),output) 
append_pdf(PdfFileReader(file("c:\\bbb.pdf","rb")),output) 
append_pdf(PdfFileReader(file("c:\\ccc.pdf","rb")),output) 

output.write(file("c:\\abc.pdf ","wb")) 

的問題是,當我試圖刪除文件時,Windows會彈出:

動作不能完成,因爲文件是pythonw開放

(我正在使用Python 2.76,因此將Robᵩ的第一次嘗試中的行改爲inputFile.close())。

+2

我建議您閱讀[Python的教程上讀取和寫入文件(https://docs.python.org/3.4/tutorial/inputoutput.html#reading-and-writing-files),特別是最後代碼塊在部分。 – Blender

+0

@Mark,是什麼讓你相信它將文件打開? –

+0

@Robᵩ,因爲當我試圖刪除這些文件時,系統彈出「該動作無法完成,因爲這些文件在pythonw中打開」 –

回答

0

從這裏瞭解到,pypdf Merging multiple pdf files into one pdf

使用PyPDF2可以達到同樣的目標發現,並且無法刪除的文件的問題再次得到解決。

from PyPDF2 import PdfFileMerger, PdfFileReader 

merger = PdfFileMerger() 

filenames = ['c:\\11.pdf', 'c:\\22.pdf', 'c:\\33.pdf'] 

for filename in filenames: 
    merger.append(PdfFileReader(file(filename, 'rb'))) 
    merger.write('c:\\123.pdf') 
0

腳本結束執行時,所有文件都會自動關閉。如果您想在腳本結束前關閉它們,請致電file.close()函數。這裏有一種方法:

# UNTESTED 
for fname in 'c:/aaa.pdf', 'c:/bbb.pdf', 'c:/ccc.pdf': 
    inputFile = open(fname, 'rb') 
    append_pdf(PdfFileReader(inputFile), output) 
    close(inputFile) 

正如你所看到的,每個輸入文件在使用後立即關閉。但是,這確實會導致一個問題:如果PdfFileRead()append_pdf()要拋出異常,則永遠不會調用close()。爲了解決這個問題,我們使用一個上下文管理器:

# UNTESTED 
for fname in 'c:/aaa.pdf', 'c:/bbb.pdf', 'c:/ccc.pdf': 
    with open(fname, 'rb') as inputFile: 
     append_pdf(PdfFileReader(inputFile), output) 

每個文件將被關閉的with塊退出時。

同樣輸出文件:

# UNTESTED 
with open('c:/abc.pdf', 'wb') as outputFile: 
    output.write(outputFile) 
+0

感謝Robᵩ。但問題仍然存在。我嘗試了第一次嘗試,它工作正常,但(在Windows中)我仍然無法刪除文件夾中的文件。對於第二次和第三次嘗試,它會給出一個錯誤「關閉文件上的I/O操作」,問題在於「output.write」。能否請你幫忙?謝謝。 –