PDF标准详解(二)——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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/716677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式ID选型对比(3)

redis自增 一, 引入依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.6.5</version> </dependency> 二, 配置信息: spring:redis:# 地…

YOLOv8有效涨点,添加GAM注意力机制,使用Wise-IoU有效提升目标检测效果

目录 摘要 基本原理 通道注意力机制 空间注意力机制 GAM代码实现 Wise-IoU WIoU代码实现 yaml文件编写 完整代码分享&#xff08;含多种注意力机制&#xff09; 摘要 人们已经研究了各种注意力机制来提高各种计算机视觉任务的性能。然而&#xff0c;现有方法忽视了…

【C/C++随笔】static 的用法和作用

「前言」所有文章已经分类好&#xff0c;放心食用 「归属专栏」C语言 | C嘎嘎 「主页链接」个人主页 「笔者」枫叶先生(fy) static 的用法和作用&#xff1f;&#xff1f;&#xff1f; static作用&#xff1a; 作用1修改存储方式&#xff1a;用 static 修饰的变量存储在静态区…

项目解决方案: 实时视频拼接方案介绍(中)

目 录 1.实时视频拼接概述 2.适用场景 3.系统介绍 4. 拼接方案介绍 4.1基于4K摄像机的拼接方案 4.2采用1080P平台3.0 横向拼接 4.2.1系统架构 4.2.2系统功能 4.2.3方案特色 4.2.4适用场景 4.2.5设备选型 4.3纵横兼顾&#xff0c;竖屏拼接 4.3.1系统…

如何使用ArcGIS Pro创建最低成本路径

虽然两点之间直线最短&#xff0c;但是在实际运用中&#xff0c;还需要考虑地形、植被和土地利用类型等多种因素&#xff0c;需要加权计算最低成本路径&#xff0c;这里为大家介绍一下计算方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载…

十四、计算机视觉-形态学梯度

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、梯度的概念二、梯度的应用三、梯度如何实现 一、梯度的概念 形态学梯度&#xff08;Morphological Gradient&#xff09;是数字图像处理中的一种基本操作&…

MATLAB中回调定义

目录 指定回调的方法 回调函数语法 传递额外输入参数 将回调定义为默认值 指定回调的方法 要使用回调属性&#xff0c;将回调代码赋予该属性。使用以下技术之一&#xff1a; 引用函数执行的函数句柄。 包含函数句柄和其他参数的元胞数组 计算为有效 MATLAB 表达式的字符向…

pytorch 图像的卷积操作

目录 1.卷积核基本参数说明 2.卷积相关操作说明 3.卷积操作示例 1.卷积核基本参数说明 pytorch进行图像卷积操作之前&#xff0c;需要把图像素格式进行分离&#xff0c;比如一个图像为rgb格式&#xff0c;把R&#xff0c;G,B取出来作为一个ndarray&#xff0c;前文讲过&#…

Linux 下 socket 编程介绍及 TCP 客户端与服务端创建示例

目录 socket 编程接口TCP 服务端TCP 客户端更多内容 本文介绍了 Linux 下的 socket 编程&#xff0c;及总结了使用 socket 接口实现 TCP 服务端和客户端的示例代码。 socket 编程接口 socket() 函数&#xff1a;用于创建一个新的 socket 描述符&#xff1a; int socket(int …

Linux内核MMC框架

1.mmc的概念 1.MMC MultiMedia Card&#xff0c;多媒体存储卡&#xff0c; 但后续泛指一个接口协定&#xff08;一种卡式&#xff09;&#xff0c;能符合这接口的内存器都可称作mmc储存体,工作电压&#xff1a;高电压为2.7&#xff5e;3.6 V&#xff0c;低电压为1.65&#xf…

【微服务】微服务中常用认证加密方案总结

目录 一、前言 二、登录认证安全问题 3.1 认证方式选择 三、常用的加密方案 3.1 MD5加密算法 3.1.1 md5特点 3.1.2 md5原理 3.1.3 md5使用场景 3.2 AES加密算法 3.2.1 AES简介 3.2.2 AES加解原理 3.2.3 AES算法优缺点 3.2.4 AES算法使用场景 3.3 RSA加密算法 3.3…

Flutter Dio进阶:使用Flutter Dio拦截器实现高效的API请求管理和身份验证刷新

Flutter笔记 使用Flutter Dio拦截器实现高效的API请求管理和身份验证刷新 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article…

金融业被网络攻击了怎么办,如何治理和风险控制?

近年来&#xff0c;网络罪犯的人数和复杂程度都在增加&#xff0c;网络罪犯的目标锁定变得更具策略性&#xff0c;更加专注于最大效率和获利。随着有关全球网络犯罪的数据持续涌入&#xff0c;可以看出金融服务企业已然成为头号锁定目标。虽然金融服务企业在网络安全人员、工具…

图论例题解析

1.图论基础概念 概念 &#xff08;注意连通非连通情况&#xff0c;1节点&#xff09; 无向图&#xff1a; 度是边的两倍&#xff08;没有入度和出度的概念&#xff09; 1.完全图&#xff1a; 假设一个图有n个节点&#xff0c;那么任意两个节点都有边则为完全图 2.连通图&…

【MySQL】SQL 优化

MySQL - SQL 优化 1. 在 MySQL 中&#xff0c;如何定位慢查询&#xff1f; 1.1 发现慢查询 现象&#xff1a;页面加载过慢、接口压力测试响应时间过长&#xff08;超过 1s&#xff09; 可能出现慢查询的场景&#xff1a; 聚合查询多表查询表数据过大查询深度分页查询 1.2 通…

错误笔记:Anaconda 错误(闪退、无法安装等) + Pycharm 错误(无法启动)+ python 报错

Anaconda 错误 1、导航器启动中发生-- 闪退 方法一&#xff1a; Windows下&#xff1a; 1&#xff09;使用管理员运行&#xff1a;conda prompt 2&#xff09;执行命令 conda update anaconda-navigator 方法二&#xff1a; 重置Anaconda配置&#xff1a;anaconda-navigator…

C语言第三十四弹---动态内存管理(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 动态内存管理 1、动态内存经典笔试题分析 1.1、题目1 1.2、题目2 1.3、题目3 1.4、题目4 2、柔性数组 2.1、柔性数组的特点 2.2、柔性数组的使用 2.3、…

【c++】计算树的深度和节点数

在C语言中&#xff0c;计算给定树的层数&#xff08;深度&#xff09;和节点总数通常需要使用递归方法。首先&#xff0c;我们需要定义树的节点结构。这里假设我们处理的是一棵二叉树&#xff0c;每个节点有两个子节点&#xff08;左子节点和右子节点&#xff09;。 下面是一个…

5.STL源码解析-算法、仿函数、适配器

算法 STL算法总览 仿函数与适配器 C标准模板库&#xff08;STL&#xff09;是C程序员的得力工具&#xff0c;提供了许多强大而高效的数据结构和算法。在STL中&#xff0c;仿函数&#xff08;Functor&#xff09;和适配器&#xff08;Adapter&#xff09;是两个重要的概念…

C语言文件操作(fputs() 和 puts() 有两个小区别)

fputs() 和 puts() 有两个小区别&#xff1a; 1.puts() 只能向标准输出流输出&#xff0c;而 fputs() 可以向任何流输出。 2.使用 puts() 时&#xff0c;系统会在自动在其后添加换行符&#xff1b;而使用 fputs() 时&#xff0c;系统不会自动添加换行符。 那么这是不是意味着使…