PDF1.7中文版参考作者:付博QQ:1151639935Email:fubo0624@163.comPDF1.7文档规范概述PDF是一种显示文档的文件格式,它独立于创建它的应用软件、硬件、操作系统、显示或打印它的输出设备。PDF由一个描述一个或多个页面的对象集合构成,也有可能另外包含一些交互式元素或抽象应用数据。PDF页可以包含任何文本、图形、图像。PDF页面由一个PDF内容流描述,PDF内容流是一个要在页面上绘制的图形对象序列。PDF页面的布局、格式等任何显示方式都己经由生成内容流的应用程序规定好了。除了可以包含静态页面外,PDF文档还可以包含交互元素。PDF支持对文本、超连接、标记、文件连接、声音、视频的注释。一个文档可以定义自己的用户界面:鼠标、键盘输入可以触发PDF对象规定的动作。PDF文档可以包含接受用户输入的表格字段,用户可以导出它的值,也可以从其它程序导入数据。第1章语法(Syntax)这一章详细介绍PDF对象、文件及文档的语法规范。它为后续章节PDF1.7中文版参考作者:付博QQ:1151639935Email:fubo0624@163.com中关于PDF文件内容如何被解释成页描述、交互式导航辅助对象以及应用级逻辑结构奠定基础。PDF语法可以通过以下四部分来理解:●对象(Object):PDF文档是一个由部分基本数据类型对象组成的数据结构。本章第1节“词法约定”将描述用于构成PDF对象和其它语法元素的字符集。第2节“对象”将描述对象的语法和基本属性,还将详述PDF中最复杂的对象——流对象。●文件结构(FileStructure):PDF文件结构规定了对象如何在文件中被存储、访问、更新。其结构与对象的语义无关。本章第4节“文件结构”将详述PDF文件结构。第5节将介绍一个使文档不受非法访问的文件级保护机制。●文档结构(DocumentStructure):PDF文档结构规定了如何用基本对象类型表示一个PDF文档组件(Component):页面、字体、注释等。本章第6节“文档结构”描述PDF文档总体结构,后续章节再详述各文档组件的语义。●内容流(ContentStream):PDF内容流包含一个指令序列,用于描述页面或其它图形实体的显示。尽管这些指令也被表示为一个个对象,但它们在概念上区别于代表文档结构的对象,并被单独规定。本章第7节“内容流与资源”将讨论PDF内容流及相关资源。PDF1.7中文版参考作者:付博QQ:1151639935Email:fubo0624@163.com图1PDF组件1.词汇约定在最底层,PDF文件就是一个8位字节序列。这些字节序列可以根据如下语义规则分组成若干token。一个或多个token组成一个更高一级的语义实体(主要是构成PDF文档基本数据的对象)。PDF文件可全部由可见可打印ASCII字符子集和空白符(例如Space、Tab、回车、换行)对应的8位字节来表示。但PDF文件并不局限于ASCII字符集,实际上它可以包含任意8位字节,只要遵循如下要求即可:●分隔对象和描述文件结构的token全以ASCII表示,所有保留关键字和标准字典中的键值名也以ASCII表示。●特定类型对象的数据值可以但不必全为ASCII,但出于可读性,最好用ASCII表示。在实际中,一些本身就是二进制的数据,例如图像,出于压缩和效率,最好直接以二进制表示。●包含二进制的PDF文件必须在传输和存储过程中保留所有原始字PDF1.7中文版参考作者:付博QQ:1151639935Email:fubo0624@163.com节,也就是作为一个二进制文件而不是一个文本文件。这样一个二进制文件不便于使用了保留字符、最大行长度、换行约定或其它限制的环境。1.1字符集PDF字符集分成三大类:常规字符、分隔符、空白符。这种分类方法决定了通常如何将字符分成token。但在字符串、流对象和注释内部有着不同的规则,这种分类不适用。空白字符分隔语法结构,例如名称和数字。所有的空白字符都是等同的,除了在字符串、流、注释内部。在所有其它上下文中,PDF将若干个连续的空白字符视作一个空白字符对待。空白字符十进制十六进制字符名000空白(NULL)909制表(HT)100A换行(LF)120C换页(FF)130D回车(CR)3220空格(SP)回车CR和换行LF都是行结束(EOL)标志,CR后跟一个LF(即CRLF)被当作一个EOL标志。大多数情况下,EOL和其它空白字符作用是一样的,但有时必须或建议使用EOL标志——即空白符后面的TOKEN一定出现在新行开始。注意:本文的示例将TOKEN全放在新行,这是一种好的习惯。但本文示例中用于行首缩进的空白字符只是为了结构清晰而己,实际应用中不建议这样做。PDF1.7中文版参考作者:付博QQ:1151639935Email:fubo0624@163.com分隔符包括(,),,,[,],{,},/,%,它们都有特点作用。它们分隔语法实体,例如字符串、数组、名称、注释。任一分隔符都是它前面的实结束标志,但分隔符本身不包含在实体中。空白符和分隔符外的所有字符都归属于常规字符。常规字符包含ASCII字符集以外的任意8位二进制字符。连续的若干常规字符构成一个TOKEN。注意:PDF是对大小写敏感的,大小字符和对应的小写字符具有不同意义。1.2注释字符串或流外部出现的任一百分号%标志着一条注释的开始。注释的内容由%和行结束符EOL之间的全部字符构成,可以包含常规字符、分隔符、空格和制表符。PDF忽略注释,将一条注释当作一个空白符。也就是说,一条注释有分隔其前后token的作用。例如:abc%comment{/%)blahblahblah123在语义上仅仅相当于abc和123两个token。注释(除了第4节描述的%PDF-n.m和%%EOF两个注释)没有任何语义。PDF应用软件完全可以忽略它们。2对象PDF支持以下8种基本对象:PDF1.7中文版参考作者:付博QQ:1151639935Email:fubo0624@163.com◆逻辑值(Boolean)◆整数和实数(Integerandrealnumbers)◆字符串(String)◆名称(Name)◆数组(Array)◆字典(Dictionary)◆流(Stream)◆空对象(NullObject)对象可以被标记,被标记对象称作间接对象(IndirectObject)。以下几小节详述各种对象,以及如何创建和引用间接对象。2.1逻辑对象(BooleanObject)逻辑对象以关键词true和false识别。逻辑对象可以作为数组和字典项的值,也可以用在Postscript解算器函数中(将在本章第9节“函数”中描述)。2.2数值对象(NumericObject)PDF规定了两种数值类型:整数(Integer)和实数(Real)。其中实数以定点小数形式表示。数值类型其值的范围受运行PDF应用软件的计算机的内部表示限制。PDF1.7中文版参考作者:付博QQ:1151639935Email:fubo0624@163.com整数以一个或多个十进制数字表示,前面可选择性地加上正负号:例如:12343445+17−980它们将被解释为有符号整数,并被转换为整数对象。如果整数对象的值超过了其实现范围,则被转换为实数对像。实数以带有可选正负号的一个或多个十进制数字表示,其首位或末位或中间有一个小数点:例如:34.5−3.62+123.64.−.0020.0它们将被解释为实数并被转换为一个实数对象。如果实数的值超过其实现范围,并会引发一个错误出现。注意:PDF不支持非十进制的数值表示,也不支持指数格式的数值表示。本书中的“数值类型”均指整数类型或实数类型,凡实数出现的地方都有可能用一个整数替代并将被自动转换成等价的实数。例如实数形式的1.0用整数1代替完全可以。2.3字符串对象(StringObject)字符串对象可以两种形式表示:◆包含在圆括号中的原义字符序列;◆包含在尖括号中十六进制数据;本节只介绍书写一个字符串序列的基本语法。字符串可以用于多种用途,并且可以多种方式格式化。在实际情况中,同一种用途的字符串以相同方式格式化是很有必要的。这些格式只是用于解释字符串内容的某种约定,并非另外一种对象。PDF1.7中文版参考作者:付博QQ:1151639935Email:fubo0624@163.com本章第8节将介绍字符串对象编码方式。2.3.1原义字符串原义字符串以括在圆括号中的任意数量的字符表示。除了不匹配的圆括号(即非成对出现的圆括号)和反斜杠需特殊处理外,原义字符串中可出现任意字符。字符串中成对出现的圆括号无需特殊处理,将被当作字符串内容的一部分。下面列出一些有效的原义字符串示例:(Thisisastring)(Stringsmaycontainnewlinesandsuch.)(Stringsmaycontainbalancedparentheses()andspecialcharacters(*!&}^%andsoon).)(Thefollowingisanemptystring.)()(Ithaszero(0)length.)在原义字符内部,反斜杠“\”被用于转义字符,例如在字符串中包含一个换行符、非打印ASCII字符、不匹配括号或反斜杠“\”本身。紧跟在反斜杠后的字符决定了此转义字符的确切用途。如果反斜杠后的字符非下表中字符之下,则此反斜杠被忽略。原义字符串中的转义字符序列字符序列意义\n换行\r回车\t水平制表符\b退格\f换页\(左圆括号\)右圆括号\\反斜杠\ddd以八进制格式表示的字符PDF1.7中文版参考作者:付博QQ:1151639935Email:fubo0624@163.com原义字符串中,\紧跟着一个行结束符EOL(CR或LF或CRLF)代表一个续行符,通常在不便于将所有字符放在同一行中时使用,而这个续行符不被认为是字符串内容的一部分。例如:(These\twostrings\arethesame.)(Thesetwostringsarethesame.)这两个字符串有效内容完全一样。而EOL单独出现在原义字符串中,前面无\时,这个EOL等价于\n。\ddd转义字符可用于表示非打印ASCII字符。其中ddd为三个八进制数字,是对应ASCII的值。当这个字符后面紧跟又一个数字时,这三位都得写全,即使高位为0也得写上,以免出现歧义。(Thisstringcontains\245twooctalcharacters\307.)例如(\0533)表示字符串+3。2.3.2十六进制字符串PDF中字符串也可以十六进制表示,这便于在PDF文件中包含任意二进制数据。十六进制字符串以括在尖括号中的十六进制数字(0-9或A-F)串表示。例如:4E6F762073686D6F7A206B6120706F702E每两个十六进制数字代表一个字符,空白符将被忽略。如果最后一位十六进制数字缺失,即有奇数个十六进制数字,则缺失的那一位被认为是0。例如:901FA被为等于901FA0。2.4名称对象(NameObject)名称对象是由一个字符串序列惟一定义的原子级符号。惟一意味着任何两个具有相同字符序列的名称对象被视为同一个对象。原子级PDF1.7中文版参考作者:付博QQ:1151639935Email:fubo0624@163.com意味着名称对象没有内部结构,尽管它是由若干字符组成,但这些字符不被认为是名称对象的子元素。一个斜杠”/”引导一个名称对象,但斜杠本身并非名称对象的内容,而是标志着其后的字符序列构成一个名称对象。“/”和名称的首字符中间不能有空白字符。名称中可包含任意常规字符,但不能包含分隔符或空白符。名称对大小写敏感,例如”/A”和”/a”是不同的两个名称对象。下面是几个有效的名称对象:/Name1/ASomewhatLongerName/A;Name_With−Various***Characters?/1.2/$$/@pattern/.no