首页 > 其他分享 >PDF标准详解(二)——PDF 对象

PDF标准详解(二)——PDF 对象

时间:2024-03-03 16:25:11浏览次数:24  
标签:对象 关键字 详解 文档 引用 PDF 字典

上一篇文章我们介绍了一个PDF文档应该包含的最基本的结构,并且手写了一个最简单的 “Hello World” 的PDF文档。后面我们介绍新的PDF标准给出示例时将以这个文档为基础,而不再给出完整的文档示例,小伙伴想自己测试可以根据上一节的文档来进行配置。

对象

上一节我们看到一个个奇奇怪怪的元素,可能也好奇它们的写法,现在我们来正式介绍它们的相关内容,它们就是PDF文档中一个个的对象。

PDF 支持5种基本对象:

  1. 整数和实数:例如43和12.2 这种数字
  2. 字符串,PDF种字符串被包裹在小括号中,例如上一节中的 (hello world), 我们也可以给字符串制定编码,这个在后面介绍
  3. 名称:一般用于字典中的键,以/ 开头,例如上一节中的 /Page 就是一个名称的对象
  4. 布尔值: 由关键字 true 和 false表示
  5. null 对象,由关键字 null 表示

PDF支持3种复合对象

  1. 数组: 包含其他对象的有序集合,数组中的元素可以是其他任何类型的对象,例如可以像 [0 0 0 0 1] 这样只包含数字,也可以像上一节中的 [2 0 R] 包含其他对象的一个引用
  2. 字典: 字典是由无序对的集合组成,将名称映射到对象。字典中的映射被包含在 <<>> 对中,例如 <</Kids [2 0 R]>> 就是一个字典,它将Kids这个名称映射到 [2 0 R] 这个间接引用的对象上
  3. 流:流中一般包含二进制的数据流以及描述属性的字典,一般page中的content都是一个个的流对象。

间接引用

间接引用形成从一个对象到另一个对象的链接,为了将PDF拆分成一个个单独的对象,我们通过间接引用将它们链接在一起,例如上一篇文章中提到的

1 0 obj 
<<
/Kids [2 0 R]
/Count 1
/Type /Pages
>>

对象中就包含间接引用,PDF解析器,知道这个对象是一个Pages对象之后,可以通过Kids 对象指定的间接引用对象知道,当前PDF文档只有一页,这个页面对象就是2 0 这个对象。 这里的R 代表 reference 也就是引用,它是一个关键字,前面的 2 0 代表的是对象编号是2,世代号是0(这里我们不考虑世代号,默认的世代号都是0)

流和过滤器

流用于存储二进制数据,它们由字典和一大块二进制数据组成,字典根据流所放置的特定用途,列出数据的长度,以及可选的其他参数。

从语法上将,流由字典组成,后跟 stream 关键字,换行符,0个或者多个字节的数据,另一个换行符,最后是一个endstream 关键字。根据上一篇文章中给出的页面流对象的定义来看

4 0 obj 
<<
/Length 202 % 流的长度
>>
stream %关键字
1. 0. 0. 1. 50. 700. cm % 202 字节的数据,这里是图形流,下面是图形流的数据
BT
 /F0 36. Tf
 (Hello, World!) Tj
ET
endstream % 流对象结束的关键字 
endobj

标签:对象,关键字,详解,文档,引用,PDF,字典
From: https://www.cnblogs.com/lanuage/p/18050185

相关文章

  • 【PG】查询 正在vacuum对象的(持续)时间
    --https://dataegret.com/2017/10/deep-dive-into-postgres-stats-pg_stat_progress_vacuum/SELECTp.pid,now()-a.xact_startASduration,coalesce(wait_event_type||'.'||wait_event,'f')ASwaiting,CASEWHENa.query~*'^autovacuum......
  • python——面向对象——知识汇总三
    Python封装机制及实现方法 封装(Encapsulation),即在设计类时,刻意地将一些属性和方法隐藏在类的内部,这样在使用此类时,将无法直接以“类对象.属性名”(或者“类对象.方法名(参数)”)的形式调用这些属性(或方法),而只能用未隐藏的类方法间接操作这些隐藏的属性和方法。    Pyt......
  • 质数筛算法详解
    在信息竞赛中,我们总是会遇到很多判断质数的题目,那么在这里就由我来给大家讲解一下质数筛算法(这里所有讲的算法都是基于筛出从\(1\)到\(n\)之间的素数的算法)。1.普通筛法最普通的筛法,也就是将前\(n\)个正整数一个一个来判断是否为素数,并且在判断素数的时候要从\(2\)枚举......
  • 【Mybatis】【三】源码分析- MapperFactoryBean 的创建过程以及 Mapper 接口代理的生
    1 前言本节我们续前两节(调试查看Mapper接口生成过程、源码分析Mapper生成注入入口分析)的内容,看下MapperFactoryBean是如何代理掉我们的@Mapper接口的。上节我们看到我们的Mapper接口的BeanDefinition,已经放进spring的上下文中了,也就是在BeanFactory的BeanDefin......
  • python面向对象(Object Oriented Program)
    面向对象(ObjectOrientedProgram)在Python中,所有的数据(包括数字和字符串)实际都是对象,同一类型的对象都有相同的类型。我们可以使用type()函数来获取关于对象的类型信息。什么是类,什么是对象?在Python中,使用类来定义同一种类型的对象。类(class)是广义的数据类型,能够定义复......
  • 异常(异常是python对象) 和 自定义异常类
    Python提供了异常和断言来处理程序在运行过程中出现的异常和错误什么是异常?分清楚程序发生异常和程序执行错误,它们完全是两码事,程序由于错误导致的运行异常,是需要程序员想办法解决的;但还有一些异常,是程序正常运行的结果,比如用raise手动引发的异常。异常是在程序执行过程中......
  • netcore 将图片转为pdf上传
    privatestaticstringGetImageUrl(SaveWeldListInputmodel){varfileUrl=model.ProcedureFiles[0].File_Url;//获取文件扩展名stringextension=Path.GetExtension(fileUrl);stringfilePathDic="";......
  • [python]将多张图片合并为单个pdf文件
    前言最近有个个人需求是要把多个图片文件合并为一个PDF文件,这样方便用PDF阅读器连续看,避免界面点一下,只会图片放大。(比如看漫画)主要思路是先把单张图片转换成单个PDF文件,然后把PDF文件进行合并。原先是用WPS的转换工具做的,但WPS每次只能批量转换30张,如果有大量图片文件,用WPS就不......
  • C#的类和对象,继承
    ///类与对象///类和对象是面向编程的两个核心概念///类:类是对一群具有相同特征的或者行为事物的统称类是图纸///对象是由类创造出来的一个具体存在可以直接使用对象是图纸造出来的汽车///现有类再有对象类是抽象的对象是具体的//////类的设计数据建模//......
  • 《哈利波特》1-7册全集高清PDF
    《哈利·波特》简介《哈利·波特》这个系列的图书自1997年在英国问世以来,迄今在全世界已发行超过四亿多册,创造了出版史上的奇迹,全套共7册,分别是:《HarryPotterandthePhilosopher’sStone哈利波特与魔法石》、《HarryPotterandtheChamberofSecrets哈利波特与密室》、......