`
zlping
  • 浏览: 64509 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PDF源文件浅析

阅读更多

 

应该项目需要,初步研究了一下 PDF 的格式,打算和大家分享一下,如果有想做 PDF  PDF 阅读器开发的同学们,可以看看。

 

 

PDF 格式规范,语法简洁。但初次查看 PDF 却容易给人错觉 ——PDF 的二进制流太多了,原本清晰的数据格式被杂乱无章的二进制流给淹没了。

 

例如:

 

Java代码 复制代码
  1. stream  
  2. 5di?倯? 貓?匚{o绝幾Te:馎HG  
  3. 嵶?W}?妮雥??隱q?屸鷭鴊狳!赭€?鼜 ??烖K柽z煜?w? ??鴚¬D¬h?斜?醱釓?x?i佲匃???灗  Iu叁剪?  
  4. …………………………  

 

 

像这样一大堆乱码的东西很多,所以,心理上无法耐心的继续看下去。

 

 

实际上 PDF 就是由四部分组成:

 

 

 

 

数据流的读写操作一般是从文件末尾开始的:

 

 

 

 

PDF 所有的数据类型都是 obj ,强调的也是一切皆对象。我简要的把 PDF 常见的几种数据类型给大家说说:

 

注意“ % ”表示注释

1.       Boolean Objects :只有 true  false

2.       Numeric Objects 

l         整型: 123

l         浮点型 -43.54  6.02E23

3.  String Objects 

l         文字型,用圆括号括起来,如: (Hello World)

l         十六进制型,用尖括号括起来,如: <901FA3> 分别为 90  1F  A3

4.  Name Objects :除 null 以外的任意 8 位字符组成的字符串,出现在 PDF 中,用“ / ”作前导符号,如: /Name1 。其实这与编程中的常量很类似。

5.  Array Objects  PDF 中的数组用方括号“ [] ”括起来,里面的数据可以完全不相同,如: [549 3.14 false (Ralph) /SomeName] 该数组里面分别装有 5 种不同的类型。

 

6.        Dictionary Objects :其实就类似于 Java  Map 对象——即以 key  value 的形式成对出现。用的时候要用“ <<…>> ”把 key value 括起来。例如: <</Name (leo) >> 表示 key 为“ name ”的 Name Objects ,而 value 为“ leo ”字符串。 <<>> 内部也可以嵌套使用,在 PDF 源文件中应用的非常广泛。

7.        Stream Objects :顾名思义,肯定有流有关。这就是 PDF 中专门用于存放二进行流的对象。 PDF 的实现者对 String Objects 通常会做限制,但是 Stream Objects 却没有这样的限制。因此 stream object 用在图片,页面描述信息上是非常的适合的。

看看使用示例:

 

 

Java代码 复制代码
  1. 7 0 obj                     %某一个Image类型的对象  
  2. <<  
  3. /Type /XObject  
  4. /Subtype /Image  
  5. /Name /Im7  
  6. /Width 189  
  7. /Height 189  
  8. /BitsPerComponent 8  
  9. /ColorSpace [/Indexed /DeviceRGB 255 …>]  
  10. /Mask [255 255]  
  11. /Length 3832  
  12. /Filter /FlateDecode  
  13. >>                      %紧接着这个对象定义后的Dictionary Objects对象后面  
  14. stream                  %定义它的Stream Objects  
  15. %这里放二进制流  
  16. endstream  
 

 

 

8.        Null Object :区别与其它任何对象,用关键字 null 标注的对象就是 null object 

9.        Indirect Objects :当然就是类似 Java 中的“引用”概念啦,举个例子就说明一切了。

 

 

Java代码 复制代码
  1. 7 0 obj                 %有一个索引号为7 0的对象  
  2. << /Length 8 0 R >>   % 在它的Length属性引用了一个索引号为8 0的对象  
  3.              %在这里“8 0 R”表示对8 0的对象引用(Reference)  
  4. stream  
  5. ………….  
  6. endstream  
  7. endobj  
  8.   
  9.   
  10. 8 0 obj             %被上面7 0对象所引用的那个索引号为8 0的对象  
  11. 77                  %7 0对象的二进制流的长度  
  12. endobj  
 

 

注意:   obj …… endobj PDF 文档组成的最小 组成部分。表示一个完整对象的定义

 

 

 

 

够了,说了这么多,让我们实战吧。现在我们来看一个完整的示例,该示例可以在附件中下载。看的时候,可以按照下面的步骤一步一步来分析 PDF 源文件:

 

 

 

Java代码 复制代码
  1. %PDF-1.3  
  2. %  
  3. 2 0 obj                                 %2 0 obj,里面是一些PDF的基本信息。比如  
  4. <<                  
  5. /CreationDate (D:20081029093606+08'00')  %创建时间  
  6. /ModDate (D:20081029093606+08'00')        %最后修改时间         
  7. /Producer (leo 4.30 \(0615\))        %创建人  
  8. /Creator (easyPDF SDK 4.3)        %制作人  
  9. >>                   %你还可以自由的编写任何信息  
  10. endobj  
  11.   
  12. 1 0 obj  
  13. <<  
  14. /Count 0  
  15. >>  
  16. endobj  
  17.   
  18. 3 0 obj                                 %这是PDF的根结点(不是起始位置)  
  19. <<  
  20. /Type /Catalog  
  21. /Pages 4 0 R                                %这是所有页面的集合,我们主要关心这个  
  22. /Outlines 1 0 R  
  23. >>  
  24. endobj  
  25.   
  26. 7 0 obj  
  27. <<  
  28. /Type /XObject  
  29. /Subtype /Image  
  30. /Name /Im7  
  31. /Width 189  
  32. /Height 189  
  33. /BitsPerComponent 8  
  34. /ColorSpace [/Indexed /DeviceRGB 255 <%这里放每个像素点的值>]  
  35. /Mask [255 255]  
  36. /Length 3832  
  37. /Filter /FlateDecode  
  38. >>  
分享到:
评论

相关推荐

    Linux内核配置系统浅析

    ### Linux内核配置系统浅析 #### 一、配置系统的重要性及基本结构 随着Linux操作系统在各个领域的广泛应用,尤其是在嵌入式系统领域的迅速发展,越来越多的技术人员投身于Linux内核级别的开发工作。对于这些开发者...

    浅析Animate CC用于WEB前端设计.pdf

    【文章标题】浅析Animate CC用于WEB前端设计 【文章摘要】本文主要探讨了Adobe Animate CC在WEB前端设计中的应用,重点介绍了两种创建简单动画特效的方法:基于ActionScript 3.0和基于JavaScript。文章指出,...

    C语言函数教学设计浅析.pdf

    当函数声明和定义出现在同一个源文件中时,函数声明可以省略。此外,头文件中通常包含函数声明,而源文件中则包含函数定义。 在教学设计中,结合具体实例讲解C语言函数及其参数传递是至关重要的。通过对实例的分析...

    内存分配器dlmalloc 2.8.3源码浅析.pdf

    ### 内存分配器dlmalloc 2.8.3源码浅析 #### 1. 概述 dlmalloc是一个高效且广泛使用的内存分配器,最初由Doug Lea开发,目前最新的版本为2.8.3。由于其高效性和灵活性,它在Linux系统和其他环境中得到了广泛应用,...

    数据挖掘在软件工程领域中的应用浅析.pdf

    4. 开源软件挖掘:开源软件挖掘技术常用于检测软件开发源文件中的克隆代码,这是一种代码抄袭现象,可能会引起系统中出现漏洞代码。克隆代码检测技术可以帮助开发团队避免漏洞代码的产生,有利于软件系统的后期维护...

    浅析STC单片机软硬件控制系统的开发设计.pdf

    在使用Keil μVision5等开发环境时,软件开发流程一般包括以下步骤:首先,在源文件编辑器中对源代码进行预处理,包括语法检查等;然后使用汇编器或编译器将源代码翻译成目标代码(.obj格式);接下来,通过链接器将...

    MongoDb C++ win32 驱动

    7. **API理解**:`MongoDb浅析.docx`和相关PDF文档,如`MongoDB权威指南.pdf`和`MongoDB实战中文版.pdf`,提供了关于如何使用MongoDB C++驱动的API进行数据操作的详细信息。通过这些资源,你可以学习如何连接到...

Global site tag (gtag.js) - Google Analytics