一个PDF文档从根本上来说是一个8字节序。其实PDF格式和我们已经熟知的HTML,XML等结构化的文件格式一样,包含有关键字,分隔符,数据等等。 
不 同的是PDF文件是按照二进制流的方式保存的,而html文件则是文本方式保存的。XML文件一般只包含数据本身,并没有把如何显示的信息放在其中,因此 要显示一个XML文件还需要一个Schema文件才能显示,否则看到的将是所有的字节流;HTML包含了数据的同时也包含了一些关于如何显示的信息,但是 HTML是基于文本存放的,是可读的,你打开一个HTML文件就能知道所有显示在浏览器里得文字。 另外就是HTML不能包含二进制流,它对图像文件的引 用都是通过链接的,全部是外部文件的方式来实现的。

PDF文件的基本组成: 
   一个PDF文件从大的方面来说分4个部分: 
l         文件头,指明了该文件所遵从的PDF规范的版本号,它出现在PDF文件的第一行。 
l         文件体,PDF文件的主要部分,由一系列对象组成。 
l         交叉引用表,为了能对间接对象进行随机存取而设立的一个间接对象的地址索引表。 
l         文件尾,声明了交叉引用表的地址,即指明了文件体的根对象(Catalog),从而能够找到PDF文件中各个对象体的位置,达到随机访问。另外还保存了PDF文件的加密等安全信息(以后详细讨论)。

PDF文档的逻辑结构 
   作为一种结构化的文件格式,一个PDF文档是由一些称为“对象”的模块组成的。并且每个对象都有数字标号,这样的 话可以这些对象就可以北其他的对象所引用。这些对象不需要按照顺序出现在PDF文档里面,出现的顺序可以是任意的,比如一个PDF文件有3页,第3页可以 出现在第一页以前,对象按照顺序出现唯一的好处就是能够增加文件的可读性,如果你不会用文本编辑器来阅读PDF结构,那么大可不必关心。正是因为页与页之 间的不相关性,就可以对PDF文件的页码进行随机的访问。 
文件尾(Trail),说明根对象的对象号,并且说明交叉引用表的位置,通过对交 叉引用表的查询可以目录对象(Catalog)。这个目录对象是该PDF文档的根对象,包含PDF文档的大纲(outline)和页面组对象 (pages)引用。大纲对象是指PDF文件的书签树;页面组对象(pages)包含该文件的页面数,各个页面对象(page)的对象号。 
一个PDF文档有下图所示的层次关系:

图2

页面(page)对象作为PDF中最重要的对象,包含如何显示该页面的信息,例如使用的字体,包含的内容(文字,图片 等),页面的大小。当然里面的子项也可以是其他对象的引用。页面中包含的信息是包含在一个称为流(stream)的对象里,这个流的长度(字节数)必须直 接给出或指向另外一个对象。如下图:

图3

5. PDF的基本语法: 
文件的第一行是文件头,指明了该文件所遵从的PDF规范的版本号,它出现在PDF文件的第一行。 
一个对象的第一行一般有两个数字和关键字“obj”。例如:

3 0 obj 
<<

/Type /Pages 
/Count 1 
/Kids [4 0 R] 
>>

endobj

第一个数字称为对象号,来唯一标识一个对象的,第二个是产生号,是来表明它在被创建后的第几次修改,所有新创建的PDF文件的对象号应该都是0,即第一次被创建以后没有被修改过。上面的例子就说明该对象的对象号是3,而且创建后没有被修改过。 
对象的内容应该是包含在<< 和>>之间的,最后以关键字endobj结束.

6.             文件Hello World的文件分析: 
6.1.文件的具体分析
%PDF-1.0         
文件头,说明符合PDF1.0规范

1 0 obj 
<<

/Type /Catalog 
/Pages 3 0 R 
/Outlines 2 0 R 
>>

endobj 
Catalog对象(根对象)

2 0 obj 
<<

/Type /Outlines 
/Count 0 
>>

