PDF文件结构详解Word文档格式.docx
- 文档编号:15240150
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:16
- 大小:22.50KB
PDF文件结构详解Word文档格式.docx
《PDF文件结构详解Word文档格式.docx》由会员分享,可在线阅读,更多相关《PDF文件结构详解Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
obj和endobj是对象的定义范围,可以抽象的理解为这就是一个左括号和右括号;
省略号部分是PDF规定的任意合法对象(一共8种,见后面附A)。
可以通过R关键字来引用任何一个对象,比如要引用上面的对象,可以使用20R,需要主意的是,R关键字不仅可以引用一个已经定义的对象,还可以引用一个并不存在的对象,而且效果就和引用了一个空对象一样。
3.交叉引用表
交叉引用表是PDf文件内部一种特殊的文件组织方式,可以很方便的根据对象号随机访问一个对象。
其格式如下:
xref
01
0000000000
65535
f
41
0000000009
00000
n
83
0000000074
0000000120
0000000179
其中,xref是开始标志,表示以下为一个交叉引用表的内容;
每个交叉引用表又可以分为若干个子段,每个子段的第一行是两个数字,第一个是对象起始号,后面是连续的对象个数,接着每行是这个子段的每个对象的具体信息——每行的前10个数字代表这个这个对象相对文件头的偏移地址,后面的5位数字是生成号(用于标记PDF的更新信息,和对象的生成号作用类似),最后一位f或n表示对象是否被使用(n表示使用,f表示被删除或没有用)。
上面这个交叉引用表一共有3个子段,分别有1个,1个,3个对象,第一个子段的对象不可用,其余子段对象可用。
4.trailer:
通过trailer可以快速的找到交叉引用表的位置,进而可以精确定位每一个对象;
还可以通过它本身的字典还可以获取文件的一些全局信息(作者,关键字,标题等),加密信息,等等。
具体形式如下:
trailer
<
<
key1
value1
key2
value2
key3
value3
…
>
>
startxref
553
%%EOF
trailer后面紧跟一个字典,包含若干键-值对。
具体含义如下:
键
值类型
值说明
Size
整形数字
所有间接对象的个数。
一个PDF文件,如果被更新过,则会有多个对象集合、交叉引用表、trailer,最后一个trailer的这个字段记录了之前所有对象的个数。
这个值必须是直接对象。
Prev
当文件有多个对象集合、交叉引用表和trailer时,才会有这个键,它表示前一个相对于文件头的偏移位置。
Root
字典
Catalog字典(文件的逻辑入口点)的对象号。
必须是间接对象。
Encrypt
文档被保护时,会有这个字段,加密字典的对象号。
Info
存放文档信息的字典,必须是间接对象。
ID
数组
文件的ID
startxref:
后面的数字表示最后一个交叉引用表相对于文件起始位置的偏移量。
%%EOF
:
文件结束符.
一个PDF文件,都会有上面这样的结构(线性化优化的PDF例外,这个后面单独说)。
实际一个pdf文件是很复杂的,但是上面几个部分是确定的,只能多不能少.了解了PDF文件的物理结构,就可以提取出一个一个的对象了.PDF中的对象有8种:
1.booleam
用关键字true或false表示,可以是array对象的一个元素,或dictionary对象的一个条目.也可以用在PostScript计算函数里面,做为if或ifesle的一个条件。
2.numeric
包括整形和实型,不支持非十进制数字,不支持指数形式的数字.
例:
1)整数
123
4567
+111
-2
范围:
正2的31次方-1到负的2的31次方
2)实数
12.3
0.8
+6.3
-4.01
-3.
+.03
±
3.403
×
10的38次方
1.175
10的-38次方
注意:
如果整数超过表示范围将转化成实数,如果实数超过范围就出错了
3.string
由一系列0-255之间的字节组成,一个string总长度不能超过65535.string有以下两种方式:
1)
直接字串
由()包含起来的一个字串,中间可以使用转义符"
/"
.
(abc)
表示abc
(a//)
表示a/
转义符的定义如下:
转义字符
含义
/n
换行
/r
回车
/t
水平制表符
/b
退格
/f
换页(Formfeed(FF))
/(
左括号
/)
右括号
//
反斜杠
/ddd
八进制形式的字符
2)
十六进制字串
由<
包含起来的一个16进制串,两位表示一个字符,不足两位用0补齐
Aabb>
表示AA和BB两个字符
AAB>
表示AA和B0两个字符
4.name
由一个前导/和后面一系列字符组成,最大长度为127.和string不同的是,name是不可分割的和唯一的,不可分割就是说一个name对象就是一个原子,比如/name,不能说n就是这个name的一个元素;
唯一就是指两个相同的name一定代表同一个对象.从pdf1.2开始,除了ascii的0,别的都可以用一个#加两个十六进制的数字表示.
/name
表示name
/name#20is
表示nameis
/name#200
表示name0
5.array
用[]包含的一组对象,可以是任何pdf对象(包括array).虽然pdf只支持一维array,但可以通过array的嵌套实现任意维数的array(但是一个array的元素不能超过8191)
[549
3.14
false
(Ralph)
/SomeName]
6.Dictionary
用"
"
和"
包含的若干组条目,每组条目都由key和value组成,其中key必须是name对象,并且一个dictionary内的key是唯一的;
value可以是任何pdf的合法对象(包括dictionary对象).
/IntegerItem
12
/StringItem
(a
string)
/Subdictionary
/Item1
0.4
/Item2
true
/LastItem
(not!
)
/VeryLastItem
(OK)
7.stream
由一个字典,和紧跟其后面的一组关键字stream和endstream以及这组关键字中间包含一系列字节组成.内容和string很相似,但有区别:
stream可以分几次读取,分开使用不同的部分,string必须作为一个整体一次全部读取使用;
string有长度限制,但stream却没有这个限制.一般较大的数据都用stream表示.
需要注意的是,Stream必须是间接对象,并且stream的字典必须是直接对象。
从1.2规范以后,stream可以以外部文件形式存在,这种情况下,解析PDF的时候stream和endstream之间的内容就被忽略掉。
dictionary
stream
data
…
endstream
stream字典中常用的字段如下:
字段名
类型
值
Length
整形
(必须)关键字stream和endstream之间的数据长度,endstream之前可能会有一个多余的EOL标记,这个不计算在数据的长度中。
Filter
名字
或
(可选)Stream的编码算法名称(列表)。
如果有多个,则数组中的编码算法列表顺序就是数据被编码的顺序。
DecodeParms
字典
(可选)一个参数字典或由参数字典组成的一个数组,供Filter使用。
如果仅有一个Filter并且这个Filter需要参数,除非这个Filter的所有参数都已经给了默认值,否则的话DecodeParms必须设置给Filter。
如果有多个Filter,并且任意一个Filter使用了非默认的参数,
DecodeParms
必须是个数组,每个元素对应一个Filter的参数列表(如果某个Filter无需参数或所有参数都有了默认值,就用空对象代替)。
如果没有Filter需要参数,或者所有Filter的参数都有默认值,DecodeParms
就被忽略了。
F
文件标识
(可选)保存stream数据的文件。
如果有这个字段,stream和endstream就被忽略,FFilter将会代替Filter,FDecodeParms将代替DecodeParms。
Length字段还是表示stream和endstream之间数据的长度,但是通常此刻已经没有数据了,长度是0.
FFilter
(可选)和filter类似,针对外部文件。
FDecodeParms
(可选)和DecodeParams类似,针对外部文件。
8.NULL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PDF 文件 结构 详解