我们在WeasyPrint中遇到了类似的问题:cairo 生成 PDF 文件,但不支持书签/大纲或超链接。最后我们硬着头皮,阅读了PDF 规范,然后自己做了。
\n\nWeasyPrint\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\n为了简化代码,我们做出一些适用于 cairo 的假设,而不是尝试解析任何有效的 PDF:
\n\n\n
\n- 所有换行符均为 \'\\n\',而不是 \'\\r\' 或 \'\\r\\n\'
\n- 除了数字 0(始终是免费的)之外,没有“免费”对象。
\n- 大多数空白分隔符由单个 0x20 空格组成。
\n- 间接字典对象在行的开头不包含“>>”,除非标记对象的结尾,后跟“endobj”。(换句话说,子词典的 \'>>\' 标记是缩进的。)
\n- 页面树是扁平的:根页面节点的所有子节点都是页面对象,而不是页面树节点。
\n