PyPDF2 PDF格式

2023-03-30 16:00 更新

建议查看 PDF 规范以获取详细信息和说明。这只是为了对格式进行非常粗略的概述。

总体结构

PDF 包括:

  1. 标头:包含 PDF 的版本,例如%PDF-1.7

  2. 主体:包含一系列间接对象

  3. 交叉引用表 (xref):包含正文中间接对象的列表

  4. 预告片

外部参照表

交叉引用表 (xref) 是正文中间接对象的表。它允许通过指向它们在文件中的位置来快速访问这些对象。

它看起来像这样:

xref 42 5
0000001000 65535 f
0000001234 00000 n
0000001987 00000 n
0000011987 00000 n
0000031987 00000 n

让我们逐步了解它:

  • xref只是一个指定外部参照表开始的关键字。

  • 42是此外部参照部分中第一个对象的数字 ID;5是外部参照表中的条目数。

  • 现在每个对象都有 3 个条目:10 位字节偏移量、5 位生成编号和一个or 的文字关键字。nnnnnnnnnn ggggg nnf

    • nnnnnnnnnn是对象的字节偏移量。它告诉读者对象在文件中的位置。

    • ggggg是代号。它告诉读者对象的年龄。

    • n表示该对象是一个正常使用中的对象,f表示该对象是一个自由对象。

      • 第一个空闲对象的世代号始终为 65535。它构成了所有空闲对象的链表的头部。

      • 普通对象的世代号始终为 0。世代号允许 PDF 格式包含同一对象的多个版本。这是一个版本历史机制。

身体

主体是一系列间接对象:

counter generationnumber << the_object >> endobj

  • counter(整数)是对象的唯一标识符。

  • generationnumber(整数)是对象的代号。

  • the_object是对象本身。它可以是空的。/Keyword以指定它是哪种对象开始。

  • endobj标记对象的结束。

可以在以下位置找到一个具体示例test_reader.py::test_get_images_raw

1 0 obj << /Count 1 /Kids [4 0 R] /Type /Pages >> endobj
2 0 obj << >> endobj
3 0 obj << >> endobj
4 0 obj << /Contents 3 0 R /CropBox [0.0 0.0 2550.0 3508.0]
 /MediaBox [0.0 0.0 2550.0 3508.0] /Parent 1 0 R
 /Resources << /Font << >> >>
 /Rotate 0 /Type /Page >> endobj
5 0 obj << /Pages 1 0 R /Type /Catalog >> endobj

预告片

预告片看起来像这样:

trailer << /Root 5 0 R
           /Size 6
        >>
startxref 1234
%%EOF

让我们来看看它:

  • trailer <<表示尾部词典开始。它以 . 结尾>>

  • startxref是一个关键字,后跟关键字的字节位置xref。由于预告片始终位于文件底部,因此读者可以快速找到外部参照表。

  • %%EOF是文件结束标记。

trailer 字典是一个键值列表。键在 PDF 参考 1.7 的表 3.13 中指定,例如/Root/Size(两者都是必需的)。

  • /Root(字典)包含文档目录。

    • The5是目录字典的对象编号

    • 0是目录字典的世代号

    • R是指示该对象是对目录字典的引用的关键字。

  • /Size(整数)包含文件外部参照表中的条目总数。

阅读PDF文件

大多数 PDF 文件都是压缩的。如果你想阅读它们,首先解压它们:

pdftk crazyones.pdf output crazyones-uncomp.pdf uncompress

然后重命名crazyones-uncomp.pdfcrazyones-uncomp.txt并在我们最喜欢的 IDE / 文本编辑器中打开它。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号