使用Python组合PDF - 组合时关闭PDF文件

时间:2014-07-21 09:32:55

标签: python pdf

我在下面使用将单独的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 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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')