0

我有一个 pyPdf 应用程序,将一堆 PDF 组合成一个 PDF,并使用外部元数据正确构建目录。它对某些 PDF 非常有效,但对于其他 PDF,它似乎挂起并且从未真正编写过 PDF。我将写操作复制到测试库中,以查看它挂在哪里,它似乎挂在方法“_sweepIndirectReferences”(此处为第 311 行)中。我可以设置它运行,15-20 分钟后返回并设置断点以发现它仍在解析第一页上的间接引用,堆栈深度为 25-30。如果我使用 Acrobat 合并文件,它会在一分钟内完成所有 200 多页。

我不需要我的写操作那么快,但是我可以做些什么来加快这个过程吗?似乎 Adob​​e 可以在一分钟内完成的事情,我应该能够在不到 4 小时内完成!我应该注意,它只发生在某些文件上,而不发生在其他文件上。我的猜测是,取决于 PDF 对间接引用的依赖程度会有所不同。

作为参考,我正在生成这样的pdf:

opened_pdfs = []
o_pdf = PdfFileWriter()

for fname in list_of_pdfs:
    i_pdf = PdfFileReader(file(fname, 'rb'))
    opened_pdfs.append(i_pdf)

    for page in i_pdf.pages:
        o_pdf.addPage(page)

of = open(file_name, 'wb')
o_pdf.write(of)
of.close()

for pdf in opened_pdfs:
    pdfs.stream.close()

这忽略了关于书签的部分,但我认为这可能很好。有问题的没有更多的书签或任何东西。

4

1 回答 1

3

我没有答案,但我可能有一个解决方法:将工作分解为多个部分,然后将这些部分组合起来。这适用于我遇到的问题,可能与您的问题相同,我没有足够的调试来找出答案。此外,您可能会查看声称是 pypdf 超集的 PyPDF2,并查看它们是否更改了您看到的卡住的代码。

我使用 pypdf 编写了一个一次性脚本,将大约 160 个单页 pdf 拼接在一起,这些单页 pdf 由一位亲爱的八十多岁的老人创建,他将回忆录的每一页放在一个单独的文件中。

回忆录大约有 50% 是图片,pdf 的文件大小从 73kB 到 2.5MB 不等。pypdf 代码的症结几乎直接来自文档:

for pdf_in in pdf_list:
    try:
        pdf = PdfFileReader(file(pdf_in, "rb"))
    except IOError:
        print "skipping ", pdf_in
        continue
    num_pages = pdf.getNumPages()
    if list_only:
        print pdf_in, ':', num_pages
    else:
        for i in range(num_pages):
            output.addPage(pdf.getPage(i))
        output.write(outputStream)
    total_pages += num_pages

当文件稍微少一点时,我成功地运行了脚本,它可能需要几个小时。它产生了一个 5GB 的 pdf!

这个周末我更新了一些文件(作者更正)并尝试再次运行它。巧合的是(?)我的 macbookpro 冻结了,在我重新启动后,我有一个不完整的 2.9GB pdf。

所以我添加了这段代码并一次运行 seglen=35 个文件。

if seglen:
    segments = len(pdf_list) / seglen + 1
    seglist = []
    for i in range(segments):
        outfile = kwargs['output_file'] + str(i)
        seglist.append(outfile + '.pdf')
        merge_files_in_order(pdf_list[i*seglen:(i+1)*seglen], kwargs['list_only'], outfile)
    # now stich the segments together
    merge_files_in_order(seglist, kwargs['list_only'], kwargs['output_file'])
else:
    merge_files_in_order(pdf_list, kwargs['list_only'], kwargs['output_file'])

这运行的时间要少得多,而且奇怪的是,生成了一个完整的 288MB 文件,而不是不完整的 2.9GB 文件(或者像我一个月前创建的那样的 5GB 文件)。

也很有趣:我不清理“段”文件,所以我也可以看到它们。它们的大小从 195MB 到 416MB 不等,但当最后将所有五个文件合并时,生成的文件是完整的,只有 288MB!我很开心。

于 2012-11-25T00:23:53.547 回答