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 n
n
f
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
(字典)包含文档目录。The
5
是目录字典的对象编号0
是目录字典的世代号R
是指示该对象是对目录字典的引用的关键字。
/Size
(整数)包含文件外部参照表中的条目总数。
阅读PDF文件
大多数 PDF 文件都是压缩的。如果你想阅读它们,首先解压它们:
pdftk crazyones.pdf output crazyones-uncomp.pdf uncompress
然后重命名crazyones-uncomp.pdf
为crazyones-uncomp.txt
并在我们最喜欢的 IDE / 文本编辑器中打开它。
更多建议: