1. 程式人生 > >PDF檔案格式

PDF檔案格式

檔案結構分四個部分(物理結構)

檔案頭(Header):指明瞭該檔案所遵從PDF規範的版本號
檔案體(Body):由一系列的PDF間接物件組成。這些間接物件構成了PDF檔案的具體內容如字型、頁面、影象等
交叉引用表(Cross-reference Table):是為了能對間接物件進行隨機存取而設立的一個間接物件地址索引表。

這裡寫圖片描述
檔案尾(Trailer):聲明瞭交叉引用表的地址,指明檔案體的根物件(Catalog),還儲存了加密等安全資訊。根據檔案尾提供的資訊,PDF的應用程式可以找到交叉引用表和整個PDF檔案的根物件,從而控制整個PDF檔案,如下示意圖
這裡寫圖片描述
PDF的文件結構是一種樹型結構,反映了檔案體中間接物件之間的等級層次關係。
樹的根節點就是PDF檔案的目錄物件(Catalog),是PDF文件的根物件,包含PDF文件的大綱(Outlines)和頁面組物件(Pages)。
根節點下有四個子樹:頁面樹(Pages Tree)、書籤樹(Outline Tree)、線索樹(Article Threads)、名字樹(Named Destination)。

資料物件型別

PDF檔案的基本元素是PDF物件(PDF Object),包括直接物件(Direct Object)和間接物件(Indirect Object)。
直接物件如下幾種基本型別:

  • 1.布林型(Boolean):用關鍵字true或false表示,可以是array物件的一個元素,或dictionary物件的一個條目
  • 2.數值型(Number):包括整形和實型,不支援非十進位制數字,不支援指數形式的數字.

  • 3.字串型(String):由一系列0-255之間的位元組組成,一個string總長度不能超過65535.string有以下兩種方式

1)由()包含起來的一個字串,中間可以使用轉義符”/”:

(abc)  表示abc
(a//)  表示a/

2)由<>包含起來的一個16進位制串,兩位表示一個字元,不足兩位用0補齊:

 <Aabb>  表示AA和BB兩個字元
 <AAB>  表示AA和B0兩個字元
  • 4.名字型(Name):由一個前導/和後面一系列字元組成,最大長度為127.

和string不同的是,name是不可分割的和唯一的.
不可分割就是說一個name物件就是一個原子,比如/name,不能說n就是這個name的一個元素;
唯一就是指兩個相同的name一定代表同一個物件.
從pdf1.2開始,除了ascii的0,別的都可以用一個#加兩個十六進位制的數字表示.

 /name       *#表示name*
 /name#20is  *#表示name is*
 /name#200   *#表示name 0*
  • 5.陣列型(Array):用[]包含的一組物件,可以是任何pdf物件(包括array).

雖然pdf只支援一維array,但可以通過array的巢狀實現任意維數的array(但是一個array的元素不能超過8191)
例:

[549 3.14 false (Ralph) /SomeName]
  • 6.字典型(Dictionary):用”<<”和”>>”包含的若干組條目,每組條目都由key和value組成,其中key必須是name物件,並且一個dictionary內的key是唯一的;value可以是任何pdf的合法物件(包括dictionary物件).
例:
 << /IntegerItem 12
 /StringItem (a string)
 /Subdictionary << /Item1 0.4
     /Item2 true
     /LastItem (not!)
     /VeryLastItem (OK)
   >>
 >>
  • 7.流物件(Stream):由關鍵字stream和endstream包含一系列位元組

內容和string很相似,但有區別:
stream可以分幾次讀取,分開使用不同的部分,string必須作為一個整體一次全部讀取使用;
string有長度限制,但stream卻沒有這個限制.一般較大的資料都用stream表示.

  • 8.空物件(Null):用null表示,代表空

如果一個key的值為null,則這個key可以被忽略;如果引用一個不存在的object則等價於引用一個空物件.

間接物件是一種標識了的PDF物件,這個標識叫作間接物件的ID。標識的目的是為了讓別的PDF物件引用。任何PDF物件標識後都變成了間接物件。

頁面描述指令

