pdf reference17 第三章 语法P5796翻译.docx

上传人:b****7 文档编号:9833881 上传时间:2023-02-06 格式:DOCX 页数:14 大小:28.03KB
下载 相关 举报
pdf reference17 第三章 语法P5796翻译.docx_第1页
第1页 / 共14页
pdf reference17 第三章 语法P5796翻译.docx_第2页
第2页 / 共14页
pdf reference17 第三章 语法P5796翻译.docx_第3页
第3页 / 共14页
pdf reference17 第三章 语法P5796翻译.docx_第4页
第4页 / 共14页
pdf reference17 第三章 语法P5796翻译.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

pdf reference17 第三章 语法P5796翻译.docx

《pdf reference17 第三章 语法P5796翻译.docx》由会员分享,可在线阅读,更多相关《pdf reference17 第三章 语法P5796翻译.docx(14页珍藏版)》请在冰豆网上搜索。

pdf reference17 第三章 语法P5796翻译.docx

pdfreference17第三章语法P5796翻译

3.2.5数组对象

数组对象是一个一维的按顺序排列的对象集合。

不像数组在其他计算机语言中一样,pdf数组可能是混杂的;也就是说,数组中的元素可以是数字、字符串、字典或者其他任何对象包括数组本身的组合。

数组写在方括号内[]:

[5493.14false(Ralph)/SomeName]

Pdf直接支持一维数组。

任何深度的多维数组可以用数组作为数组中的元素来创建。

3.2.6字典对象

字典对象是一种连接表(键值对)包含成对的对象,称之为字典中的条目。

每一条的第一个元素是关键字,第二个是值。

关键字必须是一个姓名对象,值可以是任意对象。

一个条目如果它值是null,它相当于一个空条目。

如果一个关键字在字典中出现一次以上,则它的值是undefined。

字典对象用<<>>双尖括号包含起来:

<

/Subtype/DictionaryExample

/Version0.01

/IntegerItem12

/StringItem(astring)

/Subdictionary<

/Item2true

/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

…Zeroormorebytes…

Endstream

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

关键字stream必须跟随在一个EOL(回车换行carriagereturnandalinefeed或者换行alinefeed)之后,不能仅仅在回车之后。

一系列字节放置在关键字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所有流字典中常见条目

Key

Type

Value

Length

Integer

必须的,stream和endsteam之间的所有字节数

Filter

Nameorarray

可选的,处理数据使用的filter的名字

DecodeParms

Dictionaryorarray

可选的,参数/数组字典,过滤器参数字典

F

文件说明

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

如果有这个条目,stream和endstream之间的数据会被忽略掉,过滤器会在FFilter中说明而不是Filter中,过滤器中的参数会在FDecodeParms中说明。

FFilter

Nameorarray

可选的,显示在处理外部文件数据是使用的过滤器的名字

FDecodeParms

Dictionaryorarray

可选的,FFilter中说明使用的Filter中的参数字典,或者这类字典的数组。

其他同样的规则应用于DecodeParms

DL

Integer

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

可以用来检查是否有足够的磁盘空间可用来写流文件。

应当仅仅作为一个提示,在游戏流过滤器中,它不能准确测试文件长度。

3.2.8空对象

空对象有一个类型和一个值,它不同于其他任何对象。

这里只有一种空对象,称之为null。

间接对象参考中(详见3.2.9,间接对象)对待一个不存在的对象我们叫他空对象。

特定地指明空对象是字典条目中值为空,与这个条目根本不存在时等价的。

3.2.9间接对象

Pdf文件中的任何一个对象都会被一个间接对象作为标签。

这给明了对象一个唯一的对象识别码,其他对象可以通过它来查找对象。

这个对象识别码包含两部分:

·一个正整数对象号码。

间接对象常常按顺序序号在pdf文件中排号,但不是必须的;对象号码可以被分配为任意的号码顺序。

·一个非负整数的生成数(世代号)。

在一个新建的文件中,所有间接对象都有一个生成数0。

