admin管理员组

文章数量:1530848

2023年12月17日发(作者:)

PDF文档格式

目录

前言 ------------------- 错误!未定义书签。

PDF简介 ----------- 错误!未定义书签。

项目简介 --------------------------- 0

PDF文件格式 --------------------------- 1

PDF区域内容呈现方式 ---------------- 1

PDF文件头(header) ---------------- 1

文件主干部分(body) --------------- 2

参照表(Cross-Reference Table) ---- 2

trailer 区域 ----------------------- 3

对象流(Object Streams) ----------- 6

参照流(Cross-Reference Streams) -- 9

参照流字典 Cross-Reference Stream

Dictionary -------------------- 10

参照流数据 Cross-Reference Stream

Data -------------------------- 11

与PDF1.4兼容 Compatibility with PDF

1.4 ------------------------------- 11

PDF文件内置对象 ---------------------- 12

PDF文件支持8种基本类型对象: ----- 12

布尔值对象 ------------------------ 12

字符串对象 ------------------------ 13

name对象 ------------------------- 14

数组对象 -------------------------- 15

词典对象 -------------------------- 15

流对象 ---------------------------- 16

空对象 ---------------------------- 18

各种对象的辨识方法 ---------------- 18

过滤器 -------------------------------- 19

PDF支持一个标准过滤器集,主要分成两种: ---------------------------------- 19

(1) ASCIIHexDecode过滤器 ------ 21

(2) ASCII85Decode过滤器 ------- 21

(3) LZWDecode 和FlateDecode过滤器 ------------------------------ 21

(4) RunLengthDecode过滤器 ----- 21

(5) CCITTFaxDecode Filter ----- 22

(6) JBIG2Decode Filter -------- 22

(7) DCTDecode Filter ---------- 22

(8) JPXDecode Filter ---------- 22

(9) Crypt Filter -------------- 22

1.7

改进评注(Comment)与保全(Security)的支援,3D的支援功能也获得改善

项目简介

……..

PDF文件格式

(1)标准的pdf文档格式

a. header:内含版本资讯。

b. body:内含实际的文件内容。

c. cross-reference table(简称xref table):内含对象参照的相关资讯。

d. trailer:内含指向xref table、body区的重要相关资讯

PDF区域内容呈现方式

PDF是以行的方式来呈现资料的,每一行的结束字符,可以是Carriage

Return(ASCII 13)、也可以是Line Feed(ASCII 10)、或是两者的组合(ASCII

13紧接着ASCII 10)。各行内的资料,若遇到%字符,表示该行从%字符后面的所有的资料都是注解,必须加以略除,但有一个例外,那就是流对象(stream object)的内容,并非以行的方式呈现,必须另行处理。另外要注意的是,PDF里的资料是大小写有关的。

PDF文件头(header)

PDF文件的首行就是header部分,声明PDF文件的版本号

header只有一行注解文字,且固定以”%PDF-“开头,后面紧接着PDF的版本

例如:

%PDF-1.3

文件主干部分(body)

一个文件的主干部分包括表示文档内容的对象。对象是文档的基本类型,表示文档的各个组成部分,如字体,页面,和实例图形。从PDF1.5开始,主干部分也可以包含对象流,每个对象流都包含一系列间接对象。

参照表(Cross-Reference Table)

参照表包含的信息允许对文件中的间接对象进行随意访问,以便不需要阅读整个文件即可定位任何特殊对象了。(从PDF1.5开始,某些或所有的参照表信息也可以被含在参照流中。

参照表是PDF文件唯一有固定格式的一部分,每个参照表部分都从一个包含关键字xref的行开始。跟着这个行的是一个或多个参照子部分,这些分部可以以任何顺序出现。子部分的构造有益于逐步更新,因为它允许一个新的参照部分附加到PDF文件中来,而包含的选项紧紧只用于已经被附加或删除的对象。对一个从未被更新过的文件,参照部分只包含一个子部分,它的对象编号从0开始。

每个参照表项目固定20 byte,

其格式如下:

Byte 内容

对象所在的文件位置,靠右,不足时补0

空白字符

generation number,靠右,不足时补0,表示对象的修改次数

generation number<=0-9

10

11-15

65535,一但达到这个数字,该对象编号便不能再使用,而必须另行增加一个编号

16

17

18-19

空白字符

n表示对象使用中,f表示对象未被使用(free)

空白与换行字符

以下便是一个xref table的例子:

xref

--------------------------------------------------------------参照表开始的的关键字

0

号),3(后跟的对象个数)

