【问题标题】:Merging PDF's with PyPDF2 with inputs based on file iterator使用基于文件迭代器的输入将 PDF 与 PyPDF2 合并
【发布时间】:2016-03-13 17:11:18
【问题描述】:

我有两个文件名相同的 PDF 文件夹。我想遍历第一个文件夹,获取文件名的前 3 个字符,将其设为“当前”页面名称,然后使用该值从两个文件夹中获取 2 个相应的 PDF,合并它们,并将它们写入第三个文件夹。

下面的脚本在第一次迭代中按预期工作,但在那之后,后续合并的 PDF 包括所有以前的 PDF(在 8 次迭代中迅速膨胀到 72 页)。

其中一些可能是由于代码不佳,但我不知道那在哪里,或者如何清除可能导致每次迭代仅写入 2 页失败的输入/输出:

import os
from PyPDF2 import PdfFileMerger
merger = PdfFileMerger()

rootdir = 'D:/Python/Scatterplots/BoundaryEnrollmentPatternMap'

for subdir, dirs, files in os.walk(rootdir):
    for currentPDF in files:
        #print os.path.join(file[0:3])
        pagename = os.path.join(currentPDF[0:3])
        print "pagename is: " + pagename
        print "File is: " + pagename + ".pdf"
        input1temp = 'D:/Python/Scatterplots/BoundaryEnrollmentPatternMap/' + pagename + '.pdf'
        input2temp = 'D:/Python/Scatterplots/TraditionalScatter/' + pagename + '.pdf'
        input1 = open(input1temp, "rb")
        input2 = open(input2temp, "rb")
        merger.append(fileobj=input1, pages=(0,1))
        merger.append(fileobj=input2, pages=(0,1))
        outputfile = 'D:/Python/Scatterplots/CombinedMaps/Sch_' + pagename + '.pdf'

        print merger.inputs

        output = open(outputfile, "wb")
        merger.write(output)
        output.close()

        #clear all inputs - necessary?
        outputfile = []
        output = []
        merger.inputs = []
        input1temp = []
        input2temp = []
        input1 = []
        input2 = []

print "done"

我的代码/工作基于此示例:

https://github.com/mstamy2/PyPDF2/blob/master/Sample_Code/basic_merging.py

【问题讨论】:

    标签: python pdf pdf-generation pypdf


    【解决方案1】:

    我认为错误在于merger 在循环之前被初始化并且它会累积所有文档。尝试将行 merger = PdfFileMerger() 移动到循环体中。 merger.inputs = [] 在这种情况下似乎没有帮助。

    关于您的代码有几点说明:

    • input1 = [] 不关闭文件。这将导致许多文件被程序打开。你应该打电话给input1.close()

    • [] 表示一个空数组。如果变量不应包含任何有意义的值,最好使用 None。

    • 要删除变量(例如output),请使用del output

    • 毕竟,没有必要清除所有变量。它们将被垃圾收集器释放。

    • 使用os.path.join 创建 input1temp 和 input2temp。

    【讨论】:

    • 哇,这很容易 - 正如你所建议的,我将 merge = PdfFileMerger() 移动到循环和宾果游戏中!一切看起来都很棒!我会用细齿梳子梳理输出,但这太棒了,非常感谢!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多