在Python中为现有PDF创建轮廓/ TOC

时间:2011-05-27 20:38:12

标签: python pdf reportlab pypdf

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

pyPdf似乎只读取了对轮廓的支持。 Reportlab允许我创建它们,但开源版本不支持加载PDF文件,因此无法在现有文件中添加轮廓。

有没有什么方法可以使用Python或任何允许使用它的库为现有PDF添加轮廓?

3 个答案:

答案 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