将PDF与python pypdf合并并删除合并文件

时间:2013-09-27 04:18:35

标签: python pdf merge pypdf

我正在尝试在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(originalFile) WindowsError:[错误32]进程无法访问该文件,因为它正由另一个进程使用:'C:/originalFile.pdf'

在我将文件添加到合并文件后,有人能解释我如何关闭文件吗?

5 个答案:

答案 0 :(得分:2)

您应该明确关闭文件。

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自动关闭文件。

答案 1 :(得分:2)

要关闭文件,您应该使用with语句打开它,该语句始终关闭with块内代码发生的任何文件:

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

这适合我。

提醒您,您可以关闭该文件,因为您已将pdf添加到merger。请注意,如果您只是使用PdfFileReader(pdf)打开它并且没有对其执行任何操作,则无法删除该文件,或者PdfFileReader对象将无法读取该文件。这是因为如果你在PdfFileReader上调用一些读取方法,getPage实际上只读取文件

答案 2 :(得分:0)

成为originalFile已打开,因此,在关闭文件之前无法删除该文件。 您需要像这样修改代码:

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

答案 3 :(得分:0)

PyPDF合并现在从1.26.0版本开始具有关闭方法

  

关闭()

     

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

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

答案 4 :(得分:-1)

Pdf合并在python中并不那么难。我看到你已经在使用PdfFileMerger了。只要pdf文件存在,这应该有效,并且分叉python进程的用户有权访问正在合并的pdf。祝你好运。