000000003 65535 f ---------------------对象的在文件中的位置;对象的生成号;对象的状态(f/n)

000000127 00000 n

000000000 00001 f

5 1

000004346 00000 n

这个Cross-Reference Table 有两个参照子部分:

第一个参照子部分是指出了对象0,1,2在文件中的位置(3,127,0)以及说明0,2对象未被使用(f)。

第二个参照子部分是指出了对象5在在文件中的位置(4346),以及说明了对象正在使用(n)

3

------------------------------------------0(开始的对象trailer 区域

PDF文件跟踪器使得应用程序在阅读文件时能够快速的搜索到参照表和某个特殊对象的位置。

应用程序应从尾段开始阅读PDF文件。

文件的最后一行只包含文件的结束符号,即%%EOF.〕

前面两行包括关键字startref和字节偏移值--从文件开始部分到最后面参照表部分中的关键字xref的开始部分。

放置在startref行前面的是跟踪器字典,由关键字trailer和紧跟后面的对..<<键值>>

组成

trailer区块的内容如下:

trailer

<<

trailer资料

>>

startxref

xref table开始的文档位置

%%EOF

trailer资料主要由{/属性名称

属性值}*所组成,以下便是一个例子:

/Size 22

/Root 2 0 R

/Info 1 0 R

/Prev 408

下表是trailer中各属性的意义:

Trailer字典内容列表

KEY

Size

TYPE VALUE

integer (必选项)整个PDF文件的对象个数

ID

Prev

array 分别表示旧ID与新ID

integer 如果有,后跟数字表示下一个交叉引用表的位置;没有,表示最后一张交叉表

Root

diction(必选值)文件里存放ary Catalog的对象编号

对象编号

的词典资料,便是用来解密用的

diction表示文件里的摘要资讯所在ary

diction表示PDF档有加密,其后接ary

Info

Encrypt

整个读取trailer和xref table的过程应为 :

(1) 由档尾trailer区块里找到startxref,取得第一个参照表开始的文档位置

(2) 移到该参照表的位置,开始读取xref table内容

(3) 读取后面紧接着的trailer区块内容

(4) 找寻其后紧接的trailer区块中是否有Prev属性,没有即结束

(5) 如果有Prev,则其后的数字视为下个xref

table的文档位置,回到步骤2

对象流(Object Streams)

PDF1.5引进了一个全新的流概念,对象流,它包含了一系列PDF对象。对象流的用途是允许压缩更多数目的PDF对象,以此来大量减少PDF文件大小。流中的对象都是指压缩对象。

任何一个PDF对象都可以出现在对象流,以下几种情况例外

流对象

生成编号非0的对象

一篇文档的加密字典

表示对象流字典中Length选项值的对象



除了流的标准关键字外,对象流字典还描述了包含一下选项

对象流专用选项

KEY关键字

TYPE 类型

TYPE 类型

Type Name (必选)Objstrm,表示该对象

含有对象流

N

First

Integ(必选)对象流中压缩对象的个er

er

ds

移量(在解压后的流中)

对象留被认为是一个扩充流

Integ(必选)首个压缩对象的字节偏ExtenStrea(可选)一个引用对象流,当前m

例子解析:

/n 3 : 说明对象流中对象的个数为3

/first 24 :说明对象流中第一个压缩对象在流中的位置(解压缩后的)

11 0 12 547 13 665:对象流中包含的3个对象11,12,13,并指出了对象相对于流中第一个对象的的偏移地址(0,547,665)

参照流(Cross-Reference Streams)

从PDF1.5开始,参照信息被存储在参照流中而不是参照表中。参照流提高以下优势:

更简洁紧凑的表示参照信息。

可以访问存储在对象流中的压缩对象,并允许以后加入新的参照选项类型。

参照流是流对象,包含一个字典和一个流对象,参照流字典相当于trailer,

流对象相当于参照表。

如以下例子所示:

注意现在紧跟着关键字startxref的值是参照流的偏移值而不是关键字xref。

对于那些全部用参照流的文件(PDF1.5及以上)关键字xref和跟踪器不再被使用。

因此,除了startxref address %%EOF 片断和标注特例外,一个PDF1.5的文件完全是一序列的对象。

参照流字典 Cross-Reference Stream Dictionary

除了对所有流和trailer字典的通用选项外,参照流还包含下表所示的选项

参照流字典专用附加选项

KEY

type

size

index

prev

说明

值必须是xref(说明该流为参照流)

说明参照表中对象的个数

一个数组,第一个值表示为第一个对象的编号,第二个值表示参照流中对象的总数

integer

从文件开始部分到先前参照流的开始部分的子节偏移值。本选项与跟踪器字典(表3.13)中的Prev选项作用相同,(只有当文件有多个参照流的时候才会呈现;在混合参照文件(pdf1.4)中没有意义)

array

TYPE

name

integer

array

W

参照流数据 Cross-Reference Stream Data

参照流中的每个选项都有一个或多个数据域,第一个数据域指派选项类型,在PDF1.5中,只允许类型0,1,和2。其它的值都被看成是 空值对象引用,这样就允许以后定义新的选项类型

数据以渐进的数据域编号编写;每个数据域的长度受W选项中对应的值制约,每个为位置对应的值说明:

参照流字典专用附件选项

key field 说明

1 值为0,表示该对象闲置

0

2 下一个闲置对象的对象编号

3 对象编号被再次使用的生成编号。

1

值为1,对象正在使用中()

1

2 对象的偏移值,从文件的开始部分开始

3 对象的生成编号,缺省值为:0

1 值为2,对象为压缩对象

2

2 存储对象的对象流的对象编号

3 对象流中对象的属性

不是压缩的对象与PDF1.4兼容 Compatibility with PDF 1.4

不支持PDF1.5的应用程序无法访问被参照流引用的对象。如果一个文件专门使

用参照流,那么它就没有办法在这样的应用程序中打开。

PDF1.4中可以建立“混合-参照”的文件,这个文件除了包含由标准参照表和参照流中的对象,还有一个附加选项

混合-引用文件中的跟踪器字典的附件选项

key

XRefStm

Type

integer

value

参照流在文件中的位置

PDF文件内置对象

PDF文件支持8种基本类型对象:

布尔指

整数和实数

字符串

名称

数组

字典

对象

布尔值对象

只有两个值:true和false

PDF提供两种数字对象:整数和实数(含负数),实数必须以小数点的形式

出现。

注意:PDF不支持非十进制基数(比如16#FFFE)或指数格式(比如6.02E23)的数字

字符串对象

字符串对象有两种表示法,一般可见字符用括号(),16进制表示法用角号<>表示

例如:

(This is a string)

<4E6F762073686D6F7A206B6120706F702E>

文字串(Literal Strings)

文字串是用含在圆括号内的任意字符编写成的。任何一个字符都可以出现在串里面,除了必需做特别处理的 单括号 和反斜线符号,串中成对的括号不需要特别处理

如果一行太长写不下去,则可以用反斜线(backslash,)做为续行动作,例如:

(These

two strings

are the same.)

等于下面这行:

(These two strings are the same.)

另外,也可使用反斜杠做为转义字符,转义字符如下表所示,若出现没有在下表中的转义字符,将会被忽略不显示。

转义字符 说明

n

r

t

换行(Line feed)

归位(Carriage return)

定位(Horizontal tab)

b

f

(

)

ddd

倒退(Backspace)

跳页(Form feed)

左括号(Left parenthesis)

右括号(Right parenthesis)

反斜杠(Backslash)

8进位转换字符(Character code ddd

(octal))

其中8进位转换字符并不一定要3个数字字符,只要遇到非0-7的数字,便视为数字结束(但一般建议是补足3个)。必须注意的是,8进位转换出来的字符是允许ASCII 0的NULL字符的。另外,在()里的%并不视为批注起始字符,而是视为字符串资料的一部份,同时在()里若还有成对的(),可不必使用转义字符,在处理时要特别注意此一情况。

十六进制串(Hexadecimal Strings)

至于16进制的资料必须是成对的,若出现不成对的情况,则必须自动补0,例如<901FA>,需算成有3个byte的字符串,分别为90、1F及A0。字符串里的空白字符(比如空格键,Tab键,回车键,行填充符,和表格填充符)需略过。

name对象

名称对象的起始字符为/,其后紧接著名称字符串(大小写有关)。其不能出现空白字符

(参照下表 “空白字符”)

名称字符串里的字符必须在ASCII 33~255之间,且不能是%()<>[]{}/#这几个字符。

如果名称中希望含有其它不合法的字符时(ASCII 0的NULL字符除外),必须采用#加两个16进位数字的方式来表示字符码。例如想加入一个空白字符,则可用/Adobe#20Green,实际名称便是Adobe Green。

空白字符

十进制

0

9

名字

NULL(NUL)

Tab(HT)

10

12

13

32

Line feed(LF)

Form feed(FF)

Carriage return(CR)

Space(SP)

数组对象

一个PDF数组的元素可以是数字,串,字典或其它对象组合,以及其它数组

一个数组被写成是含在方括号([ and ])中的一序列对象

PDF只支持一维数组。更高维的数组可以用数组嵌套数组的方式来构建。

数组对象的例子

[549 3.14 false (Ralph) /SomeName]

词典对象

字典对象是一个包含多部分对象的组合表格,称为字典条目。每个条目的第一个元素为关键字,第二个元素是值。关键字必需是一个名称值可以为任何对象。值为空值的字典条目相当于无条目

同一个字典中的两个条目不可以有相同的关键字。如果一个关键字多次出现,那么它的值是未给定定义的。

注意:

字典对象是构建PDF文档最主要的部分。由于字典中的每个条目指定一个属性的名称和值,这样它们就经常被用来把复杂对象的属性聚集并联系在一块

字典的编写方式是:一序列含在书名号中的关键字与值的配对。比如:

<< /Type /Example

/Subtype /DictionaryExample

/Version 0.01

/IntegerItem 12

/StringItem (a string)

/Subdictionary << /Item1 0.4

/Item2 true

/LastItem (not!)

/VeryLastItem (OK)

>>

>>

注意:不要混淆书名号与单括号(< and >), 单括号是分隔一个十六进制串的

流对象

流对象主要记录一连续的任何资料(例如影像资料),其格式如下:

流词典对象

stream

流资料

Endstream

所有的流都必须是间接引用对象,而且流字典也必须是一个间接引用对象。

紧随着流字典的关键字stream后面必须跟一个行末标识符(要么包含一个回车符和是行末填充符, 要么只是一个行末填充符),不会是单独一个回车符。

构成流的序列字节,位于关键字 stream 和endstream 之间;

流字典指定确切的流的信息。

另外,从PDF1.2版本开始,字节可能被包在外部文件中,流内容就是流字典指定文件,并且在stream 和endstream的任何字节都被忽略。

流字典通用属性

TYPE 类型

Length Integer

KEY关键字

(必选值)从关键字stream之前TYPE 类型

的行开始部分到关键字endstream之前的最后字节之间的字节编号。(endstream之前也有可能有附加EOL标识,它不含在计数之内,也不是流数据逻辑部分。)

Filter Name

/array

Decode字典或数Filter指明的过滤器的参数

Parms 组

F

File specification

指明处理流的过滤器的名称

流资料所在的文件名称,此时该流资料应被略过

FFiltename or 同Filter,但作用于F制定的流r

FDecodeParms

DL Integer (1.5以后)一个表示 解码(无array

资料

的参数

字典或数用来说明FFilter指明的过滤器

过滤器)流中字节编号的非负整数。比如,它可以被用来测定是否有足够磁盘空间将流读取到一个文件。这个值只被看成是一个线索;某些流过滤器,不可能准确测定这个值

空对象

以null来表示

各种对象的辨识方法

(1) 以(开头:字符串对象

(2) 以/开头:名称对象

(3) 以<开头:若后面不接<,便是字符串对象(见<<开头的说明)

(4) 以<<开头:词典对象,若之后再接stream便是流对象

(5) 以负号开头:后面接数字便是数字对象

(6) 以数字开头:数字对象,整数对象必须再往后看两个对象,才能决定是否为对象参用形式

(7) 以f开头:若是false便是布尔对象

(8) 以n开头:若是null便是空对象

(9) 以t开头:若是true便是布尔对象

(10) 以[开头:数组对象

(11) 其他:不合法的对象

过滤器

PDF支持一个标准过滤器集,主要分成两种:

ASCII过滤器 能解码那些已经编码成ASCII文本中的任意8位二进制数。注意,ASCII过滤器对于已经加密过的PDF文档没有意义。

解压缩过滤器 可以解码已经压缩过的数据。压缩的数据通常是8位的二进制格式,即使源数据是ASCII文本。(压缩对于大的采样图形特别有用,因为它减少了存储需求和传输时间。有一些类型的压缩是有损耗的,那就意味着一些数据在编码过程中会丢失掉,导致了压缩数据的质量下降。压缩过程没有数据丢失被称为无损耗的)。

标准过滤器

过滤器 参数 解释

ASCIIHexDecode

No 对用ASCII 16进制形式表示的编码数据进行解码,重新产生原来的二进制数据

ASCII85Decode

No 对用ASCII85形式表示的编码数据进行解码,重新产生原来的二进制数据

LZWDecode

Ye对用LZW(Lempel-Ziv-Welch)自适s 应压缩方法编码的数据进行解码,重新产生原来的文本或二进制数据

FlateDecode

Ye(1.2)对用zlib/deflate压缩方法编码的s 数据进行解码,重新产生原来的文本或二进制数据

RunLengthDecode

No 对用byte-oriented run-length算法编码的数据进行解码,重新产生原来的文本或二进制数据。(特别对于单色图形数据或包含频繁运行单字节值的)

CCITTFaxDecode

Ye对用CCITT传真标准编码的数据进行s 解码,重新产生原来的数据

DCTDecode

Ye对用基于JPEG标准的DCT技术压缩的s 数据进行解压缩,重新产生接近原图的图像样本数据

JPXDecode

No (1.5)对用基于wavelet的JPEG200标准压缩编码的数据进行结压缩,重新产生原来的图像数据。

JBIG2Decode

Ye(1.4)对用JBIG2标准压缩的编码数据s 进行解码,重新产生原来的单色(每点一位)图像数据。(或者产生接近原图的数据)

Crypt

Ye(1.5)对用安全处理器加密的的数据进s 行解密,重新产生跟加密前一样的数据

(1) ASCIIHexDecode过滤器

ASCIIHex是把每个字节通过两个(0–9 and和 A–F 或 a–f)字符表示的编码方式

ASCIIHex的编码方式即是将输入字符编成2个16进位码,然后以>做为结束,因此在解压时,只需每次读取两个字符进行解码还原即可,但在取字符时,要注意需略过空白字符(含换行字符等)

具体参考PDF_reference 1.7(page 69)

(2) ASCII85Decode过滤器

具体参考PDF_reference 1.7(page 69)

(3) LZWDecode 和FlateDecode过滤器

具体参考PDF_reference 1.7(page 71)

(4)

RunLengthDecode过滤器

具体参考PDF_reference 1.7(page 77)

(5) CCITTFaxDecode Filter

具体参考PDF_reference 1.7(page 77)

(6) JBIG2Decode Filter

具体参考PDF_reference 1.7(page 80)

(7) DCTDecode Filter

具体参考PDF_reference 1.7(page 84)

(8) JPXDecode Filter

具体参考PDF_reference 1.7(page 86)

(9) Crypt Filter

具体参考PDF_reference 1.7(page 90)

本文标签: 对象参照文件数据字符