PDF格式分析(二)语法之对象

PDF文件是由对象集合组成的,包括:boolean(布尔型),numberic(数值型),string(字符串型),name(名字型),array(数组型),dictionary(字典型),stream(数据流型),null(空类型), indirect(间接型)。

1. boolean
PDF支持布尔型对象,对应的关键字为“true”和“false”,该对象可以存在于数组型对象、字典型对象。
2. numberic
PDF支持两种类型的数值型对象:integer(整数)和real(浮点型)
integer(整数):123,-123,+456,0,234234
real(浮点型):1.34,-1.23,+123.4,2.,-.01,0.0

3. string
字符串对象可以写成以下两种形式:
literal string(文字串):该对象由“(”和“)”作为对象的开始和结束,内容为ascii字符组成的序列,以下的文字串都是有效对象:
文字串
在文字串中,可以使用“\”反斜线,用于转义字符,下面列出PDF支持的转义字符,如果不在该表格中的字符,则忽略反斜线“\”:
转义字符
如果一个文字串很长时,我们可以使用反斜线“\”,把这个字符串分成多行。
字符串分行
如果文字串的结尾是换行符,则等同于“\n”
换行符
“\ddd”这种表现形式,用来不能打印的ascii字符,“d”为八进制数值,“ddd”可以是一个,两个,三个,当高位是“0”,则忽略,当“ddd”后一个字符是数字,则前面的“0”不可忽略,如“\0053”,等价于“\005”+“3”。
八进制字符
hexadecimal(十六进制字符串):该对象由“<”和“>”作为对象的开始和结束,内容为十六进制数组成的序列(0-9,a-f或A-F)。
十六进制字符串
十六进制字符串的长度一定是偶数的,每两个数字表示一个字符,当出现为奇数的情况,PDF则在末尾补“0”,如:错误的十六进制数<980AC>,则被识别为<980AC0>。
当十六进制字符串中存在空白字符(空格,tab,回车,换行,换页符),则忽略空白字符。

4. name
名字型对象,是由“/”作为首字符的字符串组成,“/”只是用来标识名字对象,并不属于名字对象的内容,而且名字对象字符串中不允许出现空白符号。
当两个名字型对象内容完全一致(区分大小写),则PDF认为这两个对象相同。
名字对象
从PDF1.2以后版本,名字对象可以使用”#”+2个16进制数字,来表示那些不能显示的ascii码,值得注意的是,名字对象“/A#42”,它的长度是3,而不是5
这里写图片描述

5. array
数组对象是一个容器集合,和java中的数组对象很相似。它的元素可以是PDF支持的任意对象类型,该对象由“[”和“]”作为对象的起始符号。
数组对象
PDF中的数组对象只支持一维数组,但是可以通过数组嵌套来表示多维数组。

6. dictionary
字典对象是键值对的集合,和java中的map类似。key是唯一的,key的类型是name对象,value的类型是任意PDF支持的对象类型,当value为“null”,则表示该键值对不存在。字典对象以“<<”和“>>”作为对象的开始和结束。
字典对象
字典对象是构建PDF文档的主要结构,通常它们都是一些有特定意义的属性组成的复杂对象集合,一般每个字典中都包含“Type”名字对象,该对象的值表示字典对象描述的具体对象,如“Page”,表示该字典是页对象,“Outline”,表示该字典对象是书签对象。

7. stream
数据流对象,和java中的字符流对象类似,没有长度限制。
数据流对象由一个字典对象和关键字“stream”,“endstream”之间的数据块组成。
stream
所有的stream必须是indirect对象,而stream中的字典必须是direct对象。
关键字“stream”在stream对象字典内容之后,再下来是stream数据块,后面是“endstream”,stream数据块的前面和后面分别使用换行符,将“stream”和“endstream”分隔开,注意:分隔符没有计算在stream的长度内。
从PDF1.2开始,数据块可以被保存在一个外部文件(通过stream字典指定),当数据块被存储到外部文件时,“stream”与“endstream”中间的数据块将被忽略。
每个stream对象的字典都有“Length”属性,该属性表示数据块的长度(如果stream被压缩了,则表示的是压缩后的长度)。
通常stream对象的字典都包含以下几个属性:


Length
类型:整型
描述:(必须)数据块长度


Filter
类型:名字或数组
描述:(可选)对数据块进行压缩,名字类型,表示按照该名字标识的压缩方式去压缩,数组型,表示采用多重压缩,根据数组中名字的先后顺序进行压缩


DecodeParms
类型:字典或数组
描述:(可选)“Filter”指定压缩方式的一个参数字典,或一组参数字典(数组)。该参数必须被设置,除非使用默认值。如果“Filter”是数组对象时,DecodeParms也必须是数组对象。


F
类型:文件描述对象
描述:(可选,PDF1.2以上)stream数据块的内容将被保存在一个文件中。如果该属性存在,“stream”和“endstream”中的数据块将被忽略,“Filter”和“DecodeParms”也将被忽略,而使用“FFilter”和“FDecodeParms”替代,这时,“Length”的值通常为“0”


FFilter
类型:名字或数组
描述:(可选,PDF1.2以上)与“Filter”的规则相同,它用来描述外部文件数据


FDecodeParms
类型:字典或数组
描述:(可选,PDF1.2以上)与“DecodeParms”的规则相同,它用来描述外部文件数据


DL
类型:整型
描述:(可选,PDF1.5以上)非负整数,它表示解压缩之后的数据块长度。


Null
空对象,类似与java中“null“,表示空值。

indirect
间接对象,PDF中的任何对象都可以封装成一个间接引用对象。
该类型对象,由一个对象号(索引号),一个版本号,”obj“关键字,”endobj“关键字组成。
间接引用对象
一个间接对象,可以通过间接引用(如:12 0 R),引用到任何位置。
间接引用例子

本章对PDF中的各种数据对象进行了简单的描述,都是一些通用的规则,在后面的章节当中,会更深入的对一些拥有特殊意义对象进行分析解答。

注:本系列博文会用到很多《PDF reference sixth edition》的例子和表格,大家可以结合之看会更有效果。

猜你喜欢

转载自blog.csdn.net/steve_cui/article/details/81912528