我正在使用pyPdf将多个PDF文件合并为一个。这很好用,但我还需要在生成的PDF文件中添加目录/轮廓/书签。
pyPdf似乎只读取了对轮廓的支持。 Reportlab允许我创建它们,但开源版本不支持加载PDF文件,因此无法在现有文件中添加轮廓。
有没有什么方法可以使用Python或任何允许使用它的库为现有PDF添加轮廓?
答案 0 :(得分:2)
我们在WeasyPrint中遇到了类似的问题:cairo生成PDF文件,但不支持书签/大纲或超链接。最后,我们咬紧牙关,阅读PDF spec,然后自己动手。
WeasyPrint的pdf.py有一个简单的PDF解析器和编写器,可以添加/覆盖PDF"对象"现有文件。它使用PDF"更新"机制,只附加在文件的末尾。
此模块仅供内部使用,但我愿意重构它以便在其他项目中更容易使用。
然而,解析器需要一些快捷方式,无法解析所有有效的PDF文件。如果PyPDF的输出不如cairo那么好,可能需要进行调整。从模块的docstring:
我们不是试图解析任何有效的PDF,而是做出一些假设 保留cairo以简化代码:
- 所有换行都是' \ n'而不是' \ r'或' \ r \ n'
- 除了0号(总是免费的)之外没有"免费"对象。
- 大多数空格分隔符由单个0x20空格组成。
- 间接字典对象不包含'>>'在一行的开头,除了标记对象的结尾,然后是' endobj'。 (在 换句话说,'>>'用于子词典的标记是缩进的。)
- 页面树是扁平的:根页面节点的所有孩子都是页面对象,而不是页面树节点。
答案 1 :(得分:2)
https://github.com/yutayamamoto/pdfoutline 我制作了一个python库,仅用于在现有的PDF文件中添加轮廓。
答案 2 :(得分:0)
看起来PyPDF2可以完成这项工作。请参阅文档中的addBookmark
方法:https://pythonhosted.org/PyPDF2/PdfFileMerger.html