非零生成数在文件被后来更新时被创建;详见3.4.3节,“交叉引用表”,和3.4.5节“增量更新”。

对象号码和生成数同时唯一确定一个间接对象。

对象在他的生命周期中保留这个不变的对象号码和生成数,甚至它的值改变。

Pdf文件中间接对象的定义,它包含对象号码和生成数,跟在在obj和endobj之间的对象值后面,例如:

120obj

(Brillig)

Endobj

定义了一个间接字符串对象,对象号码12,生成数0,值为Brillig。

这个对象可以在任何地方被索引到,使用由对象号码、生成数和关键字R组成的间接对象引用:

120R

从pdf1.5开始,间接对象可以放在对象流中。

使用同样的方式引用它们;但是定义不包含关键字obj和endobj。

一个未定义对象的间接引用不是错误;而是一个空对象的间接引用。

例3.1中展示了间接对象用来确定流的长度的用法。

流对象的长度的值是在流对象后的一个整数对象。

这样做允许了应用程序在直到它的内容生成后,创建pdf之前,运行一遍来确定流的长度。

Example3.1

70obj%间接对象,对象号码7,生成数0,关键字obj

<>%Anindirectreferencetoobject8

stream

BT

/F112Tf

72712Td

(Astreamwithanindirectlength)Tj

ET

endstream

endobj

80obj

77%Thelengthoftheprecedingstream

Endobj

3.3过滤器

流过滤器是在3.2.7节(流对象)中引入的。

一个过滤器是描述一个流对象的可选的部分,表明在使用流对象中的数据之前如何对其进行解码。

例如,如果一个流对象具有一个ASCIIHexDecode过滤器的话,一个应用读取这些数据时会将ASCIIhexadecimal编码的数据转化为二进制数据。

一个创建pdf文件的应用程序可以编码某些信息(例如,样本图片数据)来压缩或者转化为便携式的ASCII表现形式。

这样当一个应用读取pdf文件时可以调用相应的解码过滤器来见信息转换回原始格式的数据。

过滤器或者流过滤器都是在流字典中的Filter条目中被定义的。

过滤器可以被连接形成一个管道,来让流按顺序通过两个或者更多的解码转换。

例如,数据编写使用LZW和ASCIIbase-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

no

ASCII85Decode

no

LZWDecode

yes

FlateDecode

yes

RunLengthDecode

no

CCITTFaxDecode

yes

JBIG2Decode

yes

DCTDecode

yes

JPXDecode

no

Crypt

yes

Example3.2

10obj

<

/Filter[/ASCII85Decode/LZWDecode]

>>

stream

J..)6T`?

p&

J9%_[umg"B7/Z7KNXbN'S+,*Q/&"OLT'F

LIDK#!

n`$"c!

Jnl@

RM]WM;jjH6Gnc75idkL5]+cPZKEBPWdR>FF(kj1_R%W_d

&/jS!

;iuad7h?

[LF$+]]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

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

Example3.3

10obj

<>

stream

2J

BT

/F112Tf

0Tc

0Tw

72.5712TD

[(Unencodedstreamscanbereadeasily)65(,)]TJ

014TD

[(b)20(utgenerallytak)10(emorespacethan\311)]TJ

T*(encodedstreams.)Tj

028TD

[(Se)25(v)15(eralencodingmethodsarea)20(v)25(ailableinPDF)80(.)]TJ

014TD

(Someareusedforcompressionandotherssimply)Tj

T*[(torepresentbinarydatainan)55(ASCIIformat.)]TJ

T*(Someofthecompressionencodingmethodsare\

suitable)Tj

T*(forbothdataandimages,whileothersare\

suitableonly)Tj

T*(forcontinuoustoneimages.)Tj

ET

endstream

endobj

3.3.1ASCIIHexDecodeFilter

3.3.2ASCII85DecodeFilter

3.3.3LZWDecodeandFlateDecodeFilters

3.3.4RunLengthDecodeFilter

3.3.5CCITTFaxDecodeFilter

3.3.6JBIG2DecodeFilter

