本文转自:https://blog.csdn.net/u012632138/article/details/80974174
前言:
PDF支持8种基本类型对象。布尔对象、数字对象、串对象、名称对象、数组对象、字典对象、流对象、空对象和间接对象。
PDF reference1.7.pdf 3.2 Objects
目标:
熟练掌握PDF8种基本类型对象。
布尔对象 Boolean Objects
True & false
数字对象 Numeric Objects
整数对象(integer):以零为中心表示一个特定间隔内的整数,例如:
123 43445 +17 -98 0
实数对象(real):类似于数学中的实数,但范围和精度有限,例如:
34.5 -3.62 +123.6 4. -.002 0.0
串对象 String Objects
1)文本串 Literal Strings:以()为分隔符,包含在()中的一系列文字字符。例如:
(This is a (string))
2)转义字符:\ddd 表示ASCII字符集之外可打印的字符
文字串(\0053)表示这个串包含2个字符,\005(Control-E)和数字3. 然而(\053)和(\53)表示串只包含一个字符\053,即加号(+).
3)十六进制串 Hexadecimal Strings:以< >为分隔符,包含在<>中的十六进制数据。
如果串的位数是奇数,以0补齐。例如:<901FA3>该串由3个字节构成分别是90,1F,和A3。但是<901FA>是由3个字节构成的分别是90,1F和A0。
名称对象 Name Objects
1)名称是以斜线(/)打头。斜线不是名称的一部分。名称中斜线和第一个字符之间不允许有空格。名称可以包含任意的常规字符,但不包含分隔符和空格符。名称是有区分大小写的:/A和/a是两个不同的名称。以下例子是有效的文字名称:
/Name1 /$$ /@pattern /. notdef
2)从PDF1.2开始,除了0以外的任何字符都可包含在名称中,由(#)为前缀和2位16进制编码的数表示例如:
/Adobe#20Green 表示Adobe Green
3)名称的最大长度为127字符。字符数的计算是根据名称实际表示的字符。例如,/A#20B是4个字符(/,A,空格,B),而不是6个字符。
数组对象 Array Objects
1)数组对象是一个排列有序的一维对象集合。PDF数组可以是不同性质的,数组的元素可以由数(number),串,字典或其他对象,还可以包含其他数组。
数组书写格式如下:(包含在[ 和 ] 之间)
[ 549 3.14 false ( Ralph ) /SomeName ]
2)PDF 只支持一维数组。多维的数组可以用数组嵌套的方式来构建。
字典对象 Dictionary Objects
1)字典对象是一个包含多个对象的关联表,称为字典条目。每个条目的第一个元素称为关键字(key),第二个元素称为值(value)。关键字必须是一个名称(name)。值可以是任何对象,包括其他字典。一个字典的条目的值如果是null等同于该项缺省。
字典书写格式如下:(包含在<< 和 >>中,关键字-值是配对出现的)
<< /Type /Example
/Subtype /DictionaryExample
/Version 0.01 >>
2)字典对象是构建PDF文件数据块的主要部分。它们通常用于集合和绑定复杂对象的属性,例如字体(font)或文档的页面,其中的每个条目指定一个属性的名称和值。根据规定,Type条目指定这个字典所描述的对象类型。在某些情况下,Subtype条目(或缩写为S)用于进一步确定子类型。
流对象 Stream Objects
1)流对象类似串对象,是一系列字节构成。但是PDF应用程序可以逐步读取一个流,而一个串必须全部一次性读取。而且,流不限制长度,而串是有长度限制的。正因为如此,可能包含大量数据的对象,如图像,页面描述,都用流来表示。
2)一个流由一个字典,后面紧随的是0或更多的字节构成,头尾用关键字Stream和endstream标识
dictionary
stream
… Zero or more bytes …
endstream
3)所有的流都必须是间接引用对象,流字典必须是直接对象。流字典后紧跟着必须有一个行末标识符,与strem关键字分隔开,这个行末标识符可以是一个回车符和是行末填充符,或是一个行末填充符,但不是单独一个回车符。构成流的序列字节,位于关键字stream和endstream之间;流字典中精确指定了流的字节数。
4)每个流字典都有一个Length条目,说明PDF文件中使用的流数据的字节数。(如果流使用了filter(过滤器),Length是已编码数据的字节数。)另外,为了数据的自身限制,大多数filters(过滤器)的定义,使用明确的数据结束标识(EOD,end-of-data)界定数据的区域。最后,流用于表示许多对象,并且长度可以从属性中推断出来的。所有这些制约因素必须一致。
例如,一个图像有10行和10列,一个颜色成分组成,每个颜色成分有8位,那么图像数据就需要200字节来表示。如果流使用filter(过滤器),必须有足够的编码字节数来表示这200字节。如果Length太小,或EOD数据结束符出现的太早,或者解码数据没有200字节,那么都将出错。
如果流中包含太多的数据也将出错,除非在关键字endstream之前有一个额外的行末结束符。
空对象 Null Objects
只有这个对象的类型是空,由关键字null指定。一个间接对象指向一个不存在的对象被看作是空对象。指定空对象为字典选项的值等同于忽略该项。
间接对象 Indirect Objects
PDF 文件中的任何对象都可以被标记为间接对象。这就要求每个对象有一个唯一对象标识符,通过这个标识符其它对象都可以引用它(比如,数组的一个元素或字典选项的值)。对象标识符包括两个部分:
1. 一个正整数对象编号,在 PDF 文件中间接对象经常按顺序编号,但不是必须的;对象编号可以以任意顺序分配。
2.一个非负整数版本编号generation number。一个新创建的文件中,所有间接引用的版本号为0.非0的版本号说明文件更新过。
例如:12 0 obj ( Brillig )endobj
定义了一个间接串对象,对象号为12,版本号为0,值为Brillig.
一个对象可以被被位于文件中任何位置的间接引用所引用,如下格式 12 0 R(对象编号,版本号及关键字R)。
一个间接引用指向一个未定义的对象不是错误。它只是被看作引用一个空值对象。比如,如果一个文件包含间接引用 17 0 R 但没有包含相应的定义
17 0 obj … endobj
那么这个间接引用被认为是引用一个空值对象。