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.pswp.cn/news/716677.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716677.shtml
英文地址,請注明出處:http://en.pswp.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;系統不會自動添加換行符。 那么這是不是意味著使…