数据恢复(七)-PDF文件结构分析
PDF(Portable Document Format)文件是一种用于文档传输和显示的文件格式,也是结构性的文件。通过本文的分析,可以清楚PDF的文件结构和对象寻址原理,对于PDF的文件修复思路也能有自己的见解。
PDF文件结构
PDF文件的结构主要包括以下4个部分:
- 文件头:
PDF文件的开头包含一个文件头,它标识了文件的类型和版本信息。 - 对象:
PDF文件中的所有内容都被表示为对象,这些对象可以是文本、图像、矢量图形等。每个对象都有一个唯一的编号,以及一些描述该对象的信息。 - 交叉引用表(xref):
PDF文件通常包含一个交叉引用表,它记录了PDF文件中所有对象的位置和编号。这些对象包括页面、字体、图片等。 - 文件尾(trailer):
包括文件大小、根对象的编号等信息。startxref 指向交叉引用表的位置,文件结束符 “%%EOF”。
PDF文件读取过程分析
PDF阅读器读取渲染显示PDF文件,有如下过程。
PDF内容详解
PDF文件头
PDF文件的开头所包含的几个字节,用于标识这个文件的类型和版本。PDF文件头的格式是:%PDF-1.x,其中x代表版本号。
上图是“%PDF-1.0”,说明该文件是一个PDF版本1.0的文档。
PDF对象obj
对象obj是pdf文件的主体内容。上面选中的部分是第一个完整的obj,注意obj开头的偏移地址为21。
1 0 obj << /Length 44 >> stream q 595.80 0 0 842.40 0.00 0.00 cm /Im33 Do Q endstream endobj
对上图中所有的obj各个字段进行解释。
1 0 obj
– 对象编号及版本号<< >>
– 对象属性字典的开始和结束标记/Length 44
– 图像数据的长度,单位为字节stream
– 图像数据流的开始标记q
– 图形状态保存命令,保存当前的图形状态,方便后续恢复/Im33 Do
– 在当前位置插入名称为”Im33″的图像资源Q
– 图形状态还原命令,恢复之前保存的图形状态endstream
– 图像数据流的结束标记endobj
– 对象定义的结束标记
PDF交叉引用表xref
交叉引用表xref位于文件尾部,所有obj结束后就是xref。注意xref的偏移地址为7990754。可以搜索xref快速定位交叉引用表的位置。
xref 0 1 0000000000 65535 f 1 1 0000000021 00000 n 2 1 0000000118 00000 n
每个字段的含义解释:
xref
– 交叉引用表的开始标记0
– 第一个对象的编号1
– 对象的数量0000000000 65535 f
– 第一个对象的描述,其中:0000000000
– 第一个对象在文件中的偏移量65535
– 对象的生成号,因为此处是”f”,所以表示这个对象是一个自由对象(free object),即已被删除的对象,可以被其他新对象重复使用
1 1
– 第二个对象的编号和数量0000000021 00000 n
– 第二个对象的描述,其中:0000000021
– 第二个对象在文件中的偏移量00000
– 对象的生成号n
– 表示这个对象是一个普通对象(normal object),即当前被使用的对象
- 后面的依次同上
所以上面的0 1表示的是删除对象,1 1实际对应PDF中的第一个obj,其偏移地址就是对应的之前第一个obj的地址,为21。这样pdf解析工具就能正常寻址找到文件中所有obj的对象了。
PDF文件尾trailer
PDF文件尾trailer位于文件的末尾,在交叉引用表xref的后面。包含了PDF文件中的对象位置信息和文件总体描述信息,是解析和渲染PDF文件的必要信息。
这里startxref就是对应上面的7990754。
trailer << /Root 74 0 R /Size 84 >> startxref 7990754 %%EOF
对trailer每个字段含义的解释:
trailer
– 文件总体描述信息的开始标记<< >>
– 文件总体描述信息的属性字典,其中包含:/Root 74 0 R
– 根对象的引用,其中74 0 R
表示该对象在文件中的编号为74,第二个数字0表示该对象在交叉引用表中的位置/Size 84
– PDF文件中的对象数量,包括自由对象和普通对象
startxref
– 交叉引用表的起始位置标记7990754
– 交叉引用表在文件中的偏移量,即从文件的开头到交叉引用表的位置的字节数%%EOF
– 文件结束标记,表示PDF文件正式结束
总结
从分析结果来看,PDF是非常结构化的文件。搞清楚了PDF文件对象的寻址原理甚至可以自己写一个PDF解析工具,这样对任何文件系统的结构原理理解也会更加深刻。
赞赏微信赞赏支付宝赞赏
目前为止有一条评论