目录
一、PDF文件格式---------------------------------------------------------------- 2
1.标准的pdf文档格式----------------------------------------------------- 2
2. PDF区域内容呈现方式------------------------------------------------ 2
2.1 PDF文件头(header)----------------------------------------- 2
2.2 文件体(body)------------------------------------------------- 3
2.3交叉引用表(Cross-Reference Table)--------------------- 3
2.文件尾(trailer)--------------------------------------------------- 5
3.对象流(Object Streams)-------------------------------------------------- 7
4.参照流(Cross-Reference Streams)-------------------------------- 9
4.1参照流字典 Cross-Reference Stream Dictionary------- 10
4.2参照流数据 Cross-Reference Stream Data--------------- 11
二、PDF文件内置对象-------------------------------------------------------- 12
1.PDF文件支持8种基本类型对象----------------------------------- 12
1.1布尔值对象------------------------------------------------------- 12
1.2字符串对象------------------------------------------------------- 12
1.3name对象--------------------------------------------------------- 14
1.4数组对象---------------------------------------------------------- 15
1.5词典对象---------------------------------------------------------- 15
1.6流对象------------------------------------------------------------- 16
1.7空对象------------------------------------------------------------- 17
2.各种对象的辨识方法--------------------------------------------------- 17
三、实例分析--------------------------------------------------------------------- 18
1.结构分析------------------------------------------------------------------- 18
1.1文件头------------------------------------------------------------- 18
1.2文件体------------------------------------------------------------- 18
1.3交叉引用表------------------------------------------------------- 19
1.4文件尾------------------------------------------------------------- 20
一、PD一文件格式
1.标准的pdf文档格式
a. header:内含版本资讯。
|
b. body:内含实际的文件内容。
|
c. cross-reference table(简称xref table):内含对象参照的相关资讯。
|
d. trailer:内含指向xref table、body区的重要相关资讯 |
2. PDF区域内容呈现方式
PDF是以行的方式来呈现资料的,每一行的结束字符,可以是Carriage Return(ASCII 13)、也可以是Line Feed(ASCII 10)、或是两者的组合(ASCII 13紧接着ASCII 10)。各行内的资料,若遇到%字符,表示该行从%字符后面的所有的资料都是注解,必须加以略除,但有一个例外,那就是流对象(stream object)的内容,并非以行的方式呈现,必须另行处理。另外要注意的是,PDF里的资料是大小写有关的。
2.1 PDF文件头(header)
PDF文件的首行就是header部分,声明PDF文件的版本号header只有一行注解文字,且固定以”%PDF-“开头,后面紧接着PDF的版本
例如:
%PDF-1.4
2.2文件体(body)
一个PDF文件的文件体包括表示文档内容的对象。对象是文档的基本类型,表示文档的各个组成部分,如字体,页面,和实例图形。从PDF1.5开始,主干部分也可以包含对象流,每个对象流都包含一系列间接对象。
2.3交叉引用表(Cross-ReferenceTable)
交叉引用表包含的信息允许对文件中的间接对象进行随意访问,以便不需要阅读整个文件即可定位任何特殊对象了。(从PDF1.5开始,某些或所有的参照表信息也可以被含在参照流中。
交叉引用表是PDF文件唯一有固定格式的一部分,每个交叉引用表都从一个包含关键字xref的行开始。跟着这个行的是一个或多个参照子部分,这些分部可以以任何顺序出现。子部分的构造有益于逐步更新,因为它允许一个新的参照部分附加到PDF文件中来,而包含的选项紧紧只用于已经被附加或删除的对象。对一个从未被更新过的文件,参照部分只包含一个子部分,它的对象编号从0开始。
每个参照表项目固定20 byte,
其格式如下:
Byte | 内容 |
0-9 | 对象所在的文件位置,靠右,不足时补0 |
10 | 空白字符 |
11-15 | generation number,靠右,不足时补0,表示对象的修改次数 generation number<=65535,一但达到这个数字,该对象编号便不能再使用,而必须另行增加一个编号 |
16 | 空白字符 |
17 | n表示对象使用中,f表示对象未被使用(free) |
18-19 | 空白与换行字符 |
以下便是一个xref table的例子:
xref------------------------------------------------------参照表开始的的关键字
0 3-------------------------------0(开始的对象号),3(后跟的对象个数)
000000003 65535 f -------对象的在文件中的位置;对象的生成号;对象的状态(f/n)
000000127 00000 n
000000000 00001 f
5 1
000004346 00000 n
这个Cross-ReferenceTable 有两个参照子部分:
第一个参照子部分是指出了对象0,1,2在文件中的位置(3,127,0)以及说明0,2对象未被使用(f)。
第二个参照子部分是指出了对象5在在文件中的位置(4346),以及说明了对象正在使用(n)
2.文件尾(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 | TYPE | VALUE |
Size | integer | (必选项)整个PDF文件的对象个数 |
ID | array | 分别表示旧ID与新ID |
Prev | integer | 如果有,后跟数字表示下一个交叉引用表的位置;没有,表示最后一张交叉表 |
Root | dictionary | (必选值)文件里存放Catalog的对象编号 |
Info | dictionary | 表示文件里的摘要资讯所在对象编号 |
Encrypt | dictionary | 表示PDF档有加密,其后接的词典资料,便是用来解密用的 |
整个读取trailer和xref table的过程应为 :
(1) 由档尾trailer区块里找到startxref,取得第一个参照表开始的文档位置 |
(2) 移到该参照表的位置,开始读取xref table内容
|
(3) 读取后面紧接着的trailer区块内容 |
(4) 找寻其后紧接的trailer区块中是否有Prev属性,没有即结束
|
(5) 如果有Prev,则其后的数字视为下个xref table的文档位置,回到步骤2 |
3.对象流(Object Streams)
PDF1.5引进了一个全新的流概念,对象流,它包含了一系列PDF对象。对象流的用途是允许压缩更多数目的PDF对象,以此来大量减少PDF文件大小。流中的对象都是指压缩对象。
任何一个PDF对象都可以出现在对象流,以下几种情况例外
l 流对象
l 生成编号非0的对象
l 一篇文档的加密字典
l 表示对象流字典中Length选项值的对象
除了流的标准关键字外,对象流字典还描述了包含一下选项
对象流专用选项 | ||
KEY关键字 | TYPE 类型 | TYPE 类型 |
Type | Name | (必选)Objstrm,表示该对象含有对象流 |
N | Integer | (必选)对象流中压缩对象的个数 |
First | Integer | (必选)首个压缩对象的字节偏移量(在解压后的流中) |
Extends | Stream | (可选)一个引用对象流,当前对象留被认为是一个扩充流 |
例子解析:
/n 3: 说明对象流中对象的个数为3
/first24 :说明对象流中第一个压缩对象在流中的位置(解压缩后的)
11 012 547 13 665:对象流中包含的3个对象11,12,13,并指出了对象相对于流中第一个对象的的偏移地址(0,547,665)
4.参照流(Cross-Reference Streams)
从PDF1.5开始,参照信息被存储在参照流中而不是参照表中。参照流提高以下优势:
l 更简洁紧凑的表示参照信息。
l 可以访问存储在对象流中的压缩对象,并允许以后加入新的参照选项类型。
参照流是流对象,包含一个字典和一个流对象,参照流字典相当于trailer,
流对象相当于参照表。
如以下例子所示:
注意现在紧跟着关键字startxref的值是参照流的偏移值而不是关键字xref。
对于那些全部用参照流的文件(PDF1.5及以上)关键字xref和跟踪器不再被使用。
因此,除了startxref address %%EOF片断和标注特例外,一个PDF1.5的文件完全是一序列的对象。
4.1参照流字典 Cross-Reference Stream Dictionary
除了对所有流和trailer字典的通用选项外,参照流还包含下表所示的选项
参照流字典专用附加选项 | ||
KEY | TYPE | 说明 |
type | name | 值必须是xref(说明该流为参照流) |
size | integer | 说明参照表中对象的个数 |
index | array | 一个数组,第一个值表示为第一个对象的编号,第二个值表示参照流中对象的总数 |
prev | integer | 从文件开始部分到先前参照流的开始部分的子节偏移值。本选项与跟踪器字典(表3.13)中的Prev选项作用相同,(只有当文件有多个参照流的时候才会呈现;在混合参照文件(pdf1.4)中没有意义) |
W | array |
|
4.2参照流数据 Cross-Reference Stream Data
参照流中的每个选项都有一个或多个数据域,第一个数据域指派选项类型,在PDF1.5中,只允许类型0,1,和2。其它的值都被看成是 空值对象引用,这样就允许以后定义新的选项类型
数据以渐进的数据域编号编写;每个数据域的长度受W选项中对应的值制约,每个为位置对应的值说明:
参照流字典专用附件选项 | ||
key | field | 说明 |
0 | 1 | 值为0,表示该对象闲置 |
2 | 下一个闲置对象的对象编号 | |
3 | 对象编号被再次使用的生成编号。 | |
1 | 1 | 值为1,对象正在使用中(不是压缩的对象) |
2 | 对象的偏移值,从文件的开始部分开始 | |
3 | 对象的生成编号,缺省值为:0 | |
2 | 1 | 值为2,对象为压缩对象 |
2 | 存储对象的对象流的对象编号 | |
3 | 对象流中对象的属性 |
二、PDF文件内置对象
1.PDF文件支持8种基本类型对象
l 布尔指
l 整数和实数
l 字符串
l 名称
l 数组
l 字典
l 对象
l流
1.1布尔值对象
只有两个值:true和false
PDF提供两种数字对象:整数和实数(含负数),实数必须以小数点的形式出现。
注意:PDF不支持非十进制基数(比如16#FFFE)或指数格式(比如6.02E23)的数字
1.2字符串对象
字符串对象有两种表示法,一般可见字符用括号(),16进制表示法用角号<>表示
例如:
(This is a string)
<4E6F762073686D6F7A206B6120706F702E>
文字串(LiteralStrings)
文字串是用含在圆括号内的任意字符编写成的。任何一个字符都可以出现在串里面,除了必需做特别处理的 单括号 和反斜线符号,串中成对的括号不需要特别处理
如果一行太长写不下去,则可以用反斜线(backslash,\)做为续行动作,例如:
(These \
two strings \
are the same.)
等于下面这行:
(These two strings are the same.)
另外,也可使用反斜杠做为转义字符,转义字符如下表所示,若出现没有在下表中的转义字符,将会被忽略不显示。
转义字符 | 说明 |
\n | 换行(Line feed) |
\r | 归位(Carriage return) |
\t | 定位(Horizontal tab) |
\b | 倒退(Backspace) |
\f | 跳页(Form feed) |
\( | 左括号(Left parenthesis) |
\) | 右括号(Right parenthesis) |
\\
| 反斜杠(Backslash) |
\ddd | 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键,回车键,行填充符,和表格填充符)需略过。
1.3name对象
名称对象的起始字符为/,其后紧接著名称字符串(大小写有关)。其不能出现空白字符(参照下表“空白字符”)。名称字符串里的字符必须在ASCII 33~255之间,且不能是%()<>[]{}/#这几个字符。
如果名称中希望含有其它不合法的字符时(ASCII 0的NULL字符除外),必须采用#加两个16进位数字的方式来表示字符码。例如想加入一个空白字符,则可用/Adobe#20Green,实际名称便是Adobe Green。
空白字符 | |
十进制 | 名字 |
0 | NULL(NUL) |
9 | Tab(HT) |
10 | Line feed(LF) |
12 | Form feed(FF) |
13 | Carriage return(CR) |
32 | Space(SP) |
1.4数组对象
一个PDF数组的元素可以是数字,串,字典或其它对象组合,以及其它数组;
一个数组被写成是含在方括号([and ])中的一序列对象;
PDF只支持一维数组。更高维的数组可以用数组嵌套数组的方式来构建。
数组对象的例子
[549 3.14false (Ralph) /SomeName]
1.5词典对象
字典对象是一个包含多部分对象的组合表格,称为字典条目。每个条目的第一个元素为关键字,第二个元素是值。关键字必需是一个名称值可以为任何对象。值为空值的字典条目相当于无条目
注意:同一个字典中的两个条目不可以有相同的关键字。如果一个关键字多次出现,那么它的值是未给定定义的。
字典对象是构建PDF文档最主要的部分。由于字典中的每个条目指定一个属性的名称和值,这样它们就经常被用来把复杂对象的属性聚集并联系在一块
字典的编写方式是:一序列含在书名号中的关键字与值的配对。比如:
<</Type /Example
/Subtype/DictionaryExample
/Version0.01
/IntegerItem12
/StringItem(a string)
/Subdictionary<< /Item1 0.4
/Item2true
/LastItem(not!)
/VeryLastItem(OK)
>>
>>
注意:不要混淆书名号与单括号(< and >), 单括号是分隔一个十六进制串的
1.6流对象
流对象主要记录一连续的任何资料(例如影像资料),其格式如下:
流词典对象
stream
流资料
Endstream
所有的流都必须是间接引用对象,而且流字典也必须是一个间接引用对象。
紧随着流字典的关键字stream后面必须跟一个行末标识符(要么包含一个回车符和是行末填充符, 要么只是一个行末填充符),不会是单独一个回车符。构成流的序列字节,位于关键字 stream 和endstream 之间,流字典指定确切的流的信息。
流字典通用属性 | ||
KEY关键字 | TYPE 类型 | TYPE 类型 |
Length | Integer | (必选值)从关键字stream之前的行开始部分到关键字endstream之前的最后字节之间的字节编号。(endstream之前也有可能有附加EOL标识,它不含在计数之内,也不是流数据逻辑部分。) |
Filter | Name /array | 指明处理流的过滤器的名称 |
DecodeParms | 字典或数组 | Filter指明的过滤器的参数 |
F | File specification | 流资料所在的文件名称,此时该流资料应被略过 |
FFilter | name or array | 同Filter,但作用于F制定的流资料 |
FDecodeParms | 字典或数组 | 用来说明FFilter指明的过滤器的参数 |
DL | Integer | (1.5以后)一个表示 解码(无过滤器)流中字节编号的非负整数。比如,它可以被用来测定是否有足够磁盘空间将流读取到一个文件。这个值只被看成是一个线索;某些流过滤器,不可能准确测定这个值 |
1.7空对象
以null来表示
2.各种对象的辨识方法
(1) 以(开头:字符串对象
(2) 以/开头:名称对象
(3) 以<开头:若后面不接<,便是字符串对象(见<<开头的说明)
(4) 以<<开头:词典对象,若之后再接stream便是流对象
(5) 以负号开头:后面接数字便是数字对象
(6) 以数字开头:数字对象,整数对象必须再往后看两个对象,才能决定是否为对象参用形式
(7) 以f开头:若是false便是布尔对象
(8) 以n开头:若是null便是空对象
(9) 以t开头:若是true便是布尔对象
(10) 以[开头:数组对象
(11) 其他:不合法的对象
三、实例分析
1.基本PDF文件结构分析
1.1文件头
内容:
%PDF-1.4
意义:以”%PDF-“开头,后面紧接着PDF的版本号1.4,标识该实例文件尾PDF1.4版本
1.2文件体
内容:
%
2 0 obj #Object对象,其中2是Obj顺序号,0是Obj版本号
<</Length 78/ # #流对象的长度
Filter/
FlateDecode #流对象的压缩方式为zip 的压缩算法
>>
Stream #流对象
x3P0T5T0P04_\\N!\f
!)\_@i__CPH!$KR3$_$___a__
Endstream #流对象结束标志
endobj
4 0 obj
<</Parent 3 0 R #其父对象号为3 以及Pages 对象
/Contents 2 0 R/ #页面内容对象的对象号为2
Type/Page/
Resources #该页包含的资源
<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]/
Font<</F1 1 0 R>> #字体的类型
>>
/MediaBox[0 0 595 842]/ #页面显示大小,以像素为单位
Rotate 90>> #旋转90度
endobj
1 0 obj
<</BaseFont/Helvetica/Type/Font/Encoding/WinAnsiEncoding/Subtype/Type1>>
endobj
3 0 obj
<</Type/Pages/ #对象类型为pages
Count 1/ #页码数量为1
Kids[4 0 R]>> #kids 对象说明它的子页对象为4
endobj
5 0 obj
<</Type/Catalog/ #对象类型为目录对象(Catalog)
Pages 3 0 R>>
endobj
6 0 obj
<</Producer(iText 5.3.2 2000-2012 1T3XT BVBA\(AGPLversion\))/ #PDF制造程序
ModDate(D:20170117135923+08'00')/ #pdf修改时间
CreationDate(D:20170117135923+08'00')>> #pdf创建时间
endobj
意义:文件体包括表示文档内容的对象。对象是文档的基本类型,表示文档的各个组成部分,如字体,页面,和实例图形。
1.3交叉引用表
内容:
Xref #表示交叉引用表开始
0 7 #0 表明引用表描述的对象从0 开始,7 说明共有7 个对象
0000000000 65535 f #一般pdf 都是以这行开始交叉引用表的,起始地址0 和产生号
0000000326 00000 n
0000000015 00000 n
0000000414 00000 n
0000000159 00000 n
0000000465 00000 n
0000000510 00000 n
意义:
交叉引用表包含的信息允许对文件中的间接对象进行随意访问,以便不需要阅读整个文件即可定位任何特殊对象了。
1.4文件尾
内容:
Trailer #说明文件尾对象开始
<</Root 5 0 R #说明根对象号为12
/ID[<5b8ddc49e2b4b9f1e7f7ebeb1a341470><181621ccb8119e9a276d185458fd2c41>] #分别表示旧ID与新ID
/Info 6 0 R/ #表示文件里的摘要资讯所在对象编号
Size 7 #7说明PDF 文件对象数目
>>
%iText-5.3.2
startxref
663 #663 为交叉引用表的偏移地址,此处为十进制表示
%%EOF #结束标识
2.可视化数据结构
2.1说明属性可视化
2.1.1结构中说明属性数据体现
使用Adobe Acrobat Pro 打开文件,点击“文件”-->“属性”,可以查看文档属性。
说明属性实例图:
对应关系:
说明属性信息与文档结构标识对应关系 | |
属性名 | 对应结构标识 |
创建日期 | CreationDate(D:20170117135923+08'00') |
修改日期 | ModDate(D:20170117135923+08'00') |
PDF版本 | %PDF-1.4 |
页数 | Count 1 |
页面大小 | MediaBox[0 0 595 842] |
2.1.2结构中字体属性数据体现
字体属性示例图:
对应关系表:
字体属性信息与文档结构标识对应关系 | |
属性名 | 对应结构标识 |
字体 | <</BaseFont/Helvetica/Type/Font/Encoding/WinAnsiEncoding/Subtype/Type1>> |
四、Adoble签名结构分析
1.签名后的文件结构
%PDF-1.4
%忏嫌
7 0 obj
<</F132/Type/Annot/Subtype/Widget/Rect[295 400 595 0]/FT/Sig/DR<</XObject<</FRM5 0 R>>>>/T(Signature1)/V 1 0 R/P 8 0 R/AP<</N 6 0R>>>>
endobj
1 0 obj
<</Reference[<</Data9 0 R/Type/SigRef/TransformParams<</Type/TransformParams/V/1.2/P3>>/DigestMethod/MD5/DigestLocation[00]/DigestValue(aa)/TransformMethod/DocMDP>>]/Contents<3082052906092a864886f70d010702a082051a30820516020101310b30……….
c268d9cc44429c6da8bab73ebda92cd192ea5316868eb92cfe4b397f674ce191c76ddcb085ab4b4c82dec88600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>/Type/Sig/SubFilter/adbe.pkcs7.sha1/Name(rlk)/M(D:20170118155335+08'00')/ByteRange[0 354 3134 2818 ] /Filter/Adobe.PPKMS>>
endobj
10 0 obj
<</BaseFont/Helvetica/Type/Font/Subtype/Type1/Encoding/WinAnsiEncoding/Name/Helv>>
endobj
11 0 obj
<</BaseFont/ZapfDingbats/Type/Font/Subtype/Type1/Name/ZaDb>>
endobj
4 0 obj
<</BaseFont/Helvetica/Type/Font/Encoding/WinAnsiEncoding/Subtype/Type1>>
endobj
2 0 obj
<</Type/XObject/Resources<</ProcSet[/PDF /Text /ImageB /ImageC /ImageI]>>/Subtype/Form/BBox[0 0 100100]/Matrix [1 0 0 1 0 0]/Length 18/FormType 1/Filter/FlateDecode>>stream
x淪Up v蔍趟?
endstream
endobj
5 0 obj
<</Type/XObject/Resources<</XObject<</n23 0 R/n0 2 0 R>>/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]>>/Subtype/Form/BBox[00 300 400]/Matrix [1 0 0 1 0 0]/Length 47/FormType1/Filter/FlateDecode>>stream
x?P0T?T0P060
K
endstream
endobj
6 0 obj
<</Type/XObject/Resources<</XObject<</FRM5 0 R>>/ProcSet [/PDF /Text /ImageB /ImageC/ImageI]>>/Subtype/Form/BBox[0 0 300 400]/Matrix [1 0 0 1 0 0]/Length29/FormType 1/Filter/FlateDecode>>stream
x?T0T0
endstream
endobj
3 0 obj
<</Type/XObject/Resources<</ProcSet[/PDF /Text /ImageB /ImageC /ImageI]/Font<</F1 40 R>>>>/Subtype/Form/BBox[0 0 400 300]/Matrix [1 0 0 1 0 0]/Length104/FormType 1/Filter/FlateDecode>>stream
x渟
?T0
endstream
endobj
12 0 obj
<</Producer(iText?5.3.2?000-2012 1T3XT BVBA\(AGPL-version\))/ModDate(D:20170118155335+08'00')/CreationDate(D:20170117152115+08'00')>>
endobj
13 0 obj
<</BaseFont/Helvetica/Type/Font/Subtype/Type1/Encoding/WinAnsiEncoding>>
endobj
14 0 obj
<</Length78/Filter/FlateDecode>>stream
x?P0T?T0P0?
endstream
endobj
15 0 obj
<</ITXT(5.1.3)/Type/Pages/Count1/Kids[8 0 R]>>
endobj
8 0 obj
<</Parent15 0 R/Type/Page/Contents 14 0R/Resources<</ProcSet[/PDF/Text/ImageB/ImageC/ImageI]/Font<</F1 130 R>>>>/MediaBox[0 0 595 842]/Annots[70 R]/Rotate 90>>
endobj
9 0 obj
<</Perms<</DocMDP1 0 R>>/Type/Catalog/AcroForm<</Fields[7 0R]/DR<</XObject<</FRM 5 0 R>>/Font<</Helv 10 0 R/ZaDb11 0 R>>>>/DA(/Helv 0 Tf 0 g )/SigFlags 3>>/Pages 15 0R>>
endobj
xref
0 16
000000000065535 f
000000016800000 n
000000359000000 n
000000433900000 n
000000350200000 n
000000380900000 n
000000408700000 n
000000001500000 n
000000511500000 n
000000529400000 n
000000332600000 n
000000342500000 n
000000466300000 n
000000481700000 n
000000490600000 n
000000505100000 n
trailer
<</Root9 0 R/ID[<58f200ad368d5ec720a64bc5e8c485da><8ae6c75d1931a256c965738da85030cb>]/Info12 0 R/Size 16>>
startxref
5483
%%EOF
注:数据过长,忽略过长部分数据,以及乱码数据
2.PDF签名信息
[0] Version: 3
SerialNumber: 1484726015315
IssuerDN:CN=rlk,OU=yonyou,O=yonyou,L=北京,ST=北京,C=CHINA
Start Date: Wed Jan 18 15:52:45 CST2017
Final Date: Wed Jan 18 16:01:55 CST2017
SubjectDN:CN=rlk,OU=yonyou,O=yonyou,L=北京,ST=北京,C=CHINA
Public Key: RSA Public Key
modulus:da119c18938f96773f938655c2240ef8d438ffdb67589bd0018f1bf9a7cca18c74e150d85c5a2bcd62f4e9fd59231ea99047047147d64d88bdebff2530148efc5d59b4edf02f9bddaaac7575d2e0ef7ea19d2221154e7d742039f42f9b4c574ea7a2698b8ec543c4f0fbe75a8307a3c8ac65d1cb200f78ad9f36e3e8ce5e61ee56901fd7bdd48a81ab1a5bd06ee962106b4c620b4a7a095c4348e697f52c4e8e86d10c2c22f28bc11997b2f54a5f71941b9f3aa4157ba75f3e006b128c3a54968d07347c953232d29668e38afe82eb74a888757780f5dfec167b1eb064de64c66011df3dfb3aa53c2cd4434c5748f1b61800ed9c43e3cc74577964de9e6d99c7
public exponent: 10001
Signature Algorithm: SHA256WithRSAEncryption
Signature: d810334459f25f44d8c8a19fceb4c7a14a8546cc
370b01ff1470193e0a8e2930071ff934c597b116
5f936742376d9ac8addebbaa75fcceeadd6b582b
bf16dd2faa5ff88aa939b42b1b3ddf91a39c205c
ef973191f41286268efad21785a1c09b8a6ef1ab
a4d074582dce44262b2ddab2a5ebe52e9bafa4a6
b08febda7ade1fa7c8c1576aae74b95ca64e92f2
73a6eac20d8464bfe0ad61df0ddaf8f50d64c5bc
9515357d1dea8a2271da84845e3f63b0072dfe74
ab7b1564682c7abdc5b96bd88d4d7fcd3f094571
e90b25389fa301a746ced2915121a424a74acd1d
3287c323a2a9e12742f1ea89cffe8d79a74c78dc
ec502d7907d01a4b13be9f245f761b28
3.结构图谱
4.签字字典条目项
签字字典条目项 | ||
KEY | TYPE | VALUE |
Type | name | (可选)此字典描述的PDF 对象类型;如果出现,签字字典必须是Sig。 |
Filter | name | (必需的;可继承)签字名处理程序首选使用名字,当验证签字时。如果Prop_Build 条目不出现,它也是签字处理程序的名字,签字处理程序用于创建签字,如果Prop_Build 存在,它能用于决定创建签名(其通常类同于Filter,但是不被要求)的名字处理 程序。确定签名时,应用程序可能替代不同处理程序。只要它支持指定的SubFilter 的格式。例如签字处理程序是 Adobe.PPKLite ,Entrust.PPKEF , CICI.SignIt,和 VeriSign.PPKVS。 |
SubFilter | name | (可选)一个名字描述签字字典中签字编码值和关键 信息。一个应用程序可能使用任何支持这种格式验证 签名的处理程序。 对公钥加密签名的定义值是 adbe.x509.rsa_sha1 , adbe.pkcs7.detached, and adbe.pkcs7.sha1 |
Contents | string | (必需的)签字值,当ByteRange 出项,值是一个16进制字符串(见32 也“16 进制字符串”),它代表字节范围摘要值。如果ByteRange 不出现。除了Contents 条目,ByteRange 值是一个签字字典对象摘要。对公钥签字,Contents 通常要么是一DER-encoded PKCS#1 二进制数据对象, 要么是igeDER-encoded PKCS#7 二进制数据对象。 |
Cert | Array or string | (当SubFilter 是adbe.x509.rsa_sha1 时必需;否则不使用)字符串代表使用X.509 认证连,如果连只有一个条目,签名和认证签名使用公钥密码或字符 串。签字认证必须首先出现在序列;它用于确认在Contents 的签字值,并且其他认证不用于确认签字认证的真实性。如果ubFilter 是adbe.pkcs7.detached 或 adbe.pkcs7.sha1,这个条目不使用,并且认证连必须放入在Contents 的PKCS#7 包里。 |
ByteRange | array | (对所有参考许可字典UR3 条目签字使用权和签字域部分的所有签字都是必需的)一个整数对序列(开始字节偏移,字节长度)精确描述计算的字节范围。多个不连续字节用于描述一个数字,这个数字不包括签字值(Contents 条目)本身。 |
Changes | array | (可选)指示文档变化的三个整数序列,此文档已经在前次签名和这次签名完成:按此顺序,页号码改变,域号码改变,并且域数字填入。 |
Name | text | (可选)签署文档的人或权利名。当它不可能从签字中抽取出名字时,此值应被使用;比如,从签字者中认证。 |
M | date | (可选)签字时间,依靠签字处理程序,这可能是一个正常的未经证实的计算机时间,也可能是一个使用可确定方法从一个安全时间服务器产生时间。 这个值应该仅在签字时间无效时使用;比如。时间戳能被嵌入KCS#7 二进制数据对象 |
Location | text | (可选)CPU 主机名或签字物理位置。 |
Reason | text | (可选)签字原因,如(我同意…)。 |
ContactInfo | text | (可选)签字者提供一个信息,使接受者能去联系签字者确定签署;比如,电话号码。 |
R | integer | (可选)用于创建签字过程中的签字处理程序版本。注:PDF1.5 开始,这个条目不被推崇,且信息应该存 储在Prop_Build 字典。 |
V | integer | (可选;PDF1.5)签字字典格式版本。它对应于SubFilter 值内容的签字字典用法。值是1,如果Reference 字典被认为是关键的签字验证。默认值:0 |
Prop_Build | dictionary | (可选;PDF1.5)能被签字处理程序使用记录信息的 字典,信息是捕获的签字计算机环境状态,软件组建日期,版本和操作系统。 Adobe 发布一个独立规范,PDF 签字为Acrobat 6.0 构建字典规范,对字典使用提供执行引导 |
Prop_AuthTime | integer | (可选;PDF1.5)自从签字者被最后认证的秒数。它旨在签字拒绝声明中使用。如果这个值未知,应该被忽略。 |
Prop_AuthType | name | (可选;PDF1.5)签字者使用认证方法。它旨在签字 拒绝声明中使用。有效值包括PIN,Password 和 Fingerprint。 |
注:签字字典中的条目能被概念为不同的字典;由于历史和加密原因它们在一个字典中。类
别是签字属性( R , M , Name , Reason , Location , Prop_Build , Prop_AuthTime 和
Prop_AuthType);关键信息(Cert 和Contents 部分,当签字值是PKCS#7 对象);参考
(Reference 和ByteRange);和签字值(Contents 当签字值是一个PKCS#1 对象)。
5. 签字参考字典条目项
签字参考字典条目项 | ||
KEY | TYPE | VALUE |
Type | name | (可选)字典描述的PDF 对象类型;如果出现, 对签字参考字典必须是SigRef。 |
TransformMethod | name | (必需的)转换方法名字, 当签字有效,转换方法指导对象摘要计算或修改分析。有效值是: DocMDP 用于检测文档相关签字域修改,域被文档原有者签署;UR 用于检测文档修改,其使有文档使用权的的签名无效; FieldMDP 用于检测指定在TransformParams 格式域表的修改; Identity 使用签定单个对象时,通过在签署参 考字典中Data 值指定。此转换方法支持FDF 文件签署。 |
TransformParams | dictionary | (可选)字典指定由TransformMethod 指定转换 方法的参数(可变数据)。除了Identity 每个方 法都使用它们自己的参数集。详细见上边指定节 关于个别转换参数字典。 |
Data | (various) | (必需的,当TransformMethod 是FieldMDP 或 Identity)通过对文档中对象的间接参考,摘要 被计算,或对象修改分析应该被执行。对转换方 法而不是FieldMDP 和Identity,此对象被隐式 定义。 |
DigestMethod | name | (可选)当计算摘要时,定义将使用的算法名, 有效值是MD5 和SHA1。默认值:MD5. |
DigestValue | string | (必需的,在一些情况)当存在,计算摘要值。 |
DigestLocation | array | ( 必需的, 当DigestValue 被要求且 TransformMethod 是FieldMDP 或DocMDP 时)两个整数的序列指定PDF 文件DigestValue 字符串位置。整数分别代表偏移值和长度,以字节单位的 |