pyPdf:加快写/合并操作?

时间:2012-10-04 20:57:15

标签: python pypdf

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

我不需要我的写操作快,但我能做些什么来加快这个过程?似乎Adobe可以在不到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()

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

1 个答案:

答案 0 :(得分:3)

我没有答案,但我可能有一个解决方法:将工作分成几段,然后合并段。这对我遇到的问题起了作用,可能和你的问题一样,我没有调试它以找出答案。另外,你可能会看看PyPDF2,它声称是pypdf的超集,看看它们是否改变了你看到卡住的代码。

我用pypdf写了一个一次性的脚本,一起写了160个单页pdf,由一位亲爱的八十多岁的人创建,他把他的回忆录的每一页放在一个单独的文件中。

回忆录约50%的图片,pdfs的文件大小从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!

本周末我更新了一些文件(作者更正),并试图再次运行它。 Coincendentally(?)我的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!我很开心。