PDF文档格式.docx
《PDF文档格式.docx》由会员分享,可在线阅读,更多相关《PDF文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
PDF文档格式
PDF文档格式
1.7
改进评注(Comment)与保全(Security)的支援,3D的支援功能也获得改善
项目简介
……..
PDF文件格式
a.header:
内含版本资讯。
b.body:
内含实际的文件内容。
c.cross-referencetable(简称xreftable):
内含对象参照的相关资讯。
d.trailer:
内含指向xreftable、body区的重要相关资讯
(1)标准的pdf文档格式
PDF区域内容呈现方式
PDF是以行的方式来呈现资料的,每一行的结束字符,可以是CarriageReturn(ASCII13)、也可以是LineFeed(ASCII10)、或是两者的组合(ASCII13紧接着ASCII10)。
各行内的资料,若遇到%字符,表示该行从%字符后面的所有的资料都是注解,必须加以略除,但有一个例外,那就是流对象(streamobject)的内容,并非以行的方式呈现,必须另行处理。
另外要注意的是,PDF里的资料是大小写有关的。
PDF文件头(header)
PDF文件的首行就是header部分,声明PDF文件的版本号
header只有一行注解文字,且固定以”%PDF-“开头,后面紧接着PDF的版本
例如:
%PDF-1.3
文件主干部分(body)
一个文件的主干部分包括表示文档内容的对象。
对象是文档的基本类型,表示文档的各个组成部分,如字体,页面,和实例图形。
从PDF1.5开始,主干部分也可以包含对象流,每个对象流都包含一系列间接对象。
参照表(Cross-ReferenceTable)
参照表包含的信息允许对文件中的间接对象进行随意访问,以便不需要阅读整个文件即可定位任何特殊对象了。
(从PDF1.5开始,某些或所有的参照表信息也可以被含在参照流中。
参照表是PDF文件唯一有固定格式的一部分,每个参照表部分都从一个包含关键字xref的行开始。
跟着这个行的是一个或多个参照子部分,这些分部可以以任何顺序出现。
子部分的构造有益于逐步更新,因为它允许一个新的参照部分附加到PDF文件中来,而包含的选项紧紧只用于已经被附加或删除的对象。
对一个从未被更新过的文件,参照部分只包含一个子部分,它的对象编号从0开始。
每个参照表项目固定20byte,
其格式如下:
Byte
内容
0-9
对象所在的文件位置,靠右,不足时补0
10
空白字符
11-15
generationnumber,靠右,不足时补0,表示对象的修改次数
generationnumber<=65535,一但达到这个数字,该对象编号便不能再使用,而必须另行增加一个编号
16
空白字符
17
n表示对象使用中,f表示对象未被使用(free)
18-19
空白与换行字符
以下便是一个xreftable的例子:
xref--------------------------------------------------------------参照表开始的的关键字
03------------------------------------------0(开始的对象号),3(后跟的对象个数)
00000000365535f---------------------对象的在文件中的位置;对象的生成号;对象的状态(f/n)
00000012700000n
00000000000001f
51
00000434600000n
这个Cross-ReferenceTable有两个参照子部分:
第一个参照子部分是指出了对象0,1,2在文件中的位置(3,127,0)以及说明0,2对象未被使用(f)。
第二个参照子部分是指出了对象5在在文件中的位置(4346),以及说明了对象正在使用(n)
trailer区域
PDF文件跟踪器使得应用程序在阅读文件时能够快速的搜索到参照表和某个特殊对象的位置。
应用程序应从尾段开始阅读PDF文件。
文件的最后一行只包含文件的结束符号,即%%EOF.〕
前面两行包括关键字startref和字节偏移值--从文件开始部分到最后面参照表部分中的关键字xref的开始部分。
放置在startref行前面的是跟踪器字典,由关键字trailer和紧跟后面的<<键值对..>>
组成
trailer区块的内容如下:
trailer
<<
trailer资料
>>
startxref
xreftable开始的文档位置
%%EOF
trailer资料主要由{/属性名称属性值}*所组成,以下便是一个例子:
/Size22
/Root20R
/Info10R
/Prev408
下表是trailer中各属性的意义:
Trailer字典内容列表
KEY
TYPE
VALUE
Size
integer
(必选项)整个PDF文件的对象个数
ID
array
分别表示旧ID与新ID
Prev
integer
如果有,后跟数字表示下一个交叉引用表的位置;没有,表示最后一张交叉表
Root
dictionary
(必选值)文件里存放Catalog的对象编号
Info
dictionary
表示文件里的摘要资讯所在对象编号
Encrypt
dictionary
表示PDF档有加密,其后接的词典资料,便是用来解密用的
整个读取trailer和xreftable的过程应为:
(1)由档尾trailer区块里找到startxref,取得第一个参照表开始的文档位置
(2)移到该参照表的位置,开始读取xreftable内容
(3)读取后面紧接着的trailer区块内容
(4)找寻其后紧接的trailer区块中是否有Prev属性,没有即结束
(5)如果有Prev,则其后的数字视为下个xreftable的文档位置,回到步骤2
对象流(ObjectStreams)
PDF1.5引进了一个全新的流概念,对象流,它包含了一系列PDF对象。
对象流的用途是允许压缩更多数目的PDF对象,以此来大量减少PDF文件大小。
流中的对象都是指压缩对象。
任何一个PDF对象都可以出现在对象流,以下几种情况例外
●流对象
●生成编号非0的对象
●一篇文档的加密字典
●表示对象流字典中Length选项值的对象
除了流的标准关键字外,对象流字典还描述了包含一下选项
对象流专用选项
KEY关键字
TYPE类型
TYPE类型
Type
Name
(必选)Objstrm,表示该对象含有对象流
N
Integer
(必选)对象流中压缩对象的个数
First
Integer
(必选)首个压缩对象的字节偏移量(在解压后的流中)
Extends
Stream
(可选)一个引用对象流,当前对象留被认为是一个扩充流
例子解析:
/n3:
说明对象流中对象的个数为3
/first24:
说明对象流中第一个压缩对象在流中的位置(解压缩后的)
1101254713665:
对象流中包含的3个对象11,12,13,并指出了对象相对于流中第一个对象的的偏移地址(0,547,665)
参照流(Cross-ReferenceStreams)
从PDF1.5开始,参照信息被存储在参照流中而不是参照表中。
参照流提高以下优势:
●更简洁紧凑的表示参照信息。
●可以访问存储在对象流中的压缩对象,并允许以后加入新的参照选项类型。
参照流是流对象,包含一个字典和一个流对象,参照流字典相当于trailer,
流对象相当于参照表。
如以下例子所示:
注意现在紧跟着关键字startxref的值是参照流的偏移值而不是关键字xref。
对于那些全部用参照流的文件(PDF1.5及以上)关键字xref和跟踪器不再被使用。
因此,除了startxrefaddress%%EOF片断和标注特例外,一个PDF1.5的文件完全是一序列的对象。
参照流字典Cross-ReferenceStreamDictionary
除了对所有流和trailer字典的通用选项外,参照流还包含下表所示的选项
参照流字典专用附加选项
KEY
TYPE
说明
type
name
值必须是xref(说明该流为参照流)
size
integer
说明参照表中对象的个数
index
array
一个数组,第一个值表示为第一个对象的编号,第二个值表示参照流中对象的总数
prev
integer
从文件开始部分到先前参照流的开始部分的子节偏移值。
本选项与跟踪器字典(表3.13)中的Prev选项作用相同,(只有当文件有多个参照流的时候才会呈现;在混合参照文件(pdf1.4)中没有意义)
W
array
参照流数据Cross-ReferenceStreamData
参照流中的每个选项都有一个或多个数据域,第一个数据域指派选项类型,在PDF1.5中,只允许类型0,1,和2。
其它的值都被看成是空值对象引用,这样就允许以后定义新的选项类型
数据以渐进的数据域编号编写;每个数据域的长度受W选项中对应的值制约,每个为位置对应的值说明:
参照流字典专用附件选项
key
field
说明
0
1
值为0,表示该对象闲置
2
下一个闲置对象的对象编号
3
对象编号被再次使用的生成编号。
1
1
值为1,对象正在使用中(不是压缩的对象)
2
对象的偏移值,从文件的开始部分开始
3
对象的生成编号,缺省值为:
0
2
1
值为2,对象为压缩对象
2
存储对象的对象流的对象编号
3
对象流中对象的属性
与PDF1.4兼容CompatibilitywithPDF1.4
不支持PDF1.5的应用程序无法访问被参照流引用的对象。
如果一个文件专门使用参照流,那么它就没有办法在这样的应用程序中打开。
PDF1.4中可以建立“混合-参照”的文件,这个文件除了包含由标准参照表和参照流中的对象,还有一个附加选项
混合-引用文件中的跟踪器字典的附件选项
key
Type
value
XRefStm
integer
参照流在文件中的位置
PDF文件内置对象
PDF文件支持8种基本类型对象:
●布尔指
●整数和实数
●字符串
●名称
●数组
●字典
●对象
●流
布尔值对象
只有两个值:
true和false
PDF提供两种数字对象:
整数和实数(含负数),实数必须以小数点的形式出现。
注意:
PDF不支持非十进制基数(比如16#FFFE)或指数格式(比如6.02E23)的数字
字符串对象
字符串对象有两种表示法,一般可见字符用括号(),16进制表示法用角号<>表示
例如:
(Thisisastring)
<4E6F762073686D6F7A206B6120706F702E>
文字串(LiteralStrings)
文字串是用含在圆括号内的任意字符编写成的。
任何一个字符都可以出现在串里面,除了必需做特别处理的单括号和反斜线符号,串中成对的括号不需要特别处理
如果一行太长写不下去,则可以用反斜线(backslash,\)做为续行动作,例如:
(These\
twostrings\
arethesame.)
等于下面这行:
(Thesetwostringsarethe