PDF文件格式(二):交叉引用类型“O“

PDF交叉引用类型有三种:"n","f","o";前两种比较常见,本文介绍第三种"o"类型。

type为"o"类型的引用在PDF文件中不能够直接找到对应的obj,它被以压缩的形式内嵌在其他的obj内,因此此类型的引用解析比较麻烦;

解析过程如下:

  1. 获取交叉引用相关信息,先拿到其对应的ofs值,正常交叉引用的ofs表示对应obj的位置,但是这里ofs表示此交叉引用的信息被保存位置所在的obj位置;

  2. 找到对应obj,获取其对应的"First"和"N"的值;First表示obj的stream解压之后需要解析的初始基本位置(base);N表示需要解析的次数,每次解析的内容是交叉引用obj号和stream解压之后需要解析的位置(ofs);最后交叉引用obj内容对应的解析位置是base+ofs,解析的内容是一个pdf的基本类型内容即可。到这里,交叉引用"o"类型的内容解析完毕。

实例:

这是一段交叉引用表,Index内容是13 61,表示从13号Obj开始,到74号结束,这里我们解析46号obj,不过在在PDF文档内查找并没有看到46号obj的,经过解析得出46号obj类型为'o',因此不能直接在文档内找到obj:

上面没有46号obj; 接下来需要解析交叉引用表得到46号obj对应的ofs(解析方法在前文PDF文件格式一),不过此时的ofs表示需要定位的obj的号,这里得到46号obj的ofs为19(截图红线部位),下面就是19号obj内容:

19号obj内容可以看到First是219,N是28;然后解压缩stream内容如下:

219的位置就是"<</DA"的初始位置,即交叉引用内容位置;28表示从开头位置解析次数,这里解析第一次内容是45和0,表示45号obj和此obj对应内容位置为219+0,定位位置是"<<",表示这个obj对应内容是字典,解析一个字典内容是"<</DA(/Helv 0 Tf 0 g )/DR<</Encoding<</PDFDocEncoding 10 0 R>>/Font<</Helv 8 0 R/ZaDb 9 0 R>>>>/Fields\[\]>>",第二次解析内容是46和106,表示46号obj和对应内容位置是219+106,定位位置是"",表示这个obj对应内容是数组,解析一个数组内容就是"\[47 0 R 48 0 R";后面解析方法以此类推。

上面就是获取交叉引用类型为"o"内容的方法了。

相关推荐
ai小陈12 分钟前
GPU服务器租用存储验收:检查点写入与磁盘吞吐实战
运维·服务器·人工智能·ai·ssh·gpu算力
leikooo37 分钟前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
Ivanqhz2 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
沙漠之主2 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
FPGA小徐2 小时前
PA1 基础设施(2)深度解析:NEMU 中 ITRACE、MTRACE、FTRACE、IRINGBUF、ETRACE、DIFFTEST 全解析
java·服务器·网络
YOLO数据集集合3 小时前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化
知行EDI3 小时前
知行之桥 MaBang 端口使用指南——Create Order 订单创建篇
java·服务器·数据库
笑鸿的学习笔记3 小时前
C++笔记之大块顺序写
java·c++·笔记
成旭先生3 小时前
【2026】企业信息模糊查询 API 实战:名称、注册号、统一社会信用代码、企业类型与法人一次查全
服务器·数据库·数据服务
打工仔折腾 AI3 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战