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