我有一个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()
这忽略了有关书签的部分,但我认为这很好。有问题的人没有更多的书签或任何东西。
答案 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!我很开心。