新闻资讯 | 控件产品 | 技术文章 | 购物车 | 合作伙伴 | 问题解答 | 电子简报 | PDF论坛 | 资源下载
您现在的位置:希望PDF之家> PDF社区> PDF开发技术 版主:管理员 
标题:PDF文件格式的一些研究心得 参与讨论 推荐
作者:珊瑚虫  发帖时间:2006-4-12 15:38:39 发送短信

现在让我简要介绍一下PDF的文件格式,PDF的文件格式说明,最权威的就是Adobe官方网上的PDFReference,纯英文版的,一千多页,个人认为对于国内的开发者做PDF的生成的时候,最大的困难就在这里了,一个是没有充足的时间去看,二个一看满篇的英文基本上就头大。我只看了三分之一左右,看了整体描述和有针对性地看了一些,必竟HTML转PDF的时候,有不少的东西是用不着的。现在我介绍一下PDF格式的一些要点:
一、PDF文件是一种文本和二进制混排的格式,但是Adobe更愿意让人把它当成二进制的文件,所以在里面建议当文件里面的文本太多的时候,可以加一些二进制的注释,好让现有的一些编译器把它当成二进制文件。里面的文本主要是对文件结构的一种描述,二进制的内容来自于三个方面:1、图片;2、字体;3、压缩后的Post Script。
二、文件结构可以分为三方面:
1、首部。用文本编辑器打开的时候就可以看到:%PDF-1.4 这样的字眼,其中最后一位就是PDF文件格式版本号,软件的版本号总要比文件格式的版本号高1,比如说Read 5能打开的内容就是4。
2、文件体。里面有若干个的obj,以及xref来组成,OBJ这种形式:
30979 0 obj
<< 
/Linearized 1 
/O 30982 
/H [ 15061 25084 ] 
/L 9379963 
/E 166967 
/N 978 
/T 8760262 
>> 
endobj 
第一个数字就是这个OBJ的顺序号,是为了便于在xref中查找,后面的0是为了区分不同的OBJ,现在都是0(个人感觉是为了以后扩展用的)后面就是关键字obj.下面的各行就是属性,/关键字 值 的形式。
xref是obj的索引表,用来索引各个obj在文档中的起始位置,它的形式是:
xref
0 211
0000000000 65535 f
0000000009 00000 n 
……
0000087999 00000 n 

trailer
<<
/Size 211
/Root 2 0 R
/Info 1 0 R
/ID [<B29FBB52459C4623DB1A90CBFC28381E><B29FBB52459C4623DB1A90CBFC28381E>]
>>
其中0,211分别代表这个xref的obj的起始和终止序号。其中0这个是估计是为了程序中好处理所以加了这个(个人英文水平不行,有些地方看不明白),可以不加入这个。下面的各行就代表各个obj在这个文档的起始位置,其中第一串字符(10个)代表起始位置,中间的五个字符也是为了区分用的,现在基本上全为0, 后面的字母有两种f代表删除的,n代表要使用的。后面的trailer是对整个xref的摘要,说明里面有多少个OBJ,读的时候从哪个OBJ开始解析,信息节点等,ID是为了让一些文件检索工具能够唯一区分文件。
3、文件尾。
startxref
88019
%%EOF
因为一个文档中可以有多个xref,所以这里要指明要从哪个xref开始进行解析这个文件。
从上面的分析来看:PDF文件内部校验是很复杂的,只要里面有一位错位了,就会导致整个文档读取错误。而且它时硕会有不少的二进制内容,所以一般来说在内存里面存储的时候,用流对象,而不能用字串,特别是生成的时候,每加入一个obj的时候,去获取一下当前流的长度就可以得到每个obj的起始位置,同时把获取的这些位置存到ArrayList里面,这样就可以很方便地得到和内容相一致的xref了。
三、PDF里面对象的组成形式,可以说是用树形结构来相互关联的,驵下面挂页集合,页集合下面挂页,页里挂图片,链接,内容等
四、PDF里面的obj的类型主要有以下几种:
1、文件描述对象,用来描述这个文件的标题,作者,时间等
2、组对象,也就是文档内容的起始结点。Type 为Catalog
3、页集合,里面聚合了大量的页对象。  Type 为pages
4、页对象,里面指明了当前页里面用到的字体,内容,活动对象,图片等。Type 为page
5、活动对象,有链接,文字,声音,电影等,Type 为Annots
6、图片对象, Type 为 XObject
7、字体对象,Type 为 Font 。PDF可以内置字体,所以即使目标机器上没有,只要它内置了,也可以正常地显示,不受影响(内置字体,这个我还没有研究清楚,希望知道的人可以告诉我一下,这里先谢了)
8、流对象。所有的二进制内容都是存在这个对象里面,文件流的常见的压缩方式是:图片的一些压缩算法,FlateDecode,ASCIIHexDecode,ASCII85Decode等等,FlateDecode事实上就是ZIP的压缩算法(关这个,我就花了好长的时间去研究)。流对象的长度是关连到一个长度对象上的/Length  188 0 R这种形式。188就是存这个长度的OBJ的顺序号。
9、数字对象。
188 0 obj
2538
endobj
里面只有一个数字,经常用来表示长度,为什么要把长度还要再用对象来表示,这个到现在我也想不太明白。
以上就是我对PDF文件格式的理解的摘要。也许有些地方可能理解得不正确,希望得到大家的指正。

