【问题标题】:Merging PDF's with python pypdf and deleting merged files将 PDF 与 python pypdf 合并并删除合并的文件
【发布时间】:2013-09-27 04:18:34
【问题描述】:

我正在尝试在 python 中编写一个程序,该程序获取一个 PDF 文件并首先将任何包含水果名称的 pdf 附加到它(芒果、橙子或苹果),然后在 pdf 中附加名称动物到原始文件(斑马,猴子,狗),最后附加任何剩余的PDF。这是我的代码:

import os
from PyPDF2 import PdfFileReader, PdfFileMerger

originalFile="C:/originalFile.pdf"

merger = PdfFileMerger()
merger.append(PdfFileReader(file(originalFile, 'rb')))
os.remove(originalFile)

for filename in os.listdir('C:/'):
    if "Mango" in filename or "Apple" in filename or "Orange" in filename:
        if ".pdf" in filename:
            merger.append(PdfFileReader(file('C:/'+filename, 'rb')))
            os.remove("C:/"+filename)

for filename in os.listdir('C:/'):
    if "Zebra" in filename or "Monkey" in filename or "Dog" in filename:
        if ".pdf" in filename:
            merger.append(PdfFileReader(file('C:/'+filename, 'rb')))
            os.remove("C:/"+filename)

for filename in os.listdir('C:/'):
    if ".pdf" in filename:
        merger.append(PdfFileReader(file('C:/TRIAL/'+filename, 'rb')))
        os.remove("C:/TRIAL/"+filename)

merger.write(originalFile)

当我运行这个程序时,我得到以下错误:

os.remove(原始文件) WindowsError: [错误 32] 进程无法访问该文件,因为它正被另一个进程使用:'C:/originalFile.pdf'

谁能解释我将文件添加到合并文件后如何关闭它?

【问题讨论】:

    标签: python pdf merge pypdf


    【解决方案1】:

    您应该明确关闭文件。

    fd = file('C:/'+filename, 'rb')
    merger.append(PdfFileReader(fd))
    fd.close()
    os.remove('C:/'+filename)
    

    更安全的版本:

    fd = None
    try:
        fd = file('C:/'+filename, 'rb')
        merger.append(PdfFileReader(fd))
    finally:
        if fd: fd.close()
    if os.path.exists('C:/'+filename): os.remove('C:/'+filename)
    

    在 Python 2.5+ 中可以简化为:

    with file('C:/'+filename, 'rb') as fd:
        merger.append(PdfFileReader(fd))
    if os.path.exists('C:/'+filename): os.remove('C:/'+filename)
    

    这会导致python自动关闭文件。

    【讨论】:

      【解决方案2】:

      要关闭文件,您应该使用with 语句打开它,无论with 块内的代码发生什么,它都会关闭文件:

      with open(originalFile,'rb') as pdf:
          merger.append(PdfFileReader(pdf))
      os.remove(originalFile)
      

      这对我有用。

      提醒一下,您可以关闭文件,因为您已将 pdf 添加到 merger。请注意,如果您只是使用PdfFileReader(pdf) 打开它并且没有对其执行任何操作,则无法删除该文件或PdfFileReader 对象将无法读取该文件。这是因为PdfFileReader 仅在您调用诸如getPage 之类的读取方法时才会真正读取文件

      【讨论】:

        【解决方案3】:

        Become original 文件已打开,因此在关闭文件之前无法删除该文件。 你需要像这样修改你的代码:

        merger = PdfFileMerger()
        fin = file(originalFile, 'rb')
        merger.append(PdfFileReader(fin))
        fin.close()
        os.remove(originalFile)
        

        【讨论】:

          【解决方案4】:

          PyPDF 合并现在在版本 1.26.0 中具有关闭方法

          close()

          关闭所有文件描述符(输入和输出)并清除所有内存使用。

          https://pythonhosted.org/PyPDF2/PdfFileMerger.html

          【讨论】:

            【解决方案5】:

            Pdf 合并在 python 中并不难。我看到您已经在使用 PdfFileMerger。只要 pdf 文件存在,并且派生 python 进程的用户有权访问正在合并的 pdf,这应该可以工作。祝你好运。

            【讨论】:

            • 你没有回答问题。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-06-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-28
            相关资源
            最近更新 更多