admin管理员组

文章数量:1530353

2024年7月19日发(作者:)

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

条目的值可能是

Typel

,

TrueType

或者其

他几个值。

Type

条目的值几乎可以总是从内容中推断出来。操作符

Type

条目在字体字典中主要是作为文件编制和错误检查的信息。

除非在描述中强调,在字典甚至私有数据中

注册姓名;详见附录

E

TF

,是一个

font

对象;因此,

Type

条目是不强制要求的

Type

条目的值必须是这本书中定义的姓名或者

3.2.7 流对象

一个流对象就像字符串对象一样,是一系列的字节。不同的是,

取流对象,但是字符串对象必须完全的被读取。更进一步说,

pdf

应用可以增值地读

流对象可以是无限长的, 而字

例如图 符串是受实施实现限制的。 基于这个原因,很大的数据或者可能会变得很大的数据,

片,页面描述等都以流对象来呈现。

一个流对象包括:一个

dictionary

和之后的

stream

endstream

之间的部分:

dictio nary stream

Zero or more bytes

En dstream

所有的流对象都必须是间接对象,同事流字典必须是直接对象。关键字

stream

必须跟

随在一个

EOL

(回车换行

carriage return and a line feed

或者换行

a line feed

)之后,不能仅仅 在回车之

后。一系列字节放置在关键字

stream

endstream

之间;流字典区分字节中每一

个数的意义。推荐放置一个

EOL

在数据之后

endstream

之前;这个标记不被包含在流的长度 之中。

可选择的是,从

pdf1.2

开始,字节流可以被放置在一个外部文件中,流字典来说明这 些文件,同事

stream

endstream

之间的字节都会被忽略。详见附录

如果不限制反对单独使用回车在

的流对象并且有一个换行符是数据的第一个字节和使用回车换行作为

对象的描述在什么地方。

流对象中的数据。过滤器在

H

EOL

记号

EOL

记号的流对象。

stream

之后,就不能区分一个使用回车作为

3.4

列出了全部流字典中常见的条目;某些流对象的类型具有其他附加的字典条目, 用来指明这些流

可选择的条目把过滤器视为指明在使用前怎样转换

3.3

节中有详细介绍。

流对象的长度

extent

每一个流字典有一个长度条目指明

字有自我限制;也就是说他们使用编码规划,

pdf

文件有多少字节用来作为流数据。 (如果流对象

有过滤器的话,长度条目指的是编码长度的数字字节) 另外,很多过滤器被定义是为了让数

其中有明确的

EOD

标记限制数据长度。 最终,

流对象被用来呈现很多长度属性可以被推断出来的对象。所有的这些限制必须是一致的。

例如,一张

10

20

列的图片,使用单独颜色组成,每个组成部分都是

字节的图像数据。如果这个流使用了过滤器, 这里就必须足够的字节来编码

来提供

200

字节。如果设定的长度值太小,如果一个明确的

码数据不是

200

字节,都会出错。

如果一个流对象包含太多数据也会出错,例外情况是有一个额外的

8

位,需要

200

pdf

文件中数据

EOD

标记出现的太早,或者解

EOL

标记在

endstream

之前。

3.4

所有流字典中常见条目

Key

Len gth

Filter

DecodeParms

F

Type

In teger

Name or array

Dictionary or array

Value

必须的,

stream

禾口

endsteam

之间的所有字节数

可选的,处理数据使用的

filter

名字

可选的,参数

/

数组字典,过 滤器

参数字典

可选的,文件包含流数据。如 果有

这个条目,

stream

文件说明

endstream

之间的数据会被忽

略掉,过滤器会在

FFilter

说明而不是

Filter

中,过滤器 中的

参数会在

FDecodeParms

中说

明。

FFilter

FDecodeParms

Name or array

Dictionary or array

可选的,显示在处理外部文件 数据

是使用的过滤器的名字

可选的,

FFilter

中说明使用的

Filter

中的参数字典,或者这 类字

典的数组。其他同样的规 则应用于

DecodeParms

DL In teger

可选的,非负整数表现解码流 中的

数据。可以用来检查是否 有足够的

磁盘空间可用来写 流文件。应当仅

仅作为一个提 示,在游戏流过滤器

中,它不 能准确测试文件长度。

328空对象

空对象有一个类型和一个值,它不同于其他任何对象。这里只有一种空对象,称之为

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

/F1 12 Tf

72 712 Td

(A stream with an indirect length) Tj

ET endstream endobj 8 0 obj 77 % The length of the preceding stream Endobj

%

间接对象,对象号码

7

,生成数

0

,关键字

obj

<< /Length 8 0 R >> % An indirect reference to object 8 stream BT

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

