PyPDF2 PDF格式
建议查看 PDF 规范以获取详细信息和说明。这只是为了对格式进行非常粗略的概述。
总体结构
PDF 包括:
标头:包含 PDF 的版本,例如
%PDF-1.7主体:包含一系列间接对象
交叉引用表 (xref):包含正文中间接对象的列表
预告片
外部参照表
交叉引用表 (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 nnfnnnnnnnnnn是对象的字节偏移量。它告诉读者对象在文件中的位置。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(字典)包含文档目录。The
5是目录字典的对象编号0是目录字典的世代号R是指示该对象是对目录字典的引用的关键字。
/Size(整数)包含文件外部参照表中的条目总数。
阅读PDF文件
大多数 PDF 文件都是压缩的。如果你想阅读它们,首先解压它们:
pdftk crazyones.pdf output crazyones-uncomp.pdf uncompress
然后重命名crazyones-uncomp.pdf为crazyones-uncomp.txt并在我们最喜欢的 IDE / 文本编辑器中打开它。