问题描述
|
我正在使用pyPdf将多个PDF文件合并为一个。这很好用,但我还需要向生成的PDF文件中添加目录/大纲/书签。
pyPdf似乎只阅读了对大纲的支持。 Reportlab允许我创建它们,但是开放源代码版本不支持加载PDF文件,因此无法在现有文件中添加轮廓。
有什么方法可以使用Python或任何允许的方法将轮廓添加到现有PDF?
解决方法
我们在WeasyPrint中遇到了类似的问题:cairo生成PDF文件,但不支持书签/轮廓线或超链接。最后,我们咬紧牙关,阅读PDF规范,然后自己完成。
WeasyPrint的pdf.py具有简单的PDF解析器和编写器,可以将PDF \“对象\”添加/覆盖到现有文档中。它使用PDF“更新”机制,并且仅附加在文件末尾。
该模块仅供内部使用,但我愿意对其进行重构以使其更易于在其他项目中使用。
但是,解析器采用了一些快捷方式,无法解析所有有效的PDF文件。如果PyPDF的输出不如cairo的输出好,则可能需要对其进行调整。在模块的文档字符串中:
我们做出一些假设,而不是尝试解析任何有效的PDF。
适用于开罗,以简化代码:
所有换行符都是\'\\ n \',而不是\'\\ r \'或\'\\ r \\ n \'
除了数字0(始终是免费的)外,没有\“ free \”对象。
大多数空格分隔符由单个0x20空格组成。
间接字典对象在行的开头不包含\'>> \',除非标记对象的末尾,后跟\'endobj \'。 (在
换句话说,子字典的\'>> \'标记是缩进的。)
页面树是扁平的:根页面节点的所有子对象都是页面对象,而不是页面树节点。
, 看起来PyPDF2可以胜任。请参阅文档中的“ 0”方法:https://pythonhosted.org/PyPDF2/PdfFileMerger.html