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

jph*_*ude 7 python pdf reportlab pypdf

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

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

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

小智 6

https://github.com/yutayamamoto/pdfoutline 我制作了一个 python 库,只是为了向现有 PDF 文件添加大纲。


Wat*_*oto 5

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


Sim*_*pin 3

我们在WeasyPrint中遇到了类似的问题:cairo 生成 PDF 文件,但不支持书签/大纲或超链接。最后我们硬着头皮,阅读了PDF 规范,然后自己做了。

\n\n

WeasyPrint\xe2\x80\x99s pdf.py有一个简单的 PDF 解析器和编写器,可以将 PDF“对象”添加/覆盖现有文档。它使用 PDF“更新”机制,并且仅附加在文件末尾。

\n\n

该模块仅供内部使用,但我\xe2\x80\x99m愿意重构它,以使其更容易在其他项目中使用。

\n\n

然而,解析器采用了一些快捷方式,无法解析所有有效的 PDF 文件。如果 PyPDF\xe2\x80\x99s 输出不如 cairo\xe2\x80\x99s 那么好,则可能需要进行调整。从 module\xe2\x80\x99s 文档字符串:

\n\n
\n

为了简化代码,我们做出一些适用于 cairo 的假设,而不是尝试解析任何有效的 PDF:

\n\n
    \n
  • 所有换行符均为 \'\\n\',而不是 \'\\r\' 或 \'\\r\\n\'
  • \n
  • 除了数字 0(始终是免费的)之外,没有“免费”对象。
  • \n
  • 大多数空白分隔符由单个 0x20 空格组成。
  • \n
  • 间接字典对象在行的开头不包含“>>”,除非标记对象的结尾,后跟“endobj”。(换句话说,子词典的 \'>>\' 标记是缩进的。)
  • \n
  • 页面树是扁平的:根页面节点的所有子节点都是页面对象,而不是页面树节点。
  • \n
\n
\n