1、pdfreference17第三章语法P5796翻译3.2.5数组对象数组对象是一个一维的按顺序排列的对象集合。 不像数组在其他计算机语言中一样, pdf 数组可能是混杂的; 也就是说, 数组中的元素可以是数字、字符串、字典或者其他任何对象 包括数组本身的组合。数组写在方括号内 : 549 3.14 false (Ralph) /SomeNamePdf 直接支持一维数组。任何深度的多维数组可以用数组作为数组中的元素来创建。3.2.6字典对象字典对象是一种连接表(键值对)包含成对的对象,称之为字典中的条目。 每一条的第 一个元素是关键字, 第二个是值。关键字必须是一个姓名对象,值可以是任意对象。
2、一个条 目如果它值是 null ,它相当于一个空条目。如果一个关键字在字典中出现一次以上,则它的 值是 undefined 。字典对象用 双尖括号包含起来: /Type /Example/Subtype /DictionaryExample/Version 0.01/IntegerItem 12/StringItem (a string)/Subdictionary 字典对象是 pdf 文件的主要组成部分。 它们常被用来收集和连接复杂对象的属性, 例如 文件的字体或者页码,利用每个条目的关键字是不同的来查询值。它约定, Type 条目描述 的是这个对象的种类。在一些情况下, Subtype 条
3、目用来更深入的区分一般类型的子目录。 种类和子种类条目的值总是一个姓名对象。例如,在字体字典中, Type 条目的的值始终是 Font,然而Subtype条目的值可能是 Typel, TrueType或者其他几个值。Type条目的值几乎可以总是从内容中推断出来。操作符 TF,是一个font对象;因此,Type 条目在字体字典中主要是作为文件编制和错误检查的信息。 Type 条目是不强制要求的除非在描述中强调,在字典甚至私有数据中 Type条目的值必须是这本书中定义的姓名或者注册姓名;详见附录 E。3.2.7流对象一个流对象就像字符串对象一样,是一系列的字节。不同的是, pdf应用可以增值地读取
4、流对象,但是字符串对象必须完全的被读取。更进一步说, 流对象可以是无限长的, 而字符串是受实施实现限制的。 基于这个原因,很大的数据或者可能会变得很大的数据, 例如图片,页面描述等都以流对象来呈现。一个流对象包括:一个 dictionary和之后的stream、endstream之间的部分:dictio nary stream Zero or more bytes En dstream所有的流对象都必须是间接对象,同事流字典必须是直接对象。关键字 stream必须跟随在一个 EOL (回车换行 carriage return and a line feed或者换行a line feed)之后,
5、不能仅仅 在回车之后。一系列字节放置在关键字 stream和endstream之间;流字典区分字节中每一个数的意义。推荐放置一个EOL在数据之后endstream之前;这个标记不被包含在流的长度 之中。可选择的是,从 pdf1.2开始,字节流可以被放置在一个外部文件中,流字典来说明这 些文件,同事stream和endstream之间的字节都会被忽略。详见附录 H。如果不限制反对单独使用回车在 stream之后,就不能区分一个使用回车作为 EOL记号的流对象并且有一个换行符是数据的第一个字节和使用回车换行作为 EOL记号的流对象。表3.4列出了全部流字典中常见的条目;某些流对象的类型具有其他附加
6、的字典条目, 用来指明这些流对象的描述在什么地方。 可选择的条目把过滤器视为指明在使用前怎样转换流对象中的数据。过滤器在 3.3节中有详细介绍。流对象的长度extent每一个流字典有一个长度条目指明 pdf文件有多少字节用来作为流数据。 (如果流对象有过滤器的话,长度条目指的是编码长度的数字字节) 另外,很多过滤器被定义是为了让数字有自我限制;也就是说他们使用编码规划, 其中有明确的EOD标记限制数据长度。 最终,流对象被用来呈现很多长度属性可以被推断出来的对象。所有的这些限制必须是一致的。例如,一张10行20列的图片,使用单独颜色组成,每个组成部分都是 8位,需要200字节的图像数据。如果这
7、个流使用了过滤器, 这里就必须足够的字节来编码 pdf文件中数据来提供200字节。如果设定的长度值太小,如果一个明确的 EOD标记出现的太早,或者解码数据不是200字节,都会出错。如果一个流对象包含太多数据也会出错,例外情况是有一个额外的 EOL标记在endstream 之前。表3.4所有流字典中常见条目KeyTypeValueLen gthIn teger必须的,stream 禾口 endsteam 之间的所有字节数FilterName or array可选的,处理数据使用的 filter的名字DecodeParmsDictionary or array可选的,参数/数组字典,过 滤器参数字
8、典F文件说明可选的,文件包含流数据。如 果有这个条目,stream和endstream之间的数据会被忽略掉,过滤器会在 FFilter中说明而不是Filter中,过滤器 中的参数会在 FDecodeParms 中说明。FFilterName or array可选的,显示在处理外部文件 数据是使用的过滤器的名字FDecodeParmsDictionary or array可选的,FFilter中说明使用的 Filter中的参数字典,或者这 类字典的数组。其他同样的规 则应用于DecodeParmsDLIn teger可选的,非负整数表现解码流 中的数据。可以用来检查是否 有足够的磁盘空间可用来写
9、 流文件。应当仅仅作为一个提 示,在游戏流过滤器中,它不 能准确测试文件长度。328空对象空对象有一个类型和一个值,它不同于其他任何对象。这里只有一种空对象,称之为null。间接对象参考中(详见 3.2.9,间接对象)对待一个不存在的对象我们叫他空对象。特定地指明空对象是字典条目中值为空,与这个条目根本不存在时等价的。3.2.9间接对象Pdf文件中的任何一个对象都会被一个间接对象作为标签。这给明了对象一个唯一的对象识别码,其他对象可以通过它来查找对象。这个对象识别码包含两部分:一个正整数对象号码。间接对象常常按顺序序号在 pdf文件中排号,但不是必须的;对象号码可以被分配为任意的号码顺序。一个
10、非负整数的生成数(世代号) 。在一个新建的文件中,所有间接对象都有一个生成数0。非零生成数在文件被后来更新时被创建;详见 3.4.3节,“交叉引用表”,和3.4.5节“增量更新”。对象号码和生成数同时唯一确定一个间接对象。 对象在他的生命周期中保留这个不变的对象号码和生成数,甚至它的值改变。Pdf文件中间接对象的定义,它包含对象号码和生成数,跟在在 obj和endobj之间的对象值后面,例如:12 0 obj(Brillig)Endobj定义了一个间接字符串对象,对象号码 12,生成数0,值为Brillig。这个对象可以在任何地方被索引到, 使用由对象号码、 生成数和关键字 R 组成的间接对
11、象引用: 12 0 R从 pdf1.5 开始,间接对象可以放在对象流中。使用同样的方式引用它们;但是定义不 包含关键字 obj 和 endobj 。一个未定义对象的间接引用不是错误;而是一个空对象的间接引用。例 3.1 中展示了间接对象用来确定流的长度的用法。 流对象的长度的值是在流对象后的 一个整数对象。这样做允许了应用程序在直到它的内容生成后,创建 pdf 之前,运行一遍来 确定流的长度。Example 3.17 0 obj %间接对象,对象号码 7 ,生成数 0,关键字 obj % An indirect reference to object 8 stream BT/F1 12 Tf7
12、2 712 Td(A stream with an indirect length) TjET endstream endobj 8 0 obj 77 % The length of the preceding stream Endobj3.3过滤器流过滤器是在 3.2.7 节(流对象)中引入的。一个过滤器是描述一个流对象的可选的部 分,表明在使用流对象中的数据之前如何对其进行解码。例如,如果一个流对象具有一个ASCIIHexDecode过滤器的话,一个应用读取这些数据时会将 ASCII hexadecimal编码的数据转化为二进制数据。一个创建 pdf 文件的应用程序可以编码某些信息(例如,
13、样本图片数据)来压缩或者转 化为便携式的ASCII表现形式。这样当一个应用读取 pdf文件时可以调用相应的解码过滤器来见信息转换回原始格式的数据。过滤器或者流过滤器都是在流字典中的 Filter 条目中被定义的。过滤器可以被连接形成一个管道,来让流按顺序通过两个或者更多的解码转换。例如,数据编写使用 LZW和ASCIIbase-85 编码方式可以用如下的流字典中的条目进行解码:/Filter /ASCII85Decode /LZWDecode 有些过滤器可能含有参数来控制如何进行解码操作。这些可选的参数在流字典中的 DecodeParms 中说明。(如果是外部流,则在 FDecodeParms
14、 条目中)。Pdf支持一个过滤器的标准集,包含两个主要的种类: ASCII过滤器赋予解码使用 ASCII编码的文字的任意 8位二进制数据。注意它对加密后的pdf 文件没有用。解压缩过滤器赋予解码压缩后的数据的能力。 压缩数据总是以 8位二进制个数存储, 甚至 元数据是ASCII文本时也一样。标准过滤器的总结在表 3.5中,还指明了他们是否接受可选的参数。接下来的部分详细 介绍这些过滤器和他们的参数,还包括详细的编码算法。例3.2显示了一个流,包含页面标记指示, 使用LZW压缩方法和ASCII编码方法。例3.3 是同样的流,但是没有编码。表3.5标准的过滤器详见原文档P67名字是否有参数ASCI
15、IHexDecodenoASCII85DecodenoLZWDecodeyesFIateDecodeyesRunLen gthDecodenoCCITTFaxDecodeyesJBIG2DecodeyesDCTDecodeyesJPXDecodenoCryptyesExample 3.210 objstreamJ.)6T?p&!J9%_umgB7/Z7KNXbNS+,*Q/& OLTF LIDK#! n$c!J nl RMWM;jjH6G nc75idkL5+cPZKEBPWdRFF(kj1_R%W_d &/jS!;iuad7h?L F$+OA3Ck*$IOKZ?;)CJtqi65XbVc3n
16、5ua:Q/=0$WOKuk$bCDF/(3fL5OqFkJZ!C2H1 TORI?Q:& 5 & iP!$Rq;BXRecDNIJB,)o8XJOSJ9sD ShQ;Rj!ND)bD_ q& Cg:i nY C%)&u#:u,M6Bm%IY!Kb1 + :aAaSViJglLb8iG1p & i;eVoK&juJHs9%;Xomop5KatWRTJQ#qYuL, JD?M$0QP)IK n06l1apKDCqJ4B!(5m+j.7F790m(Vj8 8I8Q:_CZ(Gm1%XN1 &u!FKHMB en dstream en dobjExampIe 3.31 0 objstream2JBT
17、/F1 12 Tf0 Tc0 Tw72.5 712 TD(Unencoded streams can be read easily) 65 (, ) TJ0 14 TD(b) 20 (ut generally tak) 10 (e more space than 311) TJT* (encoded streams.) Tj0 28 TD(Se) 25 (v) 15 (eral encoding methods are a) 20 (v) 25 (ailable in PDF) 80 (.) TJ 0 14 TD(Some are used for compression and others
18、 simply) TjT* (to represent binary data in an ) 55 (ASCII format.) TJT* (Some of the compression encoding methods are suitable ) TjT* (for both data and images, while others are suitable only ) TjT* (for continuous tone images.) TjETendstreamendobj3.3.1ASCIIHexDecode Filter3.3.2ASCII85Decode Filter3
19、.3.3LZWDecode and FlateDecode Filters3.3.4RunLengthDecode Filter3.3.5CCITTFaxDecode Filter3.3.6JBIG2Decode Filter3.3.7DCTDecode Filter3.3.8JPXDecode Filter3.3.9Crypt Filter3.4 File Structure先前的章节介绍了单个对象的语法。 这章介绍这些对象是如何有效随机获得和增量更新 而组织成一个 pdf 文件的。一个标准的权威的 pdf 文件最初包含四个元素,如图 3.2 :一行文件头header,标识pdf文件的版本。
20、一个主体body,文件中包含的所有对象。一个交叉引用表,包含文件中的间接对象的信息。一个追踪器trailer,提供交叉引用表、某些特别的对象在文件主体中的位置。3.4.5这些原始的结构可能被以后的更新所修改,例如在文件尾添加额外的元素,详见 节“增量更新”hkdlkl 图3.2最初的pdf文件结构我们约定,pdf中tokens是一行行的排列的。每一行都以 EOL (回车代码13,换行代码 10)标记作为结束。二进制数据的 pdf可以由任意多的行数。但是,为了提高 pdf文件被其他应用程序处理时的兼容性,不是流对象数据的行不例外地被限制为不超过 255个字符。从pdf1.3开始,签名字典中的字符
21、串内容不受行长度限制 (见8.7节,数字签名)。详见附录H。这里描述的规则足够创建一个格式良好的 pdf文件。然而,应用于 pdf文件的额外的一些规则使得在联网环境中文件组成部分的高效增量授权功能得以应用, 我们称之为线性化的pdf ( Linearized PDF),见附录 F。3.4.1 文件头 File Header文件的第一行就是 header,用来鉴别pdf文档的版本,说明文档是遵从那个标准写的,例如一个文件遵从 pdf1.7,文件头应该是: PDF-1.7遵从于先与1.7的任何版本,同样都遵从 1.7版。新版兼容老版本。从pdf1.4开始,文件头中的版本号可以通过文件目录字典中的
22、Version条目被重写。这赋予一个pdf创建应用程序能够通过增量更新来更新 pdf版本号的方法。在某些条件下,一个消费者应用程序可以使用最新的 pdf版本的处理方法来处理 pdf文件。新版本中的功能特性可以自动安全的被不认识他的版本忽略掉。见 H.1,pdf版本号。当pdf文件中包含二进制数据时,推荐 header行后立即街上一段注释行,其中包含至少4个二进制字符(1000以上)。这样就能保证处理时正确对待 pdf中的二进制数据。3.4.2文件主体 File BodyPdf文件的主体包含一系列的间接对象呈现了文档中的内容。对象是 3.2节中讲的主要基本类型,代表文档的组成部分,例如字体,页码
23、,样本图。从 pdf1.5开始,主体也可以包含对象流,每一个对象流包含一系列的间接对象;见 3.4.6,对象流。3.4.3交叉引用表交叉引用表包含文件中到间接对象的随机接近许可, 这样就不需要读取整个文件来定位某个特定的对象。这个表包括每一行都是一条间接对象,指明对象在文件主体中的位置。交叉引用表是 pdf 文件中唯一固定格式的部分, 来提供对表中条目的随机访问。 这个表 包括一个或者多个交叉引用章节。 最初, 整张表有一个单独部分组成, 如果文件时线性化的 有两部分组成。每次文件更新时,会添加一个新的部分。每个交叉引用部分都是以关键字 xref 开头。这行之后是一个活多个交叉引用子章节,会无
24、序地出现。子章节的结构可以方便增量更新,因为他允许新的交叉引用部分添加进 pdf文件中,其中包含新增或者删除掉的对象条目信息。例如一个从来没有修改更新过的 pdf文件看,他的交叉引用表只包含一个以对象号码 0 开头的子章节。每一个交叉引用子章节包含临近的一部分对象号码的条目信息。 子章节以包含两个以空 格隔开的数字为开头:这一个子章节首个对象的对象号码和这个子章节中的条目数。例如: 28 5 表示一个子章节包含 5个对象,编码从 28到 32.注意:一个对象号码不能同时出现在两个或两个以上的同一个引用表部分的不用子章节 中。在此之后的每一行是一条交叉引用条目。每一条的长度都是 20 字节,包括
25、 EOL 标记。 有两种交叉引用条目: 一种是真正使用的对象, 另一种是已经被删除的对象。 他们有同样的 基本格式,通过关键字区分 n (使用中),f (已删除)。例如Nnnnnnnnnn ggggg n eol其中 nnnnnnnnnn 是一个十位数字字节的开销,表示文件开头到对象开头之间的字节数,来 指明对象在文件中的具体位置,不足 10 位的话前面补 0Ggggg是一个5位数字生成数,不足 5位的话前面补0N 是关键字说明这个条目在使用中Eol 是一个 2 位字符代表 end-of-line总长度 10+1+5+1+1+2=20被删除的条目使用f代替n,他们形成一个链接表,每一个被释放的
26、条目包含下一个被 释放条目的对象号码。表中的第一个条目是一个总是为显示已删除的条目,它的生成数为 65535;它是链接表的标头。 最后一个被释放的条目链接回对象号码为 0并且生成数为 65535 的条目。除了对象号码为 0的条目之外, 所有交叉引用表中的对象的初始生成数都为 0.当间接对象被删除一次时,他的交叉引用表中的条目被标记为 f,同事添加进入被释放链接表中。条目的生成数自增 1来表明他被使用的次数。 这样,每次这个条目被重新使用时, 生成数加 1。 最大生成数为 65535;当达到这个数时,就不会再重用它了。交叉引用表必须包含一条从对象号码 0到文件中使用的最大对象号码, 即使一个或多
27、个 对象号码在这个范围内没有在文件中出现过。见附录 H。例 3.5 展现了一个由 6 个条目组成的一个单独的子部分形成的交叉引用表的一部分: 4 条在使用中, 2条被释放 free。 3 号被删除,下一个被创建的对象有生成数 7.Example 3.5xref0 60000000003 65535 f0000000017 00000 n0000000081 00000 n0000000000 00007 f0000000331 00000 n0000000409 00000 n5 个条目。例 3.6 展示了一个交叉引用部分包含四个子部分,包含总共 Example 3.6 xref 0 1 0000000000 65535 f31 0000025325 00000 n23 2 0000025518 00002 n 0000025635 00000 n30 1 0000025777 00000 n3.4.4 文件追踪器
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1