PDF共有60個頁面描述指令。
這60個頁面描述指令描述了頁面上的一系列圖形物件。這些圖形物件可分為四類:
路徑物件(Path Object)
文字物件(Text Object)
影象物件(Image Object)
外部物件(XObject)

PDF中的資源

PDF檔案中的內容(如文字、圖形、影象)都儲存在頁面物件的Contents關鍵字對應的流物件(Stream)中。
內容流(Content Stream)中用到了很多基本物件如數字、字串,這些都是用直接物件(Direct Object)表示的。
但還有其他一些物件如字型(Font),本身就是用字典物件(Dictionary)或流物件(Stream)來表示的,無法用直接物件表示,
而內容流中又不能出現任何間接物件,於是就將這些物件命名,並在內容流中用相應的名字來表示它們。
這些用名字來表示的物件就稱作命名資源(Named Resources)。

在頁面物件中有一個資源項(Resources Key),該項列出了內容流中用到的所有資源,並建立了一個資源名字與資源物件本身的對映表。
PDF中的命名資源有:
指令集(ProcSet)
字型(Font)
色彩空間(Color space)
外部物件(XObject)
擴充套件的圖形狀態(Extended graphics state)
底紋(Pattern)
使用者擴充套件標記列表(Property list)。

非命名資源有(非命名資源都是被隱含引用的,因此沒有命名的需要):
Encoding
Font descriptor
Halftone
Function
CMap

文件舉例

%PDF-1.4 *#header格式:%PDF-1.5*
%My company (CodePage = 932)

1 0 obj *#物件格式:序號 版本號 obj <<...>>endobj*
<<
/Producer(My company)
/Creator(MyPDF.DLL (Ver.03-04-12.A00))
/CreationDate(D:20160511134447+08'00')
/ModDate(D:20160511134447+08'00')
>>
endobj *#Object結束關鍵字*

7 0 obj
<<
/Type /XObject
/Subtype /Image
/Filter /DCTDecode
/BitsPerComponent 8 *#顏色位數*
/ColorSpace /DeviceRGB
/Width 507  *#image的寬度*
/Height 317 *#image的高度*
/Length 38682
>>
stream
... ...
endstream
endobj

4 0 obj
<<
/Type /Page
/Parent 3 0 R *#其父物件號為3,即Pages物件*
/MediaBox[0.00 0.00 595.28 841.89] *#頁面顯示大小,以畫素為單位*
/Resources 5 0 R  *#該頁包含的資源*
/Contents 6 0 R *#頁面內容物件的物件號為6*
/ColorSpace <</CS1 2 0 R>> >> *#色彩空間*
>>
endobj

5 0 obj
<<
/ProcSet[/PDF /Text /ImageB /ImageC /ImageI]
/XObject << /Im1 7 0 R >> *#外部物件*
>>
endobj

6 0 obj
<<
/Filter /FlateDecode *#流物件的壓縮方式為zip的壓縮演算法*
/Length 155 *#流物件的長度*
>>
stream *#流物件*
... ...
endstream *#流物件結束標誌*
endobj

2 0 obj
<<
/Type/Catalog
/Pages 3 0 R
>>
endobj

3 0 obj
<<
/Type /Pages 
/Kids [ 4 0 R ] *#kids物件說明它的子頁物件為4*
/Count 1  *#頁面數量為1*
>>
endobj

xref *#交叉引用表開始標誌*
0 8 *#表示從物件號為0的開始,連續有8個物件(0,1,...,7),分別用8行來表示*
0000000000 65535 f *#每行的前10個數字代表這個這個物件相對檔案頭的偏移地址*
0000000056 00000 n *#後面5個數字只有當這個物件被刪除的時候才有用,表示這個物件被刪除後又被重新生成後的物件號*
0000039567 00000 n *#最後一位f或n表示物件是否被使用(n表示使用,f表示被刪除或沒有用)*
0000039623 00000 n
0000039103 00000 n
0000039229 00000 n
0000039329 00000 n
0000000235 00000 n

trailer *#整個pdf檔案分析的入口點*
<<
/Root 2 0 R *#這個pdf檔案的catalog物件的物件號,這是pdf中最頂層的物件*
/Info 1 0 R 
/Size 8 *#這個pdf中總共使用了多少個物件*
>>

