【问题标题】:Using Python to combine PDFs - Closing PDF files when they are combined使用 Python 合并 PDF - 合并时关闭 PDF 文件
【发布时间】:2021-05-17 08:49:49
【问题描述】:

我在下面使用将单独的 PDF 文件合并为一个 PDF。

它可以正常工作,但要打开所有 PDF。脚本结束时如何关闭涉及的 PDF 文件(即 aaa、bbb、ccc 和 abc 4 个文件)?

比如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"))

问题是当我试图删除文件时,弹出窗口:

操作无法完成,因为文件是在 pythonw 中打开的

(我使用的是 Python 2.76,因此将 Robᵩ 的第一次尝试中的行更改为 inputFile.close())。

【问题讨论】:

  • 我建议阅读Python tutorial on reading and writing files,尤其是该部分的最后一个代码块。
  • @Mark,是什么让你相信它会让文件保持打开状态?
  • @Robᵩ,因为当我试图删除文件时,系统弹出“操作无法完成,因为文件是在pythonw中打开的”

标签: python pdf


【解决方案1】:

所有文件在脚本完成执行时自动关闭。如果您想在脚本结束前关闭它们,请调用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)

【讨论】:

  • 感谢 Robᵩ。但问题仍然存在。我尝试了第一次尝试,它工作正常但(在 Windows 中)我仍然无法删除文件夹中的文件。对于第 2 次和第 3 次尝试,它会给出错误“对已关闭文件的 I/O 操作”,问题在于“output.write”。能否请你帮忙?谢谢。
【解决方案2】:

从这里学习,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(file_folder + filename)

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

【讨论】:

  • merger.append(PdfFileReader(file(filename, 'rb'))) 出现错误,rb 是什么意思?我怎样才能解决这个问题?我的设置与您的代码类似。
  • 这是将每个页面附加到合并的行。上面的线条非常简单。也许您也可以在下面尝试 Rob 的答案?
  • '文件'没有定义?
  • @Andrew Clark,我已经更新了答案。顺便说一句,循环文件夹中的文件可能有助于避免 PdfReadWarnings。
猜你喜欢
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 2018-02-07
  • 2016-10-02
  • 1970-01-01
相关资源
最近更新 更多