endobj 
outline对象(此处它的计数为0,说明没有书签)

3 0 obj 
<<

/Type /Pages 
/Count 1 
/Kids [4 0 R] 
>>

endobj 
pages 对象(页面组对象),/Type /Pages 说明自身的属性,对象的类型为页码,/Count 1说明页码数量为1,/Kids [4 0 R]说明 页的对象为4, 这里要说明的是如果有多个页面,就多个页面直接连续下去,比如说/Kids [4 0 R 10 0 R], 就说明该PDF的第一页的 对象号是4,第二页的对象号是10。

4 0 obj 
<<

/Type /Page 
/Parent 3 0 R 
/Resources << /Font << /F1 7 0 R >> /ProcSet 6 0 R >> 
/MediaBox [0 0 612 792] 
/Contents 5 0 R 
>>

endobj 
页 对象,/Parent 3 0 R说明其父对象的对象号为3, /Resources << /Font << /F1 7 0 R >> /ProcSet 6 0 R >> 说明该页所要包含的资源,包括字体和内容的类型,/MediaBox [0 0 612 792]说明页面的显示大小(以象素为单位), /Contents 5 0 R说明页面内容对象的对象号为5。

5 0 obj 
<< /Length 44 >> 
stream 
BT 
/F1 24 Tf 
100 100 Td (Hello World) Tj 
ET 
endstream 
endobj

<< /Length 44 >>说明stream对象为字节数,从BT开始,ET结束,包括中间的行结束符。 
Stream说明一个流对象的开始。 
BT说明一个文字对象的开始。 
/F1 24 Tf,Tf说明True font对象,字体明为F1, 大小为24个象素。 
100 150 Td (Hello World) Tj,100 100 说 明这一行文字放置的位置,对于Td, 我们可以这样理解,我们的当前X,Y坐标分别加上100和150就是文本的位置,因为在该例子中只有一个对象,那么 它的位置就是(100,150), 如果下个对象位置信息为100, 50 Td, 那么它的位置应该就是(100+100, 150+50)也就是 (200,200)。(Hello World) Tj说明文本的内容,当然,如果这里是文本的内容可以写成16进制,用<>包含。 
ET说明文字对象的结束 
endstream流对象的结束

6 0 obj 
[/PDF /Text] 
Endobj 
[/PDF /Text]说明PDF的内容类型仅仅为文本,如果有图片则为[/PDF /Image]

7 0 obj 
<<

/Type /Font 
/Subtype /Type1 
/Name /F1 
/BaseFont /Helvetica 
>>

endobj 
Object six defines the 
字体对象,不再多作解释。

所有的对象之后是下面的交叉引用表: 
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 65535 f, 一般每个PDF文件都是以这一行开始交叉应用表的,说明对象0的起始地址为0000000000,产生号(generation number)为 65535,也是最大产生号,不可以再进行更改,而且最后对象的表示是f,表明该对象为free, 这里,大家可以看到,其实这个对象可以看作是文件 头。 
0000000009 00000 n就是表示对象1,也就是catalog对象了,0000000009是其偏移地址,00000为5位产生号(最大为65535),0表明该对象未被修改过, n表示该对象在使用,区别与自由对象,不可以更改。 
下面的几行相信大家就可以告诉我含义了。

Trailer 
<<

/Size 8 
/Root 1 0 R 
>>

startxref 
553 
%%EOF 
trailer 
说明文件尾trailer对象的开始。 
/Size 8说明该PDF文件的对象数目。 
/Root 1 0 R说明根对象的对象号为1。 
Startxref 
553说明交叉引用表的偏移地址,从而可以找到PDF文档中所有的对象的相对地址,进而访问对象。 
%%EOF为文件结束标志。

6.2.PDF解析过程

图4