startxref *#cross reference table的開始位置*
39692
%%EOF *#檔案結束符*

如果這個pdf是加密的,那麼在trailer裡會有一個/Encrypt的name。
它的值一般形式是n 0 R,表示這個pdf檔案的加密資訊在n 0這個obj裡面記錄.
找到這個obj,其下有一個/P的name,它的值是一個數字(32位)其中第三位代表是否有列印許可權。

Image物件

相關推薦

PDF檔案格式轉換攻略:PDF格式轉換圖片格式

關於PDF檔案格式的轉換大家有了解多少嗎?就比如將PDF格式轉換成圖片格式,可能之前大家對於PDF件大家都有了解到,辦公中我們經常遇到過。現在小編在這裡教大家如何將PDF格式轉換成圖片格式,有興趣的夥伴可以學著嘗試一下! 1、操作之前可以將轉換成圖片格式的PDF檔案另存到電腦桌面上,這樣便於在後面的操作。

入門級 PDF 檔案格式分析

一、概述:     結構化的文件格式PDF(Portable Document Format)是由美國排版與影象處理軟體公司Adobe於1993年首次提出的。Adobe Reader這款pdf閱讀器軟體相信大家並不陌生,人們熟知它的原因是因為它的應用相當普及,可能接觸過計

專案心得-PDF檔案格式深入瞭解!

工作一個星期了,今天的專案終於算是告一個段落了,雖然是2個高手而不是自己的力量完成的, 但卻學到了很多東西,首先是PDF檔案格式.讀了一天的PDF檔案說明書,全是英文,看的眼睛都花了,上網查卻沒有查到什麼太多的東西,全是一些轉載,重複那幾篇看了無數遍的的PDF說明. 於是還是

PDF檔案格式的特點

PDF 全稱 Portable Document Format,譯為可移植文件格式,是一種電子檔案格式。 PDF 的特點: 跨平臺:這種檔案格式與作業系統平臺無關,也就是說,PDF 檔案不管是在 Windows,Unix還是在蘋果公司的 Mac OS 作業系統中都是通用的。

PDF檔案格式