是同样的流,但

是没有编码。

名字

3.5

标准的过滤器详见原文档

P67

是否有参数

ASCIIHexDecode

ASCII85Decode

LZWDecode

FIateDecode

RunLen gthDecode

no

no

yes

yes

no

CCITTFaxDecode

JBIG2Decode

DCTDecode

JPXDecode

yes

yes

yes

no

yes Crypt

Example 3.2

1 0 obj

<< /Len gth 534

/Filter [/ASCII85Decode /LZWDecode]

>>

stream

J..)6T'?p&

&'cA*Vn KCJY(sF>c!J nl@ RM]WM;jjH6G

nc75idkL5]+cPZKEBPWdR>FF(kj1_R%W_d &/jS!;iuad7h?[L

F$+]]OA3Ck*$IOKZ?;<)CJtqi65Xb

Vc3n5ua:Q/=0$W<#N3U;H,MQKqfg1?:IUpR;6oN[C2E4 ZNr8Ud n.

'p+?#X+1>OKuk$bCDF/(3fL5]OqFkJZ!C2H1 'TO]RI?Q:&' <5 &

iP!$Rq;BXRecDN[IJB',)o8XJOSJ9sD S]hQ;Rj@!ND)bD_ q& Cg:i nY

C%)&u#:u,M6Bm%IY!Kb1 + ":aAa'S'ViJglLb8

aI>iG1p & i;eVoK&juJHs9%;Xomop"5KatWRT"JQ#qYuL, JD?M$0QP)IK