3.3.7DCTDecodeFilter

3.3.8JPXDecodeFilter

3.3.9CryptFilter

3.4FileStructure

先前的章节介绍了单个对象的语法。

这章介绍这些对象是如何有效随机获得和增量更新而组织成一个pdf文件的。

一个标准的权威的pdf文件最初包含四个元素,如图3.2:

·一行文件头header,标识pdf文件的版本。

·一个主体body,文件中包含的所有对象。

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

·一个追踪器trailer,提供交叉引用表、某些特别的对象在文件主体中的位置。

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

图3.2最初的pdf文件结构

我们约定,pdf中tokens是一行行的排列的。

每一行都以EOL(回车代码13,换行代码10)标记作为结束。

二进制数据的pdf可以由任意多的行数。

但是,为了提高pdf文件被其他应用程序处理时的兼容性,不是流对象数据的行不例外地被限制为不超过255个字符。

从pdf1.3开始,签名字典中的字符串内容不受行长度限制(见8.7节,数字签名)。

详见附录H。

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

然而,应用于pdf文件的额外的一些规则使得在联网环境中文件组成部分的高效增量授权功能得以应用,我们称之为线性化的pdf(LinearizedPDF),见附录F。

3.4.1文件头FileHeader

文件的第一行就是header,用来鉴别pdf文档的版本,说明文档是遵从那个标准写的,例如一个文件遵从pdf1.7,文件头应该是:

%PDF-1.7

遵从于先与1.7的任何版本,同样都遵从1.7版。

新版兼容老版本。

从pdf1.4开始,文件头中的版本号可以通过文件目录字典中的Version条目被重写。

这赋予一个pdf创建应用程序能够通过增量更新来更新pdf版本号的方法。

在某些条件下,一个消费者应用程序可以使用最新的pdf版本的处理方法来处理pdf文件。

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

见H.1,pdf版本号。

当pdf文件中包含二进制数据时,推荐header行后立即街上一段注释行,其中包含至少4个二进制字符(1000以上)。

这样就能保证处理时正确对待pdf中的二进制数据。

3.4.2文件主体FileBody

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

对象是3.2节中讲的主要基本类型,代表文档的组成部分,例如字体,页码,样本图。

从pdf1.5开始,主体也可以包含对象流,每一个对象流包含一系列的间接对象;见3.4.6,对象流。

3.4.3交叉引用表

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

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

交叉引用表是pdf文件中唯一固定格式的部分,来提供对表中条目的随机访问。

这个表包括一个或者多个交叉引用章节。

最初,整张表有一个单独部分组成,如果文件时线性化的有两部分组成。

每次文件更新时,会添加一个新的部分。

每个交叉引用部分都是以关键字xref开头。

这行之后是一个活多个交叉引用子章节,会无序地出现。

子章节的结构可以方便增量更新,因为他允许新的交叉引用部分添加进pdf文件中,其中包含新增或者删除掉的对象条目信息。

例如一个从来没有修改更新过的pdf文件看,他的交叉引用表只包含一个以对象号码0开头的子章节。

每一个交叉引用子章节包含临近的一部分对象号码的条目信息。

子章节以包含两个以空格隔开的数字为开头:

这一个子章节首个对象的对象号码和这个子章节中的条目数。

例如:

285表示一个子章节包含5个对象,编码从28到32.

注意:

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

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

每一条的长度都是20字节,包括EOL标记。

有两种交叉引用条目:

一种是真正使用的对象,另一种是已经被删除的对象。

他们有同样的基本格式,通过关键字区分n(使用中),f(已删除)。

例如

Nnnnnnnnnngggggneol

其中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.

Example3.5

xref

06

000000000365535f

000000001700000n

000000008100000n

000000000000007f

000000033100000n

000000040900000n

例3.6展示了一个交叉引用部分包含四个子部分,包含总共5个条目。

Example3.6

xref

01

000000000065535f

31

000002532500000n

232

000002551800002n

000002563500000n

301

000002577700000n

3.4.4文件追踪器

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1