檔案結構分四個部分(物理結構) 檔案頭(Header):指明瞭該檔案所遵從PDF規範的版本號 檔案體(Body):由一系列的PDF間接物件組成。這些間接物件構成了PDF檔案的具體內容如字型、頁面、影象等 交叉引用表(Cross-reference Tabl

如何快速的把圖片轉換為PDF檔案格式

有的時候大家在網上找的資料文獻只有圖片的形式,但是我們又需要將其打印出來,這可如何是好呢,這個問題並不是不可解決的,我們可以將其轉換為PDF檔案進行轉換,那如何進行操作的呢,跟著小編一起來試一試吧!   步驟一:開啟瀏覽器,進入百度首頁,搜尋迅捷PDF線上轉換器。找到對應的頁面。  

PDF檔案轉DWG格式檔案要如何進行轉換?

PDF檔案轉DWG格式的檔案要如何進行轉換?小夥伴們都知道,在CAD行業中,我們最常見的就是dwg格式的檔案,但是要交給你的客戶的時候dwg格式的檔案不方便進行檢視,就需要將檔案轉換成PDF,但又在檢視過程中發現編輯錯誤的地方,就需要進行修改,只能在CAD編輯器中進行修改檔案內容,編輯器中只能開啟dwg格式的

使用java將html原始碼(拼裝、可獲取頁面原始碼)轉換成為("html頁面",“doc文件檔案”,“pdf格式”),,doc檔案轉換成為pdf,,檔案的刪除、壓縮...

目錄: 1、轉換成為html頁面 2、html原始碼轉換成為doc檔案 3、html原始碼轉換成為pdf檔案 4、壓縮多個檔案成為一個zip檔案

Word檔案格式轉換:Word如何轉換成PDF格式

Word檔案如何轉換成PDF格式呢? 可能大部分人都知道PDF轉換成word格式,畢竟這也是一種常用的轉換。就word轉換成PDF小編在這裡告訴大家一種方法! 1、首先我們需要藉助輔助工具進行檔案格式轉換,大家可以在百度瀏覽器上搜索迅捷PDF轉換器,安裝在我們所操作的電腦上。 2、滑鼠雙擊執行開啟PDF轉換

用手機如何將Excel格式轉為PDF檔案

Excel表格是office辦公文件最常見的一種格式,它的獨特之處就在於它是表格形式,而且這種表格還有計算功能,統計資料、自動求和等、所以整理資料少不了它。通常整理完的資料不希望被改動,所以會將Excel轉為PDF格式,那怎樣轉化呢?接下來交教大家一個用手機轉換的簡單方法。 轉換工具:迅捷PDF轉換器 轉

儲存電腦的PDF檔案怎樣轉換成DXF格式

儲存電腦的PDF檔案怎樣轉換成DXF格式?在大多數時候我們在繪製完成一張CAD圖紙檔案的時候基本上都是DWG與DXF兩種格式的,那我們在將PDF格式檔案轉換成CAD圖紙檔案時候想要將其轉換成DXF格式我們應該如何進行操作呢,今天小編就要來教教大家儲存電腦上面的PDF檔案怎樣轉換成DXF格式的全部操作步驟,希望

Python - pyecharts:直接將圖片儲存為 png, pdf, gif 格式檔案

關鍵:使用 pyecharts-snapshot外掛 第一步:安裝node.js 第二步:安裝phantomjs 命令列中輸入: npm install -g phantomjs-prebuilt 安裝完成後檢查是否成功,命令列輸入: phantomjs 第三

windows下用Python把pdf檔案轉化為圖片(png格式)

最近工作中需要把pdf檔案轉化為圖片,想用python來實現,於是在網上找啊找啊找啊找,找了半天,倒是找到一些程式碼。 1、第一個找到的程式碼,我試了一下好像是反了,只能實現把圖片轉為pdf,而不能

Java讀取多種檔案格式檔案pdf,pptx,ppt,doc,docx...)

通過開源pdfbox和poi進行處理多種檔案格式的文字讀入 1.需要的jar的maven座標: <dependency> <groupId>org.apache.pdfbox</groupId> <

PDF格式檔案轉成二進位制並生成Base64編碼,將Base64編碼轉成PDF檔案

// 為工程新增 sun.misc.BASE64Encoder和sun.misc.BASE64Decoder包: //右鍵專案》屬性》Java Build Path》jre System Library 》access rules》resolution選擇accessi

前端jspdf生成PDFbase64格式的字串通過ajax傳輸後臺生成PDF檔案

前端JS框架:AngularsJS前後端互動:Ajax後端技術:Java相關程式碼:HTML程式碼片段:<button ng-click="generatePdf()">生成賬單</button> <div id="zero">HelloW

PDF檔案如何分割與合併

在日常工作中,我們越來越多地接觸到PDF檔案。有時候我們會有將一個PDF檔案拆分成多個檔案或將多個PDF檔案合併成一個檔案的需求。對於一些經驗豐富的職場老手來說,解決這個問題輕而易舉,而對於一些職場新人來說卻是一個難題。今天,小編就給大家詳細講解PDF檔案如何拆分與合併。    1、因為PD

PDF檔案中添加簽名的方法

工作中,時常會需要將紙質檔案掃描成PDF檔案。當我們忘記在紙質檔案上簽名而檔案已經掃描時,我們該如何直接在PDF檔案中添加簽名呢?今天,小編就給大家帶來在PDF檔案中添加簽名的方法。   1、首先我們需要通過PDF編輯器開啟我們需要添加簽名的PDF檔案,這裡我們使用編輯器是比較常見的,其他編

hive:資料型別及檔案格式

Hive的資料型別     Hive 提供了基本資料型別和複雜資料型別 1.1 原始資料型別 整型 TINYINT — 微整型,只佔用1個位元組,只能儲存0-255的整數。 SMALLINT– 小整型,佔用2個位元組,儲存範圍–327

ini檔案格式

ini檔案定義 https://en.wikipedia.org/wiki/INI_file The INI file format is an informal standard for configuration files for some platforms or software. INI