说明:

要解析一个PDF文件,首先要掌握PDF的物理结构,这是第一步。但是这个仅仅只是基础,更重要的是对PDF逻辑结构的解析。PDF的逻辑大体上是一个树状结构,根节点是catalog字典,通过这里去解析页、目录、链接信息等等。

PDF reference 1.7.pdf 中3.6节。

目标:

掌握PDF树型结构,掌握从Root到Page Content解析流程。

Catalog根节点

Catalog是整个PDF逻辑结构的根节点,是通过trailer的Root字段定位,相当重要,因为这里是PDF文件物理结构和逻辑结构的连接点。Catalog字典包含的信息非常多,这里仅列了Pages做个说明。

完整的可查看 PDF reference1.7.pdf Page 137。

以下是Catalog 字典

3 0 obj                % 根据Root中指定的间接引用对象号找到Catalog字典
<<
/Type /Catalog    % 指定类型是Catalog,区分大小写 
/Pages 1 0 R      % 指向页面树的跟节点
>>

endobj                % 对象结束关键字

Page Tree 根节点

1 0 obj             % 根据Catalog字典中Pages指定的间接引用对象号找到Pages字典
<<
/Type /Pages
/Kids [2 0 R]    % 该Page Tree节点下的子节点,可以是Page字典,也可以是其他Page Tree节点           
/Count 1          % 该文档的页面数,1说明文档只有1页。
>>

endobj

Page 字典

2 0 obj                                   % Page 字典
<<
/Type /Page 
/Parent 1 0 R                         % parent page tree node
/MediaBox [0 0 612 792]       % page size (612x792 points)
/Contents 4 0 R                     % content stream
/Resources <<                       % resource dictionary
/Font <<                                 % font list
/Font1 5 0 R>>
 >> >>

endobj

Contents字典

4 0 obj                                   % the page content stream
<<
/Length 0                              % should be byte length of the stream data. 
                                             % We use 0 here for convenience.
>> stream

% Text example: draw "Hello World!" text

BT                                        % begin text object
/Font1 10 Tf                         % set font to /Font1, font size to 10 points
100 700 TD                         % move text position to 100,700
(Hello World!) Tj                  % output the text
ET                                        % end text object

endstream
endobj

Resources字典

这个例子中包含的是font字典

5 0 obj                                 % a font dictionary. 
                                            % This is a base-14 font, so only a few data is required.
<<
/Type /Font
/Subtype /Type1
/BaseFont /Helvetica
>>
endobj

页面继承

看下图,例如Rotate属性可以从page 父节点中继承。

Name Dictionary

PDF文件中的一些对象类型可以被名称引用而不是被对象引用。名称和对象之间的对应是通过文档的名称字典(PDF1.2)建立的,通过Names选项定位在文档目录册中(参看3.6.1部分,“文档目录册”)。在这个字典中的每个选项指派一个名称树结构的根节点(参看3.8.5部分,“名称树”)。

后记:

Catalog中还有许多其他条目,例如:Outline、OpenAction、PageLabels、OpenAction、AA、AcroForm,大家对哪个感兴趣,可留言给我。

问题汇总:

1)Q:Catalog指向的Pages root节点中的Count数是表示该文档的所有页面吗?

A:是的,是该文档的页面总数。PDF中说明:(Required) The number of leaf nodes (page objects) that are descendants of this node within the page tree.

2)Q:Points单位

1 Points = 1/72 inch

屏幕 1 inch = 96 pixel

PDF中Points 坐标转换为屏幕pixel。 例如页面宽为w:w*96/72 得出在屏幕上显示的值。

3)Q:PDF单位能换吗?例如可以将Points换为inch吗?

A:PDF单位只能是Point,1/72 inch。在Page 对象中有UserUnit,可以设置用户空间单位,默认是1。可以设置为2,相当于整个坐标系放大2倍,例如 10*10的矩形框,在UserUnit 为2的里面相当于20*20的矩形框。

/UserUnit 2

微信公众号关注

