2014-07-21 150 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”。能否请你帮忙?谢谢。 –