pdf文件格式分析

PDF的基本語法:

文件的第一行是文件頭,指明瞭該文件所遵從的PDF規範的版本號,它出現在PDF文件的第一行。

一個對象的第一行一般有兩個數字和關鍵字“obj”。例如:

3 0 obj

<< 

/Type /Pages

/Count 1

/Kids [4 0 R]

>> 

endobj

第一個數字稱爲對象號,來唯一標識一個對象的,第二個是產生號,是用來表明它在被創建後的第幾次修改,所有新創建的PDF文件的對象號應該都是0,即第一次被創建以後沒有被修改過。上面的例子就說明該對象的對象號是3,而且創建後沒有被修改過。

對象的內容應該是包含在<< 和>>之間的,最後以關鍵字endobj結束.

 

 

文件的具體分析

%PDF-1.0        

文件頭,說明符合PDF1.0規範

 

1 0 obj

<< 

/Type /Catalog

/Pages 3 0 R

/Outlines 2 0 R

>> 

endobj

Catalog對象(根對象)

/Type /Catalog說明該對象的類型爲/Catalog,/Pages 3 0 R,這裏/Pages指的是這個根對象包含的/Pages的目標是對象號爲3的對象,3 0 R的意思是對對象3的引用。

 

 

2 0 obj

<< 

/Type /Outlines

/Count 0

>> 

endobj

outline對象(此處它的計數爲0,說明沒有書籤)

 

 

 

3 0 obj

<< 

/Type /Pages

/Count 1

/Kids [4 0 R]

>> 

endobj

pages對象(頁面組對象),/Type /Pages 說明自身的屬性,對象的類型爲頁碼,/Count 1說明頁碼數量爲1,/Kids [4 0 R]說明它的孩子、頁的對象號爲4,如果有多個頁面,就有多個頁面對象的引用,例如/Kids [4 0 R 10 0 R], 就說明該PDF的第一頁的對象號是4,第二頁的對象號是10。

 

 

 

4 0 obj

<< 

/Type /Page

/Parent 3 0 R

/Resources << /Font << /F1 7 0 R >> /ProcSet 6 0 R >>

/MediaBox [0 0 612 792]

/Contents 5 0 R

>> 

endobj

頁對象,/Parent 3 0 R說明其父對象的對象號爲3,及Pages對象,/Resources << /Font << /F1 7 0 R >> /ProcSet 6 0 R >>說明該頁所要包含的資源,包括字體和內容的類型,/MediaBox [0 0 612 792]說明頁面的顯示大小(以象素爲單位),/Contents 5 0 R說明頁面內容對象的對象號爲5。

 

 

 

5 0 obj

<< /Length 44 >>

stream

BT

/F1 24 Tf

100 100 Td (Hello World) Tj

ET

endstream

endobj

 

 

 

<< /Length 44 >>說明stream對象爲字節數,從BT開始,ET結束,包括中間的行結束符。

Stream說明一個流對象的開始。

BT說明一個文字對象的開始。

/F1 24 Tf,Tf說明True font對象,字體明爲F1, 大小爲24個象素。

100 150 Td (Hello World) Tj,100 100 說明這一行文字放置的位置,對於Td, 我們可以這樣理解,我們的當前X,Y座標分別加上100和150就是文本的位置,因爲在該例子中只有一個對象,那麼它的位置就是(100,150), 如果下個對象位置信息爲100, 50 Td, 那麼它的位置應該就是(100+100, 150+50)也就是(200,200)。(Hello World) Tj說明文本的內容,當然,如果這裏是文本的內容寫成16進制,則用<>包含。

ET說明文字對象的結束標誌。

Endstream爲流對象的結束標誌

 

 

 

6 0 obj

[/PDF /Text]

Endobj

[/PDF /Text]說明PDF的內容類型僅僅爲文本,如果有圖片則爲[/PDF /Image]

 

 

 

7 0 obj

<< 

/Type /Font

/Subtype /Type1

/Name /F1

/BaseFont /Helvetica

>> 

endobj

字體對象,不再多作解釋。

所有的對象之後是下面的交叉引用表:

xref

0 8

0000000000 65535 f

0000000009 00000 n

0000000074 00000 n

0000000120 00000 n

0000000179 00000 n

0000000322 00000 n

0000000415 00000 n

0000000445 00000 n

xref說明一個交叉引用表的開始,交叉引用表的第一行0 8 說明下面各行所描述的對象號是從0開始,並且有8個對象。

0000000000 65535 f,一般每個PDF文件都是以這一行開始交叉應用表的,說明對象0的起始地址爲0000000000,產生號(generation number)爲65535,也是最大產生號,不可以再進行更改,而且最後對象的表示是f, 表明該對象爲free, 這裏,大家可以看到,其實這個對象可以看作是文件頭。

0000000009 00000 n就是表示對象1,也就是catalog對象了,0000000009是其偏移地址,00000爲5位產生號(最大爲65535),0表明該對象未被修改過,  n表示該對象在使用,區別與自由對象,可以更改。

下面的幾行相信大家就可以告訴我含義了。

Trailer

<< 

/Size 8

/Root 1 0 R

>> 

startxref

553

%%EOF

trailer

說明文件尾trailer對象的開始。

/Size 8說明該PDF文件的對象數目。

/Root 1 0 R說明根對象的對象號爲1。

Startxref

553說明交叉引用表的偏移地址,從而可以找到PDF文檔中所有的對象的相對地址,進而訪問對象。

%%EOF爲文件結束標誌。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章