PDF学习三 PDF文件逻辑结构相关推荐

  1. ROS入门学习三——launch文件

    launch作用:便于一次启动多个节点,可启动本地节点和远程节点及修改添加参数服务器参数. <launch> //<launch>是所有launch文件的根标签<node ...

  2. PDF杂谈一 PDF对象流

    引言 在"PDF学习二 PDF物理结构"的说明里用了较大的篇幅说明了交叉引用表,但是有人表示说,用记事本打开一个PDF文件,并没有看到所谓的交叉引用表. 精华提炼出来的文档的描述有 ...

  3. PDF学习二:PDF文件物理结构

    说明: 在PDF学习一 Hello World中简单提到了PDF文件结构.本文将重点讲PDF文件结构,指的是其文件物理组织方式,决定对象是如何存放在一个PDF文件中, 它们是如何被访问的,如何被更新的 ...

  4. linux环境编程 学习,学习linux环境高级编程首先学习的是文件的操作。因为有.pdf...

    学习linux环境高级编程首先学习的是文件的操作.因为有 学习 Linux 环境高级编程,首先学习的是文件的操作.因为有一句很有趣的话"Linux 下一切皆文件".所以掌握了文件操 ...

  5. (三)、IText通过pdf模板生成pdf文件(可用做回执单等功能)

    一.首先制作一个pdf模板 先用word做出个模板界面, 文件另存为pdf格式文件 通过Adobe Acrobat DC软件打开刚刚用word转换成的pdf文件步骤:文件->创建->创建表 ...

  6. 怎么把pdf转换成excel文件?

    怎么把pdf转换成excel文件?互联网时代的今天,许多办公技巧都有了翻天覆地的变化,其中尤以pdf.excel.word.图片几种文件的相互转换变化较多.过去的办公文员们无论是把pdf转换成exce ...

  7. 如何把PDF转成PPT文件?这几招简单方便

    很多工作者,经常在会议中会用到PPT来汇总方案,但是有些优质的文案是放在PDF文件中储存的,没有办法很好的呈现出来,这时就需要将PDF转成PPT文件,那PDF怎么转换为PPT文件简单方便呢?下面给大家 ...

  8. IntelliJ IDEA 14,15 使用教程,实战总结,倾囊相授,内附PDF学习文档

    转载博文,尊重原创,感谢前辈分享,原文地址:"请叫我大师兄__"的CSDN博客主页 文章目录 前言 一.安装 二.使用 1.Debug 2.修改内存 3.一般设置 4.高级设置 5 ...

  9. pdf转word pdf转图片 图片转pdf 修改pdf文件就像操作Word一样方便(Acrobat DC使用介绍)

    修改pdf文件如操作Word一样方便 你是否尝试过很多方法编辑pdf最后却失败了?你是否曾经认为pdf文件只能阅读不能修改. pdf转word pdf转图片 图片转pdf 你曾希望,谁能手把手教你编辑 ...

最新文章

  1. python文件不存在时创建文件_python-创建一个文件(如果不存在)
  2. 正则表达式:(mysql)REGEXP
  3. Mac下安装mysql5.7 完整步骤(图文详解)
  4. SAP中国首个基于SAP HANA的Business One Analytics项目初试锋芒
  5. 机器学习框架ML.NET学习笔记【1】基本概念与系列文章目录
  6. 1050 棋盘染色 2 - Wikioi
  7. 调用startactivityforresult后,onactivityresult立刻返回RESULT_CANCELED
  8. python中fd和rt是什么意思_python中fd()是什么
  9. windows验证方式
  10. 20172315 2017-2018-2 《程序设计与数据结构》实验三报告
  11. HP DL360 G6 升级BIOS
  12. HTML5+CSS3基础
  13. 4个公认高用的OCR文字识别网站,免费高效率!
  14. Linux 虚拟内存
  15. 驱动备份及还原命令-手记
  16. xamarin其实也是一个鸡肋
  17. 让我带你弄明白什么是RPC ,帮你整理一下你的小脑瓜!
  18. cluster(1)
  19. 工欲善其事必先利其器,利用搜狗输入法设置代码片段
  20. 【2017今日头条】头条校招(JAVA)

热门文章

  1. 字符串转化为对象的方法
  2. php 字符串转对象,php中怎么将对象转化为字符串
  3. vivo新系统和鸿蒙哪个好,VIVO将成最大赢家?苹果设计师亲自出马!华为鸿蒙系统要被截胡...
  4. js 保留6位有效数字,直接舍去,不四舍五入
  5. 关于笔记本运行调试 HTC Vive
  6. 自学编程80余年,这些私藏的实用工具学习网站陪我走到了现在,必须收藏,学习效率翻倍! - 网站篇
  7. STM32F10xxx系统RCC讲解
  8. 两台笔记本怎么互传文件
  9. Javascript正则匹配HTML字符串
  10. 移动端页面滚动后不触发touchend事件