PDF格式和HTML,XML格式相关推荐

  1. 数据集json格式转化为xml格式、txt格式

    (仅用于自己学习时记录) 在使用YOLO V5训练Tsinghua-Tencent 100k时发现的问题.官方的数据集为json格式,而YOLO需要txt格式.在网上查阅了相关资料,并记录. Tsin ...

  2. JSON格式转换成XML格式

    第一种方法: 需要使用命名空间System.Runtime.Serialization.Json 下面有JsonReaderWriterFactory XmlDictionaryReader read ...

  3. stl2xml.py 代码实现了stl格式转化为xml格式

    #!H:\Sublime_work\Python_work # -*- coding:utf-8 -*- #we can use cmd to control our python programm ...

  4. .NetCore获取Json和Xml格式的配置信息

    本篇将和大家分享的是:如何获取Json和Xml格式的配置信息,主要介绍的是Configuration扩展方法的使用,因为netcore的web应用在Startup中已经默认嵌入appsettings. ...

  5. .net 将html写成的table 转换成excel_Python读取二进制,HTML,XML格式存储Excel

    前言 RPA设计器版本:2020.2 Python读取三种不同存储格式Excel文件 Excel文件的存储格式有多种,有我们平常公认的二进制格式,也有HTML格式,还有XML格式的等. 目前,小编接触 ...

  6. Walkthrough: Word 2007 XML 格式

    本页内容 简介 Word 2007 文档包 Word XML格式的开放打包约定 解析Word 2007文件 确定Word 2007文档中的非XML部件 从文档中分离内容 理解数据存储 结论 简介 Mi ...

  7. 使用Python将TXT文本内容读取后生成指定XML格式的文件

    任务说明: 解析服务器内存和CPU信息.格式是无后缀的文本格式.将其转换为统一XML格式. 源文件名:zmonitor.2017-04-06-14_28 172.17.8.64 saptmqas_cp ...

  8. 税务局接口-xml格式和对象互转工具类使用说明

    税务局接口-xml格式和对象互转工具类使用说明 注意: 由于税务局接口请求xml数据和返回xml数据和常规的不一样,所以手动写了一个工具类,本工具类只针对税务局xml请求参数和返回参数与对象互相. 说 ...

  9. java 转换xml格式的doc或docx文档为docx以及docx转PDF

    转换xml格式的doc或docx文档为docx import org.docx4j.Docx4J; import org.docx4j.openpackaging.packages.Wordproce ...

最新文章

  1. AR智能提升工业效率的4大场景与应用实践!
  2. 创建cordova项目
  3. python学习 day19
  4. 转载--redis密码管理
  5. VMware安装MikroTik RouterOS chr
  6. 孙悟空谈即时通讯有多神通广大
  7. 网络流 小结(更新时间2015/8/8)更新中
  8. 容器平台选型的十大模式:Docker、DC/OS、K8S 谁与当先?
  9. python显示多个图表
  10. 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型
  11. 宽带波形测试软件,适用于5G时代的波形测试分析系统是怎样的? - 全文
  12. 警告warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
  13. iqooneo5桌面原子组件教程分享
  14. 通信原理、模电——部分英文术语对照表
  15. P6207 [USACO06OCT] Cows on Skates G
  16. 在python中import什么意思_python的import是什么意思
  17. windows环境下如何进入到mysql命令行界面
  18. 人生路上对我影响最大的老师
  19. ArcGIS教程:填挖方的工作原理
  20. [附源码]Python计算机毕业设计SSM基于Java的流浪动物救助系统(程序+LW)

热门文章

  1. idea部署RuoYi-Vue分离版详解,够细!你值得拥有
  2. [Share] How To Ask Questions The Smart Way
  3. read函数和fread函数的区别
  4. 解除带宽限速,提升电脑网速
  5. 计算机视觉最新进展概览2021年8月15日到2021年8月21日
  6. C++ 左值引用和右值引用
  7. Ruby on Rails 新版本
  8. 使命召唤16计算机内存不足,《COD16》占用内存过大?官方教你清理空间
  9. 与CPU相关的计算题
  10. Simulink 学习(一)