PDF文件结构
概述
PDF是一種不依賴應用程序軟件、硬件和操作系統的文件格式。
PDF頁包含文本、圖形和圖像。頁面外觀由內容流(content stream)描述,內容流包含一些列圖形對象(graphics objects)。
PDF支持不同注釋,有文本注釋、超鏈接、標簽、文件附件、聲音及影視。
PDF包含高級信息,這些信息可用來與其他應用程序進行內容交互。
PDF的核心是它描述復雜圖形和排版的能力。該能力是通過Adobe imaging model實現的。
PDF可作為一種頁面描述語言,該語言是通過圖像模型來描述頁面的圖形外觀。
標準的圖形對象有:path對象、text對象、image對象。
PDF文件可以說成是8位二進制字節序列。是二進制文件。它支持業界壓縮標準,帶有字體管理功能。
PDF文件能夠加密,通過授權才能使用。它還能夠通過數字簽名來授權。
PDF與PostScript的不同:
PDF有嚴格的文檔結構,此文檔結構使應用程序可以以任何順序訪問文檔中不同部分。
為簡化內容流過程,PDF沒有象函數、變量及控制結構這些編程語言的特點。
PDF包含有字體內容以保證高保真。
PDF有可能還含有其他與成像模型無直接關系的內容,如超鏈接、內容交互的邏輯信息。
結構
PDF(Portable Document Format,便攜式文檔結構)是一種很有用的文件格式,與平臺無關。PDF文檔是通過一系列對象序列來構造的,PDF對象包括直接對象(Direct Object)和間接對象(Indirect Object)。間接對象是經過標識了的PDF對象,直接對象通常有布爾型(Boolean)、數值型(Number)、字符串型(String)、名字型(Name)、數組型(Array)、字典型(Dictionary)、空對象(Null)、流對象(Stream)等基本類型。
一個PDF文檔包含了一個或多個頁面,而每一頁都可以包含文檔、圖形和圖像。一個典型的PDF文件結構可分4塊:文件頭、文件主體、交叉引用表和文件尾追蹤器。
文件頭(Header)位于PDF文檔的第一行,它表明了當前文件所使用PDF規范的版本;文件體(Body)中包括構成文件間接對象的一個序列,這些對象代表了文檔中的各個組件,例如字體、頁樹和圖像等等;交叉引用表(Cross-reference Table)則是為了能對間接對象進行隨機存取而設立的一個間接對象地址索引表,它給出了所有當前文件使用對象的入口地址,即字節偏移量,以便系統隨機訪問不同的對象;文件尾追蹤器(Trailer)中包含了交叉引用表的起始地址和其中的對象總數、文檔中Catalog(目錄)對象的對象號以及加密等安全信息,根據文件尾提供的信息PDF的應用程序可以找到交叉引用表和整個PDF文件的目錄對象,從而控制整個PDF文檔。
1.header:
pdf文件的第一行,格式如下:
%PDF-1.7
表示當前文件的版本是1.7(目前最高版本為1.7)。
2.body:
pdf文件中用到的所有對象,包括文本圖象音樂視頻字體超連接加密信息等等,格式如下:
2 0 obj
...
end obj
其中省略號部分是pdf規定的任意合法對象(一共8種)。
3.cross reference table:
所有pdf對象的引用表,其格式如下:
xref
0 5
0000000000 65535 f
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000179 00000 n
其中,xref是開始標志,表示以下為引用表內容;0 5表示從對象號為0的開始,連續有5個對象(0,1,2,3,4),分別用5行來表示。每行的前10個數字代表這個對象相對文件頭的偏移地址,后面5個數字只有當這個對象被刪除的時候才有用,表示這個對象被刪除后又被重新生成后的對象號;最后一位f或n表
示對象是否被使用(n表示使用,f表示被刪除或沒有用)。
4.trailer:
整個pdf文件的入口點,形式如下:
trailer
<<
/Size 8
/Root 1 0 R
>>
startxref
553
%%EOF
/size:這個pdf中總共使用了多少個對象
/root:這個pdf文件的catalog對象的對象號,這是pdf中最頂層的對象
/startxref:后面的數字表示最后一個cross reference table的開始位置
/%%EOF:文件結束符.
實際一個pdf文件是很復雜的,但是上面幾個部分是確定的。
pdf8種對象類型
1.booleam
用關鍵字true或false表示,可以是array對象的一個元素,或dictionary對象的一個條目.
2.numeric
包括整形和實型,不支持非十進制數字,不支持指數形式的數字.
例:
1)整數123 4567 +111 -2
范圍:正2的31次方-1到負的2的31次方
2)實數12.3 0.8 +6.3 -4.01 -3. +.03
范圍:±3.403 × 10的38次方 ±1.175 × 10的-38次方
注意:如果整數超過表示范圍將轉化成實數,如果實數超過范圍就出錯了
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不允許打印是因為pdf有自己的加密措施,限制打印。
找到trailer,如果這個pdf是加密的話會有一個/Encrypt的name,他的值一般形式是n 0 R,表示這個pdf文件的加密信息在n 0這個obj里面記錄。找到這個obj,其下有一個/P的name,他的值是一個數字(32位),其中第三位代表是否有打印權限。
http://cinderella.zw.blog.163.com/blog/static/120242289201152913651544/
總結
- 上一篇: 水培风信子(水培风信子怎么养)
- 下一篇: jQuery UI 控件之Slider