n06l1apKDC@qJ4B!!(5m+j.7F790m(Vj8 8I8Q:_CZ(Gm1%XN1 &u!FKHMB~> en

dstream en dobj

ExampIe 3.3

1 0 obj

<< /Length 568 >>

stream

2 J

BT

/F1 12 Tf

0 Tc

0 Tw

72.5 712 TD

[(Unencoded streams can be read easily) 65 (, )] TJ

0 14 TD

[(b) 20 (ut generally tak) 10 (e more space than 311)] TJ

T* (encoded streams.) Tj

0 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 simply) Tj

T* [(to represent binary data in an ) 55 (ASCII format.)] TJ

T* (Some of the compression encoding methods are suitable ) Tj

T* (for both data and images, while others are

suitable only ) Tj

T* (for continuous tone images.) Tj

ET

endstream

endobj

3.3.1 ASCIIHexDecode Filter

3.3.2 ASCII85Decode Filter

3.3.3 LZWDecode and FlateDecode Filters

3.3.4 RunLengthDecode Filter

3.3.5 CCITTFaxDecode Filter

3.3.6 JBIG2Decode Filter

3.3.7 DCTDecode Filter

3.3.8 JPXDecode Filter

3.3.9 Crypt Filter

3.4 File Structure

先前的章节介绍了单个对象的语法。 这章介绍这些对象是如何有效随机获得和增量更新 而组织成一个

pdf

文件的。一个标准的权威的

pdf

文件最初包含四个元素,如图

•一行文件头

header

,标识

pdf

文件的版本。

•一个主体

body

,文件中包含的所有对象。

•一个交叉引用表,包含文件中的间接对象的信息。

•一个追踪器

trailer

,提供交叉引用表、某些特别的对象在文件主体中的位置。

3.2

这些原始的结构可能被以后的更新所修改,例如在文件尾添加额外的元素,详见 节“增量更

新”

3.4.5

hkdlkl

----------------------- 图

3.2

最初的

pdf

文件结构

我们约定,

pdf

tokens

是一行行的排列的。每一行都以

EOL

(回车代码

13

,换行代码

10

)标记作

为结束。二进制数据的

pdf

可以由任意多的行数。但是,为了提高

他应用程序处理时的兼容性,不是流对象数据的行不例外地被限制为不超过

pdf

文件被其

255

个字符。从

pdf1.3

开始,签名字典中的字符串内容不受行长度限制

这里描述的规则足够创建一个格式良好的

(见

8.7

节,数字签名)。详见附录

H

我们称之为线性化的

pdf

文件。然而,应用于

pdf

文件的额外的一

些规则使得在联网环境中文件组成部分的高效增量授权功能得以应用,

pdf

Linearized PDF

),见附录

F

3.4.1 文件头 File Header

文件的第一行就是

header

,用来鉴别

pdf

文档的版本,说明文档是遵从那个标准写的,

例如一个文件遵从

pdf1.7

,文件头应该是:

遵从于先与

1.7

的任何版本,同样都遵从

赋予一个

pdf

创建应用程序能够通过增量更新来更新

在某些条件下,一个消费者应用程序可以使用最新的

PDF-1.7

1.7

版。新版兼容老版本。

Version

条目被重写。这

pdf

版本号的方法。

pdf

版本的处理方法来处理

pdf

H.1

pdf

版本号。

pdf

中的二进制数据。

pdf1.4

开始,文件头中的版本号可以通过文件目录字典中的

件。新版本中的功能特性可以自动安全的被不认识他的版本忽略掉。见

pdf

文件中包含二进制数据时,推荐

header

行后立即街上一段注释行,其中包含至

4

个二进制字符(

1000

以上)。这样就能保证处理时正确对待

3.4.2 文件主体 File Body

Pdf

文件的主体包含一系列的间接对象呈现了文档中的内容。对象是

基本类型,代表文档的组成部分,例如字体,页码,样本图。从

包含对象流,每一个对象流包含一系列的间接对象;见

3.2

节中讲的主要

pdf1.5

开始,主体也可以

3.4.6

,对象流。

3.4.3

交叉引用表

交叉引用表包含文件中到间接对象的随机接近许可, 这样就不需要读取整个文件来定位

某个特定的对象。这个表包括每一行都是一条间接对象,指明对象在文件主体中的位置。

交叉引用表是

pdf

文件中唯一固定格式的部分, 来提供对表中条目的随机访问。 这个表 包括一个或者

多个交叉引用章节。 最初, 整张表有一个单独部分组成, 如果文件时线性化的 有两部分组成。每次文件更

新时,会添加一个新的部分。

每个交叉引用部分都是以关键字

xref

开头。这行之后是一个活多个交叉引用子章节,

会无序地出现。子章节的结构可以方便增量更新,因为他允许新的交叉引用部分添加进

文件中,其中包含新增或者删除掉的对象条目信息。例如一个从来没有修改更新过的

文件看,他的交叉引用表只包含一个以对象号码

0

开头的子章节。

每一个交叉引用子章节包含临近的一部分对象号码的条目信息。 子章节以包含两个以空 格隔开的数字

为开头:这一个子章节首个对象的对象号码和这个子章节中的条目数。例如:

28 5

表示一个子章节包含

5

对象,编码从

28

32.

注意:一个对象号码不能同时出现在两个或两个以上的同一个引用表部分的不用子章节 中。

在此之后的每一行是一条交叉引用条目。每一条的长度都是

20

字节,包括

EOL

标记。 有两种交叉引

用条目: 一种是真正使用的对象, 另一种是已经被删除的对象。 他们有同样的 基本格式,通过关键字区分

pdf

pdf

n

(使用中),

f

(已删除)。例如

Nnnnnnnnnn ggggg n eol

其中

nnnnnnnnnn

是一个十位数字字节的开销,表示文件开头到对象开头之间的字节数,来 指明对象在文件

中的具体位置,不足

10

位的话前面补

0

Ggggg

是一个

5

位数字生成数,不足

5

位的话前面补

0

N

是关键字说明这个条目在使用中

Eol

是一个

2

位字符代表

end-of-line

总长度

10+1+5+1+1+2=20

被删除的条目使用

f

代替

n

,他们形成一个链接表,每一个被释放的条目包含下一个被 释放条目的对象号

码。表中的第一个条目是一个总是为显示已删除的条目,它的生成数为

65535

;它是链接表的标头。 最后一

个被释放的条目链接回对象号码为

0

并且生成数为

65535

的条目。

除了对象号码为

0

的条目之外, 所有交叉引用表中的对象的初始生成数都为

象被删除一次时,他的交叉引用表中的条目被标记为

0.

当间接对

f

,同事添加进入被释放链接表中。条

目的生成数自增

1

来表明他被使用的次数。 这样,每次这个条目被重新使用时, 生成数加

1

。 最大生成数为

65535

;当达到这个数时,就不会再重用它了。

交叉引用表必须包含一条从对象号码

0

到文件中使用的最大对象号码, 即使一个或多个 对象号码在这个

范围内没有在文件中出现过。见附录

H

3.5

展现了一个由

6

个条目组成的一个单独的子部分形成的交叉引用表的一部分:

4

条在使用中,

2

条被释放

free

3

号被删除,下一个被创建的对象有生成数

7.

Example 3.5

xref

0 6

65535 f

00000 n

00000 n

00007 f

00000 n

00000 n

3.6

展示了一个交叉引用部分包含四个子部分,包含总共

Example

5

个条目。

3.6 xref 0 1

65535 f

3 1 00000 n

23 2 00002 n 00000 n

30 1 00000 n

3.4.4 文件追踪器

本文标签: 对象文件数据包含条目