转自IronSoft的博客
谢谢您的阅读,你是本贴的第 8243 位阅读者
此主题共分:1
第1条回复 参与讨论 推荐
作者:游客  发帖时间:2007-4-23 17:10:50 发送短信

第2条回复 参与讨论 推荐
作者:游客  发帖时间:2007-3-7 11:19:37 发送短信
不错,我正在研究pdf格式 希望能够与大家交流
qq:34255780
email  htinghua@tom.com
第3条回复 参与讨论 推荐
作者:ro  发帖时间:2007-11-22 15:43:02 发送短信
能不能结合java说明一下如何实现对pdf的解析.
第4条回复 参与讨论 推荐
作者:gdkenli  发帖时间:2007-11-29 2:33:19 发送短信
能否用VB提取PDF中的表格??
第5条回复 参与讨论 推荐
作者:游客  发帖时间:2006-8-30 14:22:11 发送短信
更详细的可以去看: www.pdfsky.com
第6条回复 参与讨论 推荐
作者:游客  发帖时间:2007-2-25 15:21:34 发送短信
文字

第7条回复 参与讨论 推荐
作者:游客  发帖时间:2007-4-27 9:14:30 发送短信

第8条回复 参与讨论 推荐
作者:游客  发帖时间:2008-3-30 16:41:57 发送短信
PDF文件保存时出现109是怎么回事,有哪个知道哟,麻烦请告诉一下?
第9条回复 参与讨论 推荐
作者:游客  发帖时间:2006-12-22 17:08:33 发送短信
"其中0,211分别代表这个xref的obj的起始和终止序号。"
第一个应该是起始号,第二个应该是从起始号后连继的个数吧?

第10条回复 参与讨论 推荐
作者:游客  发帖时间:2008-7-21 16:57:16 发送短信
哈哈,学习中。哈哈,学习中

第11条回复 参与讨论 推荐
作者:游客  发帖时间:2006-12-13 11:42:04 发送短信
我有个急需解决的问题,有没有知道的,或楼主研究时有没有什么发现。
使用acrobat 7.0 professional版本制作的,在PDF中打开非PDF文件有提示,怎么去掉提示信息?最好能将您的答复发到我的邮箱(flying02501@yahoo.com)里,非常感谢!


第12条回复 参与讨论 推荐
作者:游客  发帖时间:2006-8-8 14:37:02 发送短信
不错
第13条回复 参与讨论 推荐
作者:游客  发帖时间:2006-10-7 10:36:26 发送短信
水平太凹,有点看不懂。正在努力学习。我只想能制作简单的文件,并从文件中提取出word文档,不知那位能告知一下。sunyubin666@sina.com  谢谢!
第14条回复 参与讨论 推荐
作者:Tom  发帖时间:2006-10-13 12:01:37 发送短信
我是初学者,对于开发还很遥远,首先是要学会使用,不过了解这方面的知识还是有用的。谢谢!
第15条回复 参与讨论 推荐
作者:mark  发帖时间:2008-5-9 10:47:20 发送短信
不错, 更推荐看看 <<一个简单的PDF文件结构的分析>>
此主题共分:1
·本帖只代表个人观点,不代表希望PDF之家观点。本文版权归作者和希望PDF之家共同拥有,转贴请注明作者及出处。
请选择心情
内容:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字
字体:    字体大小   颜色:
图片上传:上传的图片(小于200K)

如果您希望发贴,请输入您的用户名口令;如果您还没有注册,请点击这里注册

用户名:   密码:   校验码: