首页 > 编程语言 >pdf.js源码解析-PDF文件的结构

pdf.js源码解析-PDF文件的结构

时间:2024-03-12 18:35:55浏览次数:28  
标签:文件 xref 包含 对象 js 源码 文档 PDF

为了了解pdf.js源码的详细结构和功能,先来看看PDF的文件结构,然后才能知道pdf.js中的代码是如何解析并且为何这样操作PDF文件的。
PDF文件基本是由header、body、trailer组成。header包含了这个PDF的信息,比如PDF的版本,创建时间,以及作者等。body包含了PDF文件的实际内容,比如文本,图片,以及其他多媒体内容。trailer包含了PDF文件的文件大小、文件校验、文件再硬盘中的位置等。
PDF包含了不仅仅是文本的内容,他还包含图片和其他的多媒体组件,密码保护,可执行的javascript脚本等。基本的PDF文件结构如图所示

PDF的Header

PDF文件的头部包含了PDF的版本号。比如%PDF-1.7。其中%再PDF中表示注释。

PDF文档中的Body

body块是用来存储所有被展示给用户的数据。换言之,PDF文档的body包含了文本流、图片、其他多媒体组件等。

xref表格

PDF文档中所有的对象都有一个引用地址被放在了交叉表格中(xref),这使得能够快速并且随机的查找到PDF文档中所需要的对象,所以没有必要读取整个PDF文档的数据来定位某个特定的对象。xref中每个入口包含了20字节,下面是一个示例:

xref
0 1
0000000023 65535 f
3 1
0000025324 00000 n
21 4
0000025518 00002 n
0000025632 00000 n
0000000024 00001 f
0000000000 00001 f
36 1
0000026900 00000 n

交叉表格位于PDF文档的最后面。上面这个示例中包含了4个子块(注意只包含了2个数字的行)。这4行的第一个数字表示了对象的数字,第二个数字表示了当前子块中包含了几个对象。每个对象包含了一个入口,这个对象的引用使用20个字节来展示。
前面10个字节(比如0000000023)表示了这个对象从当前文件的字节偏移数量,从这个PDF文件的最开始计算字节偏移量。
后面用空格分开的表示了当前对象的第几代(已经修改了几次)。接着是字符f或者n,表示这个对象是否是在使用中。n表示在使用;f表示没使用。
xref中的第一个对象使用了65535代的表示了当前文档开始的位置。
xref中最后一个对象表示的代数式0。
在第二个子块中包含了一个ID为3的只包含了一个组件对象,这个对象开始的位置在25324字节。子块3中包含了4个对象,ID式21然后开始的位置式25518。其余对象的ID分贝式22、23、24。
每个在文件中的对象被指定了一个标记来表示当前对象是否正在被使用(n表示在使用,f表示没有使用)。没有使用的对象包含了下一个没有使用对象的引用,以及当自由对象被使用后他的代数值。这种标记方法保证了这个文件中的每个部分都被用上了。
在交叉表中因为0指向了下一个没被使用的对象(f标记的行),对象23,因为对象23也没有使用并且指向了下一个没有使用的对象,所以对象24又被指回了0。
所以如果查看完整的交叉表就应该是这样的

xref
0 1
0000000023 65535 f
3 1
0000025324 00000 n
21 1
0000025518 00002 n
22 1
0000025632 00000 n
23 1
0000000024 00001 f
24 1
0000000000 00001 f
36 1
0000026900 00000 n

第一个示例减去了没有被使用的多余对象,进行了省略的写法。
表示代数的这个数字式递增的。如果将对象变成不使用,那么他的代数会增加为2,如果对象23变成可用,他的代数又会仍然保持为1。然而,当对象23再次被变为不可用,那么他的代数会增加为2。
当一个文档更新之后,他通常包含了多子块。不然他只应该包含一个0开始的子块。

Trailer文档尾

所有的PDF阅读器都应该从文件的尾部开始读起。因为PDF的Trailer包含了交叉表和其他特定对象来读取PDF文档。
一个PDF文件的trailer示例:

trailer
<< /Size 22 /Root 2 0 R /Info 1 0 R >>
startxref
24212
%%EOF

文件的最后一行使用了一个结束符%%EOF。交叉表xref使用了startxref字符串来表示xref的开始位置。这个文件的xref开始位置在24212字节。trailer块使用了trailer字符串表示开始。trailer的内容使用了<<和>>字符来进行包裹(这是字典对的格式)。
trailer块定义了几个关键字,比如/Size/Root/Info等。

正向更新

PDF文档被设计为正向更新,表示我们可以增加新的对象在文件的结尾而不是重新覆盖整个文档。这能够快速的保存和修改。下面是一个被修改后的PDF文档的内容。可以看到每次修改都会在文件结尾添加trailer即可。

对于删除对象,是将他标记为f,每个trailer都是使用%%EOF进行结尾,并且包含了一个只想上一个xref块的引用值,使用/Prev关键字来标记。

标签:文件,xref,包含,对象,js,源码,文档,PDF
From: https://www.cnblogs.com/xxss0903/p/18068969

相关文章

  • Hive-源码分析一条hql的执行过程
    一、源码下载 下面是hive官方源码下载地址,我下载的是hive-3.1.3,那就一起来看下吧https://dlcdn.apache.org/hive/hive-3.1.3/apache-hive-3.1.3-src.tar.gz二、上下文<Hive-源码带你看hive命令背后都做了什么>博客中已经讲到了hive命令执行后会一直循环处理控制台输入的hq......
  • js 实现点击下拉滚动
    在JavaScript中实现点击下拉菜单后滚动到特定位置,通常用于导航栏的下拉菜单或对话框内容的自动滚动等场景。以下是一个简单的示例:假设我们有一个HTML结构,包含一个可点击的元素(如按钮)和一个需要滚动的下拉列表:<buttonid="dropdown-toggle">点击打开下拉菜单</button><div......
  • 【短剧小程序开发】费用从20元送源码到20万定制到底有什么区别?
    网络微短剧无疑是2024年最火热的蓝海项目之一。2023年国内微短剧总量已达373.9亿元,可知道全年电影总票房才549亿元。短剧的市场总量超过电影票房指日可待,预计2027年短剧总量可达1000亿元。稍微关注短剧赛道的朋友就会发现,23年至今不断会有某某短剧上线当日充值超2000万等等新......
  • js 获取当前时间后三个月的所有日期list
    //获取三个月后的所有日期functiongetDatesOfLastThreeMonths(){consttoday=newDate();constdates=[];for(leti=0;i<=2;i++){constyear=today.getFullYear();constmonth=today.getMonth()+i;//获取当前月份之前......
  • 【专题】2024“破次元”数字社交文化观察报告合集PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=35351原文出处:拓端数据部落公众号渴望财富自由带来生活重压,千万高校毕业生面临职场高标准,焦虑情绪凸显。Z世代虽独立,仍渴求亲密关系,多数独生子女依赖自我决策,同时渴望成为父母依靠。他们钟爱线上社交,日均手机使用超8小时,享受其带来的安全自由与个......
  • 三、jsPlumb实现流程图配置--Endpoint详细参数
    一、前言基于上一篇文章中已经搭建好的jsPlumb项目,在此篇文章中演示Endpoint的一些参数以及参数的效果。二、Endpoint创建在一个节点上创建Endpoint有三种方式://方式一:直接使用字符串指定类型。注意:大小写敏感//圆点形constendpoint1=jsPlumb.value.addEndpoint......
  • 如何在Visual Studio中调试.NET源码
    今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。我一般的做法是先判断是否为null,再判断Count。看了一下Count的源码如下:1[__DynamicallyInvokable]2publicintCount3{4[__DynamicallyInvokable]5get6......
  • RocketMQ为什么这么快?我从源码中扒出了10大原因!
    大家好,我是三友~~RocketMQ作为阿里开源的消息中间件,深受广大开发者的喜爱而这其中一个很重要原因就是,它处理消息和拉取消息的速度非常快那么,问题来了,RocketMQ为什么这么快呢?接下来,我将从以下10个方面来探讨一下RocketMQ这么快的背后原因如果你对RocketMQ还不了解,可以从公众......
  • RocketMQ为什么这么快?我从源码中扒出了10个原因!
    大家好,我是三友~~RocketMQ作为阿里开源的消息中间件,深受广大开发者的喜爱而这其中一个很重要原因就是,它处理消息和拉取消息的速度非常快那么,问题来了,RocketMQ为什么这么快呢?接下来,我将从以下10个方面来探讨一下RocketMQ这么快的背后原因如果你对RocketMQ还不了解,可以从公众......
  • python得scrapy抓中文,保存csv、json、txt文件乱码解决方法
    保存json和txt文件,出现这种东西不是乱码,是unicode,例如:\u96a8\u6642\u66f4\u65b0>\u25a0\u25a0\u25a在settings.py文件中加入下面一句code,之后就是中文了。FEED_EXPORT_ENCODING='utf-8'保存csv表格文件时,会出现中文乱码,这个确实是乱码,例如:瀵掑啲瀹濈彔鎶......