pypdf 如何解析 PDF 文件

pypdf 使用 PdfReader 来解析 PDF 文件。方法 PdfReader.read 展示了解析的基本结构:

  1. 查找并读取交叉引用表 (xref) 和尾部 (trailer)
    交叉引用表 (xref table) 是一个包含字节偏移量的表,用于指示文件中对象的位置。尾部 (trailer) 提供了附加信息,例如根对象 (Catalog) 和包含元数据的 Info 对象。

  2. 解析对象
    在定位到 xref 表和尾部之后,pypdf 继续解析 PDF 中的对象。PDF 中的对象可以是多种类型,例如字典 (dictionaries)、数组 (arrays)、流 (streams) 和简单数据类型(如整数、字符串)。pypdf 解析这些对象并将其存储在 PdfReader.resolved_objects 中,并通过 cache_indirect_object 进行填充。

  3. 解码内容流
    PDF 的内容通常存储在内容流中,这些流是 PDF 操作符和操作数的序列。pypdf 通过应用流字典中指定的过滤器(例如 FlateDecodeLZWDecode)来解码这些内容流。仅当对象通过 PdfReader.get_object 请求时,才会进行此解码,该方法使用 PdfReader._get_object_from_stream 方法。


参考资料

PDF 1.7 规范

  • 7.5 文件结构

  • 7.5.4 交叉引用表

  • 7.8 内容流和资源