代码拉取完成,页面将自动刷新
一.语法
1.1.词汇惯例
PDF语法分为四部分来理解
1.对象
PDF文档是由一组基本类型的数据对象组成的数据结构
2.文件结构
PDF文件结构决定了对象如何存储在PDF文件中、如何访问它们以及如何更新它们
3.文档结构
PDF文档结构指定了如何使用基本对象类型来表示PDF文档的组件:页面、字体、注释等
4.内容流
PDF内容流包含一系列描述页面或其他图形实体外观的指令
PDF的对象和文件语法也被用作其他文件格式的基础
在最基本的级别上,PDF文件是一个包含8位字节的序列,这些字节可以根据下面描述的语法规则分组为令牌。一个或多个令牌被组装成更高级的语法实体,主要是对象,它们是用来构建PDF文档的基本数据值。
广泛使用的对象文件结构惯例文档结构内容流将特定的128个字符编码为二进制数字。但是,PDF文件不限于ASCII字符集;它可以包含任意8位字节,但需要以下考虑:
1.分隔对象和描述PDF文件结构的令牌都是用ASCII字符集中编写的,在标准字典中用作键的所有保留单词和名称也是如此。
2.某些类型的对象的字符串和流的数据值可以但不需要完全用ASCII编写。为了说明的目的(如本书所述),ASCII表示是首选。然而,在实际实践中,自然是二进制的数据,如采样图像,直接用二进制表示,以获得紧凑性和效率。
3.包含二进制数据的PDF文件必须通过忠实地保存文件的所有字节来传输和存储;也就是说,作为一个二进制文件,而不是一个文本文件。这样的文件不可移植到施加保留字符代码、最大行长度、行端约定或其他限制的环境中。
1.1.1.字符集
PDF字符集分为三类,规则字符,分隔符和空白字符
这个分类决定了将字符分组为标记,字符串、流和注释.
空白字符:
空白字符是彼此独立的语法结构,如名称和数字。除了注释、字符串和流外,所有的空白字符都是等价的。在所有其他上下文中,PDF将任何连续的空白字符序列视为一个字符
分隔符:
分隔符字符(、)、<、>、[、]、{、}、/和%是特殊的。它们划分了句法实体,如字符串、数组、名称和注释。这些字符中的任何一个都终止之前的实体,不包含在实体中。
规则字符:
除空白字符和分隔符外,所有字符都被称为规则字符。这些字符包括在ASCII字符集之外的8位二进制字符。一个连续的正则字符序列由单个标记组成。
1.1.2.注释
在字符串或流之外出现的任何百分比符号字符(%)都会引入注释。注释由百分比号和行末尾之间的所有字符组成,包括规则字符、分隔符、空格和选项卡字符。PDF会忽略注释,
并将它们视为单个空白字符。也就是说,注释将前面的令牌与后面的令牌分开;因此下面的PDF片段在语法上只等同于令牌abc和123。
abc% comment {/%} blah blah blah
123
1.2.对象
PDF支持八种基本类型的对象
a.布尔值(Boolen values)
b.整数和真实数字(Integer and numbers)
c.字符串(Strings)
d.名称对象(Names)
e.数组(Arrays)
f.字典(Dictionaries)
g.流(Streams)
h.null对象(The null object)
对象可以被标记,以便它们被其他对象引用。已标记的对象称为间接对象。
1.2.1.布尔值
PDF提供了由关键字真和假标识的布尔对象。布尔对象可以用作数组元素和字典条目的值,也可以作为后脚本计算器函数出现,作为布尔和关系运算符的结果,并作为if和ifelse的条件操作符的操作数.
1.2.2.数值对象
PDF提供了两种类型的数字对象:整数和实数。整数对象表示以0为中心的一定区间内的数学整数。实对象近似于数学实数,但范围和精度有限;它们通常以固定点形式表示,
而不是浮点形式表示。数字的范围和精度受到PDF消费者在计算机上使用的内部表示的限制.
整数:123,43445,+17,-98,0
真实值:34.5,-3.62,+123.6
1.2.3.字符串对象
字符串对象由一系列从0到255范围内的字节-无符号整数值组成。字符串对象不是整数对象,而是以更紧凑的格式存储。字符串的长度可能受实现限制
字符串对象可以用两种方式编写:
a.作为括号()中包含的字符序列
b.作为角括号中包含的十六进制数据,<>
小字符串:
文字字符串被写成括号内包含的任意数量的字符。在字符串中,除了不平衡括号和反斜杠外,还可以出现任何字符,这必须特别处理。字符串中的平衡括号对不需要特殊处理。
反斜杠被用作转义字符
十六进制字符串:
字符串也可以以十六进制的形式编写,这对于在PDF文件中包含任意二进制数据非常有用。一个十六进制字符串被写成一个系列的十六进制数字(0-9和a-f或a-f)封闭在角括号内.
1.2.4.名称对象
名称对象是由字符序列唯一定义的原子符号。唯一定义意味着由相同字符序列组成的任意两个名称对象都是相同的同一对象。原子表示名称没有内部结构;虽然它是由一系列字符定义的,但这些字符并不被认为是名称的元素。
名称对象被视为PDF文件中的原子符号。通常,构成该名称的字节永远不会被视为要呈现给人类用户或PDF用户外部的应用程序的文本.然而偶尔需要将名称对象视为文本,例如表示字体名称.
注意:PDF没有规定要选择什么UTF-8序列来将任何外部指定的文本表示为名称对象。在某些情况下,多个UTF-8序列可以代表相同的逻辑文本。由不同字节序列定义的名称对象在PDF中构成了不同的名称对象,
尽管UTF-8序列可能有相同的外部解释。
1.2.5.数组对象
数组对象是按顺序排列的一维对象集合。与许多其他计算机语言中的数组不同,PDF数组可能是异构的;也就是说,数组的元素可能是数字、字符串、字典或任何其他对象的任何组合,包括其他数组。
PDF直接只支持一维数组。更高维度的数组可以通过使用数组作为数组的元素,嵌套到任何深度。
1.2.6.字典对象
字典对象是一个包含对象对的关联表,称为字典的条目。
字典对象是PDF文档的主要构建块。它们通常用于收集和绑定复杂对象的属性,例如文档的字体或页面,字典中的每个条目都指定属性的名称和值。按照惯例,此字典的类型条目标识字典描述的对象类型。
在某些情况下,子类型条目(有时缩写为S)用于进一步识别一般类型的特殊子类别。
类型或子类型条目的值总是一个名称.
1.2.7.流对象
流对象和字符串对象一样,是一个字节序列。但是,PDF应用程序可以逐步读取流,而必须完整地读取字符串。此外,流的长度可以是无限,而字符串受到实现限制。因此,具有潜在大量数据的对象,如图像和页面描述,被表示为流。
流由字典组成,后面是关键字流和端流之间的零或多个字节:
dictionary
stream
...zero or more bytes...
endstream
所有流都必须是间接对象,并且流字典必须是直接对象。流字典后面的关键字流之后应该是一个行末标记.
组成流的字节序列位于流和端流关键字之间;流字典指定确切的字节数。建议在数据之后和端流之前有一个行端标记;该标记不包含在流的长度中。
从PDF1.2开始,字节可以包含在外部文件中,在这种情况下,流字典指定文件,并且流和端流之间的任何字节都会被忽略。
流大小:
每个流字典都有一个长度条目,它指示为流的数据使用了PDF文件的多少字节。(如果流有过滤器,则“长度”是编码数据的字节数。)此外,大多数过滤器的定义使得数据是自限制的;
也就是说,它们使用一种编码方案,其中一个显式的数据结束(EOD)标记分隔数据的范围。最后,流用于表示许多对象,从这些属性可以推断出长度。所有这些约束条件都必须是一致的。
例如,一个具有10行和20列的图像,使用一个颜色组件和每个组件8位,恰好需要200字节的图像数据。如果流使用过滤器,则PDF文件中必须有足够的编码数据字节来产生这200字节。
如果长度太小,如果显式EOD标记发生得太快,或者解码的数据不包含200字节,则会发生错误。如果流包含太多的数据,这也是一个错误,除了在关键字端流之前的PDF文件中可能有一个额外的行端标记。
1.2.8.Null对象
空对象的类型和值与任何其他对象的类型和值都不相等。只有一个类型为null的对象,用关键字null表示。对不存在对象的间接对象引用将视为Null对象。将空对象指定为字典条目的值相当于完全省略该条目。
1.2.9.间接对象
PDF文件中的任何对象都可以被标记为间接对象。这为对象提供了一个唯一的对象标识符,其他对象可以据此将其引用(例如,作为数组的元素或字典条目的值)。对象标识符由以下两部分组成:
a.一个正数的对象号。
b.一个非负的整数生成号。在新创建的文件中,所有间接对象的生成号都为0。在稍后更新文件时,可能会引入非零生成号。
对象号和生成号的组合一起唯一地标识间接对象。对象在整个存在过程中保留相同的对象编号和生成号,即使其值被修改。
PDF文件中间接对象的定义包括其对象号和生成号,然后是关键字obj和endobj之间括号内的对象的值。例如,定义
12 0 obj
(Brillig)
endobj
该对象可以通过由对象号、生成号和关键字R组成的间接引用从文件中的其他地方进行引用:
12 0 R
从PDF1.5开始,间接对象可以驻留在对象流中.
对未定义对象的间接引用不是错误;它只是被视为对空对象的引用。
1.3.过滤
过滤器是流规范的可选部分,指示在使用流中的数据之前必须如何解码流中的数据。
PDF支持一组标准的过滤器,主要分为两类:
a.ASCII过滤器允许对被编码为ASCII文本的任意8位二进制数据进行解码。
b.解压缩过滤器允许对已压缩的数据进行解码。压缩后的数据始终是8位二进制格式,即使原始数据是ASCII文本。(压缩对于大采样图像特别有价值,因为它减少了存储需求和传输时间。某些类型的压缩是有损的,这意味着一些数据
在编码过程中丢失,导致数据被解压缩时的质量损失。没有发生数据丢失的压缩称为无损压缩。)
1.3.1.ASCIIHexDecode Filter
ASCIIHexDecode过滤器解码以ASCII十六进制形式编码的数据。
1.3.2.ASCII85Decode Filter
ASCII85解码滤波器解码用ASCII基85编码的数据并产生二进制数据。
1.3.3.LZWDecode和FlateDecode Filter
LZWDecode和(在PDF1.2中)Flate解码滤波器有很多共同之处。
1.4.文件结构
如何在PDF文件中组织对象,以实现有效的随机访问和增量更新。
1.4.1.文件头
PDF文件的第一行是标识文件符合的PDF规范版本的头。对于符合PDF1.7的文件,报头应该是
%PDF-1.7
1.4.2.文件体
PDF文件的主体由表示文档内容的一系列间接对象组成。
1.4.3.交叉引用表
交叉引用表包含允许对文件中的间接对象进行随机访问的信息,因此不需要读取整个文件来找到任何特定的对象。该表包含每个间接对象的一行条目,其中指定该对象在文件正文中的位置。
交叉引用表是PDF文件中唯一具有固定格式的部分,它允许随机访问表中的条目。该表包括一个或多个交叉参照部分。最初,整个表由一个部分组成(如果文件已线性化,则包含两个部分)。每次更新文件时,将添加一个附加部分。
每个交叉引用部分都以一个包含关键字xref的行开头。下面这一行是一个或多个交叉参照子截面,它们可以以任意顺序显示。该子部分结构对于增量更新很有用,因为它允许在PDF文件中添加一个新的交叉引用部分,其中只包含已
添加或删除的对象的条目。对于从未更新过的文件,交叉引用部分只包含一个子部分,其对象编号从0开始。
每个交叉引用子部分包含连续对象编号范围的条目。
1.4.4.文件追踪表
PDF文件的预告片使应用程序读取该文件能够快速找到交叉引用表和某些特殊对象。
1.4.5.增量更新
PDF文件的内容可以增量更新,而不重写整个文件。更改将附加到文件的末尾,并保持其原始内容的完整。以这种方式更新文件的主要优点是,可以快速保存对大型文档的小更改。还有其他优点:
a.在某些情况下,增量更新是保存更改到文档的唯一方法。
b.一旦签署文档,必须使用增量更新保存对文档进行的所有更改,因为更改文件中的任何现有字节会使现有签名无效。
在增量更新中,任何新的或已更改的对象都会被添加到文件中,并添加一个交叉引用部分,并插入一个新的预告片。
更新文件时添加的交叉引用部分仅包含已更改、替换或删除的对象的条目。已删除的对象在文件中保持不变,但通过它们的交叉引用条目标记为已删除。添加的预告片包含了前一个预告片中的所有条目(可能经过了修改),
以及一个Prev条目,给出了前一个交叉参考部分的位置
由于更新附加到PDF文件中,一个文件可以具有具有相同对象标识符(对象编号和生成号)的对象的几个副本。例如,如果文本注释被多次更改,并且在更改之间保存文件,则可能会发生这种情况。
因为文本注释对象没有被删除,所以它保留了与以前相同的对象编号和生成编号。对象的更新副本包含在添加到文件中的新更新部分中。更新的交叉引用部分包括对对象新副本的字节偏移量,覆盖原始交叉引用部分中包
含的旧字节偏移量。当消费者应用程序读取该文件时,它必须这样构建其交叉引用信息,以便每个对象的最新副本都是在文件中访问的副本。
1.4.6.对象流
PDF1.5引入了一种新的流,一种包含PDF对象序列的对象流。对象流的目的是允许压缩更多的PDF对象,从而大大减小PDF文件的大小。
任何PDF对象都可以出现在对象流中,除了以下例外:
a.对象流
b.生成号不为零的对象
c.文档的加密字典
d.表示对象流字典中的“长度”条目的值的对象
1.4.7.交叉引用流
从PDF1.5开始,交叉引用信息可以存储在交叉引用流中,而不是存储在交叉引用表中。
1.5.加密
PDF文档可以被加密(PDF1.1),以保护其内容免受未经授权的访问。加密适用于文档PDF文件中的所有字符串和流,但不适用于其他对象类型,如整数和布尔值,这些值主要用于传递有关文档结构的信息,
而不是其内容的信息。让这些值不加密允许随机访问文档中的对象,而加密字符串和流可以保护文档的实质性内容。
当一个PDF流对象引用外部文件时,流的内容没有被加密,因为它不是PDF文件本身的一部分.但是,如果流的内容被嵌入到PDF文件中,它们就会像文件中的任何其他流一样进行加密。从PDF1.5开始,嵌入式文件可以在其他未加密的文档中进行加密.
与加密相关的信息存储在文档的加密字典中,它是文档预告片字典中的加密条目的值。预告片字典中没有此条目意味着该文档未被加密。
加密字典的过滤器条目标识了文件的安全处理程序,这是一个软件模块,它实现了加密过程的各个方面,并控制对加密文档内容的访问。PDF指定了一个标准的基于密码的安全处理程序,所有的消费者应用程序都应该支持它,
但是应用程序可以选择提供它们自己的安全处理程序。
1.5.1.通用加密算法
加密PDF文件中的数据时使用以下算法:
a.RC4
b.AES,使用PKCS5填充
PDF的标准加密方法也使用MD5消息摘要算法进行密钥生成.
1.5.2.标准安全处理程序
PDF的标准安全处理程序允许访问权限和最多为文档指定两个密码:一个所有者密码和一个用户密码。应用程序对文档进行加密的决定是基于创建文档的用户是否指定了任何密码或访问限制
(例如,在安全设置对话框中,用户可以在保存PDF文件之前调用该文件)。如果是这样,则将对文档进行加密,验证密码所需的权限和信息将存储在加密字典中。(如果应用程序具有关于要
使用什么密码和权限的其他信息来源,那么它也可以在没有任何用户交互的情况下创建加密文档。)
1.5.3.公钥安全处理程序
安全处理程序可以使用公钥加密技术来加密文档(或文档中的字符串和流)。
1.5.4.加密过滤器
PDF1.5引入了加密过滤器。
1.6.文档结构
PDF文档可以看作是PDF文件的正文部分中包含的对象的层次结构。
1.6.1.文档目录
文档对象层次结构的根目录是目录字典,通过PDF文件预告片中的根目录条目进行定位(请参见第3.4.4节“文件预告片”)。该目录包含对定义文档内容、大纲、文章线程(PDF1.1)、命名目的地
和其他属性的其他对象的引用。此外,它还包含了关于文档应该如何在屏幕上显示的信息,例如是否应该自动显示其轮廓和缩略图页面图像,以及在打开文档时是否应该显示第一页以外的某些位置。
1.6.2.页树
文档的页面通过称为页面树的结构访问,该树定义了文档中页面的顺序。树状结构允许PDF消费者应用程序,只使用有限的内存,快速打开一个包含数千个页面的文档。
该树包含两种类型的节点,中间节点称为页面树节点,叶子节点称为页面对象,其形式将在下面的部分中描述。应用程序应该准备好处理由这些节点构建的任何形式的
树状结构。最简单的结构将由一个页面树节点直接引用文档的所有页面对象。然而,为了优化应用程序的性能,Acrobat蒸馏器程序构建了一种特定形式的树,称为平衡树。
关于这种形式的树的进一步信息可以在Aho、Hopcroft和Ullman的数据结构和算法中找到(请参见参考书目)。
1.6.3.名称字典
PDF文件中的某些对象类别可以通过名称而不是对象引用来引用。名称和对象之间的对应关系由文档的名称字典(PDF1.2)建立,通过文档目录中的名称条目定位。
1.7.内容流和资源
内容流是描述页面和其他图形元素外观的主要方法。内容流依赖于关联资源字典中包含的信息;这两个对象组合起来形成一个独立的实体。本节描述了这些对象。
1.7.1.内容流
内容流是一个PDF流对象,其数据由描述要在页面上绘制的图形元素的一系列指令组成。这些说明以PDF对象的形式表示,使用与PDF文档的其余部分相同的对象语法。
然而,尽管文档作为一个整体是一个静态的、随机访问的数据结构,但内容流中的对象则打算按顺序进行解释和操作。
1.8.通用数据结构
本节描述了文本字符串、日期、矩形、名称树和数字树的数据结构。
1.8.1.字符串类型
PDF支持字符串和文本字符串类型。从PDF1.7开始,字符串类型进一步限定为PDFDocEncodd字符串、ASCII字符串或字节字符串。进一步的限定符反映了用于表示字符串所描述的字符或符号的编码。
a.文本字符串类型
文本字符串类型用于包含旨在使人类可读的信息的字符串,如文本注释、书签名称、文章名称、文档信息等。术语字符串用于描述独立于PDF文档中表示的编码的字符串。
b.PDFDoc编码字符串类型
PDFDocEnsodd字符串类似于字符串对象,但它是一个字符串,使用PDFDocEncond将字符以单个字符表示。注意,PDFDoc编码不支持所有Unicode字符,而UTF-16BE支持。
c.字节字符串类型
字节字符串类型用于以一系列8位字节表示的二进制数据,其中每个字节可以是可以8位表示的任何值。字符串可能表示字符,但编码未知。字符串的字节可能不能代表字符。
1.8.2.文本流
文本流(PDF1.5)是PDF流对象(第3.2.7节),其未编码字节满足与文本字符串(158页的“文本字符串顺序和引字节类型)相同的要求。
1.8.3.日期
PDF定义了一种标准日期格式,与国际标准ASN非常相关。1(摘要语法表示法1),定义见ISO/IEC8824(见参考书目)。日期是表单的ASCII字符串
1.8.4.矩形
矩形用于描述页面上的位置和各种对象的边界框,如字体。矩形写成四个数字的数组,给出一对对角的坐标。通常,数组采用该表单
按该顺序指定矩形的左下角x、左下角y、右上角x和右上角y坐标。然后假设矩形的另外两个角具有坐标(llx、ury)和(urx、lly)。
注意:虽然矩形通常由左下角和右上角指定,但可以指定任意两个对角角。处理PDF的应用程序应该准备在需要特定角的情况下规范化这些矩形。
1.8.5.名称树
名称树与字典的用途类似,即将键和值关联起来,但使用的方式不同。
1.8.6.数字树
数字树类似于名称树,除了它的键是整数而不是字符串,并按升序按数字排序。包含键值对的叶(或根)节点中的条目被命名为Nums,而不是名称树中的名称。
1.9.函数
PDF不是一种编程语言,PDF文件也不是一种程序。然而,PDF确实提供了几种类型的函数对象(PDF1.2)来表示参数化的函数类,包括数学公式和具有任意分辨率的采样表示。
PDF中以各种方式使用,包括用于高质量打印的依赖设备的栅格化信息(半音点函数和传输函数),特定颜色空间的颜色转换函数,以及作为平滑阴影位置函数的颜色规范。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。