3.2.5 数组对象
数组对象是一个一维的按顺序排列的对象集合。不像数组在其他计算机语言中一样,pdf 数组可能是混杂的;也就是说,数组中的元素可以是数字、字符串、字典或者其他任何对象包括数组本身的组合。
数组写在方括号内[]:[549 3.14 false (Ralph) /SomeName]
Pdf直接支持一维数组。任何深度的多维数组可以用数组作为数组中的元素来创建。
3.2.6 字典对象
字典对象是一种连接表(键值对)包含成对的对象,称之为字典中的条目。每一条的第一个元素是关键字,第二个是值。关键字必须是一个姓名对象,值可以是任意对象。一个条目如果它值是null,它相当于一个空条目。如果一个关键字在字典中出现一次以上,则它的值是undefined。
字典对象用<<>>双尖括号包含起来:
<< /Type /Example
/Subtype /DictionaryExample
/
Version 0.01
/IntegerItem 12
/StringItem (a string)
/Subdictionary << /Item1 0.4
/Item2 true
/LastItem (not!)
/VeryLastItem (OK )
>>
>>
字典对象是pdf文件的主要组成部分。它们常被用来收集和连接复杂对象的属性,例如文件的字体或者页码,利用每个条目的关键字是不同的来查询值。它约定,Type条目描述的是这个对象的种类。在一些情况下,Subtype条目用来更深入的区分一般类型的子目录。种类和子种类条目的值总是一个姓名对
象。例如,在字体字典中,Type条目的的值始终是Font,然而Subtype条目的值可能是Type1,TrueType或者其他几个值。
Type条目的值几乎可以总是从内容中推断出来。操作符TF,是一个font对象;因此,Type条目在字体字典中主要是作为文件编制和错误检查的信息。Type条目是不强制要求的除非在描述中强调,在字典甚至私有数据中Type条目的值必须是这本书中定义的姓名或者注册姓名;详见附录E。
3.2.7 流对象
一个流对象就像字符串对象一样,是一系列的字节。不同的是,pdf应用可以增值地读
取流对象,但是字符串对象必须完全的被读取。更进一步说,流对象可以是无限长的,而字符串是受实施实现限制的。基于这个原因,很大的数据或者可能会变得很大的数据,例如图片,页面描述等都以流对象来呈现。
一个流对象包括:一个dictionary和之后的stream、endstream之间的部分:dictionary
stream
…Zero or more bytes…
Endstream
所有的流对象都必须是间接对象,同事流字典必须是直接对象。关键字stream必须跟随在一个EOL(回车换行carriage return and a line feed或者换行a line feed)之后,不能仅仅在回车之后。一系列字节放置在关键字stream和endstream之间;流字典区分字节中每一个数的意义。推荐放置一个EOL在数据之后endstream之前;这个标记不被包含在流的长度之中。
可选择的是,从pdf1.2开始,字节流可以被放置在一个外部文件中,流字典来说明这些文件,同事stream和endstream之间的字节都会被忽略。详见附录H。
如果不限制反对单独使用回车在stream之后,就不能区分一个使用回车作为EOL记号的流对象并且有一个换行符是数据的第一个字节和使用回车换行作为EOL记号的流对象。
表3.4列出了全部流字典中常见的条目;某些流对象的类型具有其他附加的字典条目,用来指明这些流对象的描述在什么地方。可选择的条目把过滤器视为指明在使用前怎样转换流对象中的数据。过滤器在3.3节中有详细介绍。
流对象的长度extent
每一个流字典有一个长度条目指明pdf文件有多少字节用来作为流数据。(如果流对象有过滤器的话,
长度条目指的是编码长度的数字字节)另外,很多过滤器被定义是为了让数字有自我限制;也就是说他们使用编码规划,其中有明确的EOD标记限制数据长度。最终,流对象被用来呈现很多长度属性可以被推断出来的对象。所有的这些限制必须是一致的。
例如,一张10行20列的图片,使用单独颜组成,每个组成部分都是8位,需要200字节的图像数据。如果这个流使用了过滤器,这里就必须足够的字节来编码pdf文件中数据来提供200字节。如果设定的长度值太小,如果一个明确的EOD标记出现的太早,或者解码数据不是200字节,都会出错。
如果一个流对象包含太多数据也会出错,例外情况是有一个额外的EOL标记在endstream之前。
表3.4 所有流字典中常见条目
3.2.8 空对象
空对象有一个类型和一个值,它不同于其他任何对象。这里只有一种空对象,称之为null。间接对象参考中(详见3.2.9,间接对象)对待一个不存在的对象我们叫他空对象。特定地指明空对象是字典条目中值为空,与这个条目根本不存在时等价的。
3.2.9 间接对象
Pdf文件中的任何一个对象都会被一个间接对象作为标签。这给明了对象一个唯一的对象识别码,其他对象可以通过它来查对象。这个对象识别码包含两部分:
·一个正整数对象号码。间接对象常常按顺序序号在pdf文件中排号,但不是必须的;对象号码可以被分配为任意的号码顺序。
·一个非负整数的生成数(世代号)。在一个新建的文件中,所有间接对象都有一个生成数0。非零生成数在文件被后来更新时被创建;详见3.4.3节,“交叉引用表”,和3.4.5节“增量更新”。
对象号码和生成数同时唯一确定一个间接对象。对象在他的生命周期中保留这个不变的对象号码和生成数,甚至它的值改变。
Pdf文件中间接对象的定义,它包含对象号码和生成数,跟在在obj和endobj之间的对象值后面,例如:
12 0 obj
(Brillig)
Endobj
定义了一个间接字符串对象,对象号码12,生成数0,值为Brillig。
这个对象可以在任何地方被索引到,使用由对象号码、生成数和关键字R组成的间接对象引用:12 0 R
从pdf1.5开始,间接对象可以放在对象流中。使用同样的方式引用它们;但是定义不包含关键字obj和endobj。
一个未定义对象的间接引用不是错误;而是一个空对象的间接引用。
例3.1中展示了间接对象用来确定流的长度的用法。流对象的长度的值是在流对象后的一个整数对象。这样做允许了应用程序在直到它的内容生成后,创建pdf之前,运行一遍来确定流的长度。
Example 3.1
7 0 obj %间接对象,对象号码7,生成数0,关键字obj
<< /Length 8 0 R >> % An indirect reference to object 8
stream
BT
/F1 12 Tf
72 712 Td
(A stream with an indirect length) Tj
ET
endstream
endobjfilter过滤对象数组
8 0 obj
77 % The length of the preceding stream
Endobj
3.3 过滤器
流过滤器是在3.2.7节(流对象)中引入的。一个过滤器是描述一个流对象的可选的部分,表明在使用流对象中的数据之前如何对其进行解码。例如,如果一个流对象具有一个ASCIIHexDecode过滤器的话,一个应用读取这些数据时会将ASCII hexadecimal编码的数据转化为二进制数据。
一个创建pdf文件的应用程序可以编码某些信息(例如,样本图片数据)来压缩或者转化为便携式的ASCII表现形式。这样当一个应用读取pdf文件时可以调用相应的解码过滤器来见信息转换回原始格式的数据。
过滤器或者流过滤器都是在流字典中的Filter条目中被定义的。过滤器可以被连接形成一个管道,来让流按顺序通过两个或者更多的解码转换。例如,数据编写使用LZW和ASCII base-85 编码方式可以用如下的流字典中的条目进行解码:
/Filter [/ASCII85Decode /LZWDecode]
有些过滤器可能含有参数来控制如何进行解码操作。这些可选的参数在流字典中的DecodeParms中说明。(如果是外部流,则在FDecodeParms条目中)。
Pdf支持一个过滤器的标准集,包含两个主要的种类:
·ASCII过滤器赋予解码使用ASCII编码的文字的任意8位二进制数据。注意它对加密后的pdf文件没有用。
·解压缩过滤器赋予解码压缩后的数据的能力。压缩数据总是以8位二进制个数存储,甚至元数据是ASCII文本时也一样。
标准过滤器的总结在表3.5中,还指明了他们是否接受可选的参数。接下来的部分详细介绍这些过滤器和他们的参数,还包括详细的编码算法。
例3.2显示了一个流,包含页面标记指示,使用LZW压缩方法和ASCII编码方法。例3.3是同样的流,但是没有编码。
Example 3.2
1 0 obj
<< /Length 534
/Filter [/ASCII85Decode /LZWDecode]
>>
stream
J..)6T`?p&<!J9%_[umg"B7/Z7KNXbN'S+,*Q/&"OLT'F
LIDK#!n`$"<Atdi`\Vn%b%)&'cA*VnK\CJY(sF>c!Jnl@
RM]WM;jjH6Gnc75idkL5]+cPZKEBPWdR>FF(kj1_R%W_d
&/jS!;iuad7h?[L F$+]]0A3Ck*$I0KZ?;<)CJtqi65Xb
Vc3\n5ua:Q/=0$W<#N3U;H,MQKqfg1?:lUpR;6oN[C2E4
ZNr8Udn.'p+?#X+1>0Kuk$bCDF/(3fL5]Oq)^kJZ!C2H1
'TO]Rl?Q:&'<5&iP!$Rq;BXRecDN[IJB`,)o8XJOSJ9sD
S]hQ;Rj@!ND)bD_q&C\g:inYC%)&u#:u,M6Bm%IY!Kb1+
":aAa'S`ViJglLb8<W9k6Yl\\0McJQkDeLWdPN?9A'jX*
al>iG1p&i;eVoK&juJHs9%;Xomop"5KatWRT"JQ#qYuL,
JD?M$0QP)lKn06l1apKDC@\qJ4B!!(5m+j.7F790m(Vj8
8l8Q:_CZ(Gm1%X\N1&u!FKHMB~>
endstream
endobj
Example 3.3
1 0 obj
<< /Length 568 >>
stream

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。