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

1 投票
2 回答
1703 浏览
提问于 2025-04-18 14:05

我正在使用下面的方法把几个单独的PDF文件合并成一个PDF文件。

这个方法运行得很好,但合并后所有的PDF文件都还保持打开状态。我想知道在脚本结束时,如何关闭这些PDF文件(比如说有四个文件,包括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

所有的文件在脚本执行完毕后会自动关闭。如果你想在脚本结束之前就关闭它们,可以调用 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

我在这里学到的,pypdf合并多个PDF文件为一个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(file_folder + filename)

merger.write('c:\\123.pdf')

撰写回答