在Python中为现有PDF创建大纲/TOC

在Python中为现有PDF创建大纲/TOC,python,pdf,reportlab,pypdf,Python,Pdf,Reportlab,Pypdf,我正在使用pyPdf将多个PDF文件合并为一个。这很好,但是我还需要在生成的PDF文件中添加一个目录/大纲/书签 pyPdf似乎只支持阅读大纲。Reportlab允许我创建它们,但开源版本不支持加载PDF文件,因此无法将大纲添加到现有文件中 是否有任何方法可以使用Python或任何允许使用Python的库向现有PDF添加大纲?我们在中遇到了类似的问题:cairo生成PDF文件,但不支持书签/大纲或超链接。最后,我们咬紧牙关,读了这本书,自己动手做了 WeasyPrint有一个简单的PDF解析器和

我正在使用pyPdf将多个PDF文件合并为一个。这很好,但是我还需要在生成的PDF文件中添加一个目录/大纲/书签

pyPdf似乎只支持阅读大纲。Reportlab允许我创建它们,但开源版本不支持加载PDF文件,因此无法将大纲添加到现有文件中


是否有任何方法可以使用Python或任何允许使用Python的库向现有PDF添加大纲?

我们在中遇到了类似的问题:cairo生成PDF文件,但不支持书签/大纲或超链接。最后,我们咬紧牙关,读了这本书,自己动手做了

WeasyPrint有一个简单的PDF解析器和编写器,可以向现有文档添加/覆盖PDF“对象”。它使用PDF“更新”机制,只在文件末尾追加

这个模块只供内部使用,但我愿意对其进行重构,使其更易于在其他项目中使用

但是,解析器采用了一些快捷方式,无法解析所有有效的PDF文件。如果PyPDF的输出没有cairo的好,可能需要对其进行调整。从模块的docstring:

我们没有试图解析任何有效的PDF,而是做了一些假设 为了简化代码,cairo采用了以下方法:

  • 所有换行符都是“\n”,而不是“\r”或“\r\n”
  • 除了数字0(总是自由的)之外,没有“自由”对象
  • 大多数空白分隔符由单个0x20空格组成
  • 间接字典对象在行首不包含“>>”,但用于标记对象的结尾,后跟“endobj”。(在 其他单词,子字典的“>>”标记缩进。)
  • 页面树是平面的:根页面节点的所有子节点都是页面对象,而不是页面树节点

看起来PyPDF2可以完成这项工作。请参阅文档中的
addBookmark
方法:


我制作了一个python库,只是为了向现有的PDF文件中添加大纲。

我想至少有非python的解决方案,这样您就可以创建PDF,然后运行一个带有一些选项的命令来指定大纲的内容。不太好,但它至少应该能让你完成工作。这可能对你有用,也可能不管用,但是请尝试pdfrecycle声称支持索引和书签生成。