一、简介
PDF是PortableDocument Format(便携文件格式)的缩写,是由Adobe 公司开发而成的一种电子文件格式,PDF文件支持跨平台,与软、硬件环境,操作系统,打印设备均无关。PDF 文件是以PostScript语言图像模型为基础,无论在哪种打印机上都可保证精确的颜色和准确的打印效果,即PDF会真实地再现原稿的每一个字符、颜色以及图像。
PDF具有许多其他电子文档格式无法相比的优点。PDF文件格式可以将文字、字型、格式、颜色及独立于设备和分辨率的图形图像等封装在一个文件中。该格式文件还可以包含超文本链接、声音和动态影像等电子信息,支持特长文件,集成度和安全可靠性都较高。
一个PDF文件由对象的集合组成,也包含附加的交互式元素和高级应用程序数据。PDF文件中的对象用来描述一个或多个页面的表现样式,和结构信息一起构成PDF文档,整个文档可以看成是一系列独立的字节序列。
一个PDF文档页(或其他可见元素)可以包含文本、图形、图像任意的组合。页面的表现形式可以描述为PDF内容流,包含能够打印在纸上的一系列图形对象。为显示页面的静态样式,PDF文档还包含只在电子方式下表示的交互式元素。
PDF支持各种标注( annotations )如:文本注释( text notes), 超文本链接(hypertext links),标记(markup), 附件(file attachments),声音(sounds)和动态影像(movies)。一个文档可以自定义用户界面;键盘和鼠标可以用来触发PDF对象定义的操作。文档可以包含交互式表格然后由用户来进行填写,还可以将这些数据导出到其他应用程序中或者从其他应用程序中导入数据。
最后,一个PDF文件还可以包含应用程序中用于内容交互的高级信息。为了指定外观表现,文档可以包含识别技术和逻辑结构信息并且允许在任何可用的地方被搜索、编辑、或者提取。
二、PDF语法
1.对象(Objects):
一个PDF 文件是由基本类型的数据对象组成的一个数据结构体。
(1)“常规语法”(Lexical Conventions):
一个PDF文件是8位字节的序列。这些字节可以根据相应语法规则组成特定字符。一个或多个字符构成更高级的语法实体,大多数为对象。对象又是构成PDF文档的基本单元。
PDF可以完全使用对应ASCII字符集中可见可打印字符的字节值,加上空格字符,例如空格、Tab、回车和换行字符。但是PDF不受ASCII字符集的限制,它可以使用任意的8字节值。
定义对象和描述PDF文件结构的字符一般用ASCII字符集来表示。
特定类型的数据值可以使用ASCII码表示但是一般不用。实际的数据(二进制数),如采样图像,一般为了提高效率直接用二进制表示。
一个包含二进制数据的PDF文件必须作为字节文件来传输和存储;就是说,是作为字节文件而不是文本文件。这样的文件在要求保留字符编码、最大长度、行结束约束或有其他限制的环境下是不可移植的。
(2)“对象”(Objects):
PDF有8种基本对象类型:
布尔值(Boolean Objects):true/false
整数和实数(Numeric Objects): 43445, +123.6
字符串(String Objects):文字字符串(This isastring),16进制字符串<4E6F762073686D6F7A>
字符串中特殊字符“”:当字符串太长时,可以用“”连接两行字符串。如:
( These
two strings
are the same . )
( These two strings are the same . )
名称(Name Objects):用“/”来定义名称对象,但不是名称的一部分,如/Name1
数组(Array Objects):可以包含数字、字符串、其他对象类型或者其他数组,如 [549 3.14false ( Ralph ) /SomeName ]
字典(DictionaryObjects):用<<>>表示的键值对,key 必须是name类型。(unlike dictionary keys in PostScript, which may beobjects of any type). value 可以是任意类型的对象,包括另一个字典对象。一个字典条目(dictionaryentry)的value值为空时,相当于这是一个空的条目。不同的条目Key不可以重复。
如:
<</Type /Example
/Subtype /DictionaryExample
/Version 0 . 01
/IntegerItem 12
/StringItem ( a string )
/Subdictionary<</Item1 0 . 4
/Item2 true
/LastItem ( not ! )
/VeryLastItem ( OK )
>>
>>
流(StreamObjects):与字符串相同都是字节序列,但是流可以递增阅读,字符串必须全部读完。流没有长度限制,字符串有长度限制。因此,大容量的对象如图片和页面都用“流”来表示。
dictionary
stream
… Zero or more bytes …
endstream
空对象(Null Object):类型和值不同于任何其他对象,空对象只有一个,用“null”表示。
(3)间接对象(Indirect Objects):
赋予对象一个特定标识,以供其他对象识别。(如数组中的元素或者是字典条目中的value值)。
对象识别包括两部分:一个正整数的对象编号(间接对象常常在一个PDF文件中顺序编号,但这不是必需的,对象数字可能被指定为任意顺序);一个非负整数的产生号(在一个新创建的文件中,所有间接对象都有一个产生号0,当文件更新之后才会产生非零产生号)。
间接对象的定义由对象号和产生号组成,后面紧跟的是位于关键字obj 和endobj之间括号中的对象值。如:
12 0 obj
( Brillig )
Endobj
(4)过滤器(Filters):
过滤器是对流对象(Stream)的一种规范,规定了流对象在使用前必须使用的解码方式。如:一个流中含有一个ASCII十六进制码(ASCIIHexDecode)的过滤器,那么在读取流数据之前需要将ASCII十六进制数转换为二进制数。
在流字典的Filter条目中来指定一个或多个过滤器。如:
/Filter [ /ASCII85Decode/LZWDecode ]
2.文件结构(File structure):
PDF文件结构决定了对象如何在PDF文件中进行存储、使用以及更新。一个规范的PDF文件由4个元素组成:首部、文件体、交叉引用表、尾部。
(1)首部(one-line header)
首部用来说明PDF文件的版本号,用文本编辑器打开的时候就可以看到:%PDF-1.4这样的字眼,其中最后一位就是PDF文件格式版本号。
(2)文件体(body)
里面由若干个的obj 对象来组成,类似这种形式:
3 0 obj
<<
/Type /Pages
/Count 1
/Kids [4 0 R]
>>
endobj
第一个数字称为对象号,来唯一标识一个对象的,第二个是产生号,是用来表明它在被创建后的第几次修改,所有新创建的PDF文件的产生号应该都是0,即第一次被创建以后没有被修改过。上面的例子就说明该对象的对象号是3,而且创建后没有被修改过。
对象的内容应该是包含在<<和>>之间的,最后以关键字endobj结束。
(3) 交叉引用表(cross-reference table)
包含文件中的间接对象,用来索引各个obj 对象在文档中的位置,以实现随机访问,它的形式是:
xref
0 8
0000000000 65535 f
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000179 00000 n
0000000322 00000 n
0000000415 00000 n
0000000445 00000 n
xref说明一个交叉引用表的开始,交叉引用表的第一行0 8 说明下面各行所描述的对象号是从0开始,并且有8个对象。
0000000000 65535f,一般每个PDF文件都是以这一行开始交叉应用表的,说明对象0的起始地址为0000000000,产生号(generationnumber)为65535,也是最大产生号,不可以再进行更改,而且最后对象的表示是f,表明该对象为free,其实这个对象可以看作是文件头。
0000000009 00000n就是表示对象1,0000000009是其偏移地址,00000为5位产生号(最大为65535),0表明该对象未被修改过,n表示该对象在使用,区别与自由对象(f),可以更改。
(4)尾部(trailer)
描述交叉引用表和文件体中特定对象的位置信息。
Trailer
<<
/Size 8
/Root 1 0 R
>>
startxref
553
%%EOF
trailer 说明文件尾 trailer对象的开始。
/Size 8说明该PDF文件的对象数目。
/Root 1 0 R说明根对象的对象号为1。
Startxref
553说明交叉引用表的偏移地址,从而可以找到PDF文档中所有对象的相对地址,进而访问对象。
%%EOF为文件结束标志。
(5)对象流(Object Streams):
包含一系列PDF对象,允许对PDF文件中大批量对象进行压缩,从而使文件变小。任何对象都可以出现在对象流中,除了:流对象、产生号不是0的对象、文档中的加密字典、在对象流字典中表示长度的对象。
(6)交叉流(Cross-Reference Streams):
除了交叉引用表,交叉引用信息还可以存在于交叉流中,优点:交叉信息更简洁;可以访问对象流中被压缩的对象并且还可以在以后对交叉信息进行追加。
如:
... objects...
12 0 obj%Cross-reference stream
<< /Type /XRef%Cross-reference stream dictionary
/Size ...
/Root ...
>>
stream
...% Stream data containing cross-referenceinformation
endstream
endobj
... more objects...
startxref
byte_offset_of_cross-reference_stream
%%EOF
3.加密(Encryption):
为防止非授权访问可以对PDF文件进行加密。加密应用在PDF文档中的所有字符串和流上,而不是用在表示对象结构的整数或布尔类型等其他对象上。即对字符串或流进行加密是用来保护文档的具体内容。
4.文档结构(Document structure):
PDF文档可以看作是PDF文件体(body)的对象层级结构。底层是文档的目录字典,在层级中大多数对象都是字典对象。例如:文档中每一页用页对象(一个包含页内容及缩略图、注解等其他属性信息的字典对象)来表示。各个页对象又一起组成页树结构,然后指定在一个在文档的间接参考目录中。在字典条目的层级中定义了父、子及兄弟关系从而通过它们的值可以间接指向其他字典对象。页(Page)树结构如下:
2 0 obj
<</Type /Pages
/Kids [ 40 R
10 0 R
]
/Count 2
>>
endobj
4 0 obj
<</Type /Page
… Additional entries describing the attributes of this page…
>>
endobj
10 0 obj
<</Type /Page
… Additional entries describing the attributes of this page…
>>
Endobj
5.内容流(Content streams):
一个PDF文件的内容流包含了一系列描述页面样式或其他图像实体的说明。这些说明,也被称为对象,在概念上区别于表示文档结构的对象实体。这些说明也是使用PDF对象的形式来表示,但是文档是随机、静态的存取数据结构,而内容流中的对象是连续地进行读取和执行。
文档的每一页用一个或多个内容流来描述,一个内容流被指定的过滤器解码后,根据PDF语法规则来读取。内容流由表示操作符和操作数的PDF对象组成,操作数前面必须要有一个操作符。内容流实例:
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 generallytak ) 10 ( e more space than311 ) ] TJ
T* ( encoded streams . )Tj
0 −28 TD
[ ( Se ) 25 ( v) 15 ( eral encoding methodsare 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 methodsare suitable ) Tj
T* ( for both data and images , while othersare suitable only ) Tj
T* ( for continuous−tone images .) Tj
ET
endstream
endobj
内容流中的操作符除了执行内容流中的直接对象,也需要访问间接对象和内容流之外的对象,这些对象就被称为资源。
此外,PDF还提供了公用数据(Common Data)、函数(Functions)和文件规范(FileSpecifications)等由基本对象组成的一些基本结构对象类型。
PDF对象和语法也用在其他文件格式中,如FDF文件(Forms Data Format)。
三、PDF主要由三项技术组成:
· 衍生自PostScript,可以说是PostScript的缩小版;
· 字型嵌入系统,可使字型随文件一起传输;
· 资料压缩及传输系统。
PDF文件使用了工业标准的压缩算法,通常比PostScript文件小,易于传输与储存。它还是页独立的,一个PDF文件包含一个或多个“页”,可以单独处理各页,特别适合多处理器系统的工作。此外,一个PDF文件还包含文件中所使用的PDF格式版本,以及文件中一些重要结构的定位信息。
四、Annotations(标注)
在PDF文档中的一个页面的特定位置上,一个标注关联一个对象,比如注释、声音或动态影像;或者通过鼠标和键盘提供一种与用户进行交互的方式。PDF包括一系列广泛的标准标注类型,许多标准的注释类型可能会显示在open或Closed状态下。当关闭的时候,他们以一种分离的方式存储在页面中,如一个图标,一个box框,或一个图章,取决于具体的标注类型。
当用户通过点击来激活一个标注,它会展现出与其关联的对象,比如打开一个弹出窗口显示一个文本注释或播放一段声音或动态影音。
标注类型主要包括:Note(注释)、Highlight(高亮显示)、Underline(下划线)、Strikeout(删除线)、Squiggly(波浪线)、Replace(替换文本)、Insert(插入)、Link(链接)、Line(线条)、Circle(圆形)、Stamp(图章)、Popup(弹出框)、Sound(声音)、Movie(动态影音)等。