pdf文档解析
最近看了個(gè)開源項(xiàng)目代碼xpdf,從pdf文檔中提取文本,用于建全文索引,老外的代碼什么都好,就是對中文支持不好,估計(jì)也是GNU標(biāo)準(zhǔn)惹的禍,但愿以后unicode橫行的時(shí)候,我們這些chinese coder會過得更輕松一點(diǎn)。?
沒辦法,只能自己看Adobe的官方資料?鏈接地址?,研究一下pdf的協(xié)議標(biāo)準(zhǔn),下面是一片介紹pdf文檔架構(gòu)的文章。
Adobe的PDF參考告訴我們一個(gè)PDF文件可以通過下面4個(gè)方面來理解:??
1.??對象?, 一個(gè)PDF文檔是由一個(gè)由基本數(shù)據(jù)類型組成的數(shù)據(jù)結(jié)構(gòu)。??
2.??文件?(物理結(jié)構(gòu)), 決定對象是如何存放在一個(gè)PDF文件中的, 它們是如何被訪問的,如何被更新的。這個(gè)結(jié)構(gòu)是獨(dú)立于對象的語義的。?
3.??文檔結(jié)構(gòu)?, 說明一些基本的對象類型是如何來表現(xiàn)PDF文檔的成分的:頁,字體,批注,和另外一些內(nèi)容。??
4.??內(nèi)容流?.一個(gè)PDF文件內(nèi)容流包含一系列的指令,描述頁面的外觀或其他圖形實(shí)體的外觀和文件內(nèi)容。??
但是當(dāng)時(shí)對我來說要看懂這幾行字是有很大的困難的,需要了解確切含義,必須看完后面的幾十頁上百頁的內(nèi)容并且要分析一下一個(gè)實(shí)際的PDF文件才能完全領(lǐng)會它的意思。??
后來經(jīng)過長時(shí)間的文檔閱讀,相關(guān)開發(fā),并且具體地分析PDF文件后才把PDF文件的語法,文件的解析搞清楚。雖然說學(xué)習(xí)是痛并快樂著,但是對于當(dāng)時(shí)我來說真的希望有一個(gè)人能夠告訴我一個(gè)簡單的例子,通過一個(gè)簡單的例子來描述PDF的基本組成,它的解析原理和過程。因此下面我主要將以一個(gè)簡單的例子來說明PDF的主要特性并給出一個(gè)簡單的PDF文件的全景。??
1.PDF格式和HTML,XML格式:??
一個(gè)PDF文檔從根本上來說是一個(gè)8字節(jié)序。其實(shí)PDF格式和我們已經(jīng)熟知的HTML,XML等結(jié)構(gòu)化的文件格式一樣,包含有關(guān)鍵字,分隔符,數(shù)據(jù)等等。? ?不同的是PDF文件是按照二進(jìn)制流的方式保存的,而html文件則是文本方式保存的。XML文件一般只包含數(shù)據(jù)本身,并沒有把如何顯示的信息放在其中,因此要顯示一個(gè)XML文件還需要一個(gè)Schema文件才能顯示,否則看到的將是所有的字節(jié)流;HTML包含了數(shù)據(jù)的同時(shí)也包含了一些關(guān)于如何顯示的信息,但是HTML是基于文本存放的,是可讀的,你打開一個(gè)HTML文件就能知道所有顯示在瀏覽器里得文字。 另外就是HTML不能包含二進(jìn)制流,它對圖像文件的引用都是通過鏈接的,全部是外部文件的方式來實(shí)現(xiàn)的。? ?
2.PDF規(guī)范的發(fā)展??
PDF規(guī)范從1993年到現(xiàn)在,已經(jīng)有過7個(gè)版本,六次版本升級,從最初的pdf1.0.6版本到現(xiàn)在的PDF1.7, 每次的版本升級都會加入一些新的特性,PDF參考說明書也是從最初的100多頁到現(xiàn)在的1000多頁,但是PDF文件格式的主要特性還是沒有改變,可以這么理解,PDF1.6是PDF1.0的擴(kuò)展集,學(xué)習(xí)了PDF1.0以后也能基本上理解PDF1.6的內(nèi)容。 因此說我下面的例子是基于一個(gè)PDF1.0的最簡單的一個(gè)PDF文件的分析。? ?PDF規(guī)范的發(fā)展升級:
1.1 1995 加入了文檔加密(40字節(jié)),線索樹,名字樹,鏈接,設(shè)備獨(dú)立色彩資源。? ?
1.2 1996 表單, 半色調(diào)屏幕,和其他的一些高級色彩特性, 對中文,日文和韓文的支持? ?
1.3 2000 數(shù)字簽名, 邏輯結(jié)構(gòu), JavaScript, 嵌入式文件,Masked Images, 平滑陰影, 支持 CID字體的附加色彩。? ?
1.4 2001 文件加密 (128 字節(jié)), 標(biāo)簽式 PDF, 訪問控制,透明,元數(shù)據(jù)流? ?
1.5 2003 文檔加密 (公鑰), JPEG 2000 壓縮, 可選的內(nèi)容組,附加的注解類型? ?
1.6 2005 文檔加密 (AES),增加最大文件支持,加入3D支持,額外的注解類型? ?
1.7?
3.PDF文件的基本組成:??
一個(gè)PDF文件從大的方面來說分4個(gè)部分:? ?l 文件頭,指明了該文件所遵從的PDF規(guī)范的版本號,它出現(xiàn)在PDF文件的第一行。? ?
l 文件體,PDF文件的主要部分,由一系列對象組成。? ?
l 交叉引用表,為了能對間接對象進(jìn)行隨機(jī)存取而設(shè)立的一個(gè)間接對象的地址索引表。? ?
l 文件尾,聲明了交叉引用表的地址,即指明了文件體的根對象(Catalog),從而能夠找到PDF文件中各個(gè)對象體的位置,達(dá)到隨機(jī)訪問。另外還保存了PDF文件的加密等安全信息(以后詳細(xì)討論)。? ?
如下圖:
4.PDF文檔的邏輯結(jié)構(gòu)?
作為一種結(jié)構(gòu)化的文件格式,一個(gè)PDF文檔是由一些稱為“對象”的模塊組成的。并且每個(gè)對象都有數(shù)字標(biāo)號,這樣的話可以這些對象就可以北其他的對象所引用。這些對象不需要按照順序出現(xiàn)在PDF文檔里面,出現(xiàn)的順序可以是任意的,比如一個(gè)PDF文件有3頁,第3頁可以出現(xiàn)在第一頁以前,對象按照順序出現(xiàn)唯一的好處就是能夠增加文件的可讀性,如果你不會用文本編輯器來閱讀PDF結(jié)構(gòu),那么大可不必關(guān)心。正是因?yàn)轫撆c頁之間的不相關(guān)性,就可以對PDF文件的頁碼進(jìn)行隨機(jī)的訪問。?文件尾(Trail),說明根對象的對象號,并且說明交叉引用表的位置,通過對交叉引用表的查詢可以目錄對象(Catalog)。這個(gè)目錄對象是該P(yáng)DF文檔的根對象,包含PDF文檔的大綱(outline)和頁面組對象(pages)引用。大綱對象是指PDF文件的書簽樹;頁面組對象(pages)包含該文件的頁面數(shù),各個(gè)頁面對象(page)的對象號。?
一個(gè)PDF文檔有下圖所示的層次關(guān)系:
頁面(page)對象作為PDF中最重要的對象,包含如何顯示該頁面的信息,例如使用的字體,包含的內(nèi)容(文字,圖片等),頁面的大小。當(dāng)然里面的子項(xiàng)也可以是其他對象的引用。頁面中包含的信息是包含在一個(gè)稱為流(stream)的對象里,這個(gè)流的長度(字節(jié)數(shù))必須直接給出或指向另外一個(gè)對象。如下圖:
5. PDF的基本語法:?
文件的第一行是文件頭,指明了該文件所遵從的PDF規(guī)范的版本號,它出現(xiàn)在PDF文件的第一行。?一個(gè)對象的第一行一般有兩個(gè)數(shù)字和關(guān)鍵字“obj”。例如:?
3 0 obj << /Type /Pages /Count 1 /Kids [4 0 R] >> endobj 第一個(gè)數(shù)字稱為對象號,來唯一標(biāo)識一個(gè)對象的,第二個(gè)是產(chǎn)生號,是來表明它在被創(chuàng)建后的第幾次修改,所有新創(chuàng)建的PDF文件的對象號應(yīng)該都是0,即第一次被創(chuàng)建以后沒有被修改過。上面的例子就說明該對象的對象號是3,而且創(chuàng)建后沒有被修改過。?
對象的內(nèi)容應(yīng)該是包含在<< 和>>之間的,最后以關(guān)鍵字endobj結(jié)束.?
6. 文件Hello World的文件分析:?
6.1.文件的具體分析
%PDF-1.0?文件頭,說明符合PDF1.0規(guī)范?
1 0 obj << /Type /Catalog /Pages 3 0 R /Outlines 2 0 R >> endobjCatalog對象(根對象)?
2 0 obj << /Type /Outlines /Count 0 >> endobjoutline對象(此處它的計(jì)數(shù)為0,說明沒有書簽)?
3 0 obj << /Type /Pages /Count 1 /Kids [4 0 R] >> endobjpages對象(頁面組對象),/Type /Pages 說明自身的屬性,對象的類型為頁碼,/Count 1說明頁碼數(shù)量為1,/Kids [4 0 R]說明頁的對象為4, 這里要說明的是如果有多個(gè)頁面,就多個(gè)頁面直接連續(xù)下去,比如說/Kids [4 0 R 10 0 R], 就說明該P(yáng)DF的第一頁的對象號是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,/Resources << /Font << /F1 7 0 R >> /ProcSet 6 0 R >>說明該頁所要包含的資源,包括字體和內(nèi)容的類型,/MediaBox [0 0 612 792]說明頁面的顯示大小(以象素為單位),/Contents 5 0 R說明頁面內(nèi)容對象的對象號為5。?
5 0 obj << /Length 44 >> stream BT /F1 24 Tf 100 100 Td (Hello World) Tj ET endstream endobj<< /Length 44 >>說明stream對象為字節(jié)數(shù),從BT開始,ET結(jié)束,包括中間的行結(jié)束符。?
Stream說明一個(gè)流對象的開始。?
BT說明一個(gè)文字對象的開始。?
/F1 24 Tf,Tf說明True font對象,字體明為F1, 大小為24個(gè)象素。?
100 150 Td (Hello World) Tj,100 100 說明這一行文字放置的位置,對于Td, 我們可以這樣理解,我們的當(dāng)前X,Y坐標(biāo)分別加上100和150就是文本的位置,因?yàn)樵谠摾又兄挥幸粋€(gè)對象,那么它的位置就是(100,150), 如果下個(gè)對象位置信息為100, 50 Td, 那么它的位置應(yīng)該就是(100+100, 150+50)也就是(200,200)。(Hello World) Tj說明文本的內(nèi)容,當(dāng)然,如果這里是文本的內(nèi)容可以寫成16進(jìn)制,用<>包含。?
ET說明文字對象的結(jié)束?
endstream流對象的結(jié)束?
6 0 obj [/PDF /Text] Endobj
[/PDF /Text]說明PDF的內(nèi)容類型僅僅為文本,如果有圖片則為[/PDF /Image]?
7 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica >> endobjObject six defines the?字體對象,不再多作解釋。?
所有的對象之后是下面的交叉引用表:?
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 nxref說明一個(gè)交叉引用表的開始,交叉引用表的第一行0 8 說明下面各行所描述的對象號是從0開始,并且有8個(gè)對象。?
0000000000 65535 f,一般每個(gè)PDF文件都是以這一行開始交叉應(yīng)用表的,說明對象0的起始地址為0000000000,產(chǎn)生號(generation number)為65535,也是最大產(chǎn)生號,不可以再進(jìn)行更改,而且最后對象的表示是f,表明該對象為free, 這里,大家可以看到,其實(shí)這個(gè)對象可以看作是文件頭。?
0000000009 00000 n就是表示對象1,也就是catalog對象了,0000000009是其偏移地址,00000為5位產(chǎn)生號(最大為65535),0表明該對象未被修改過, n表示該對象在使用,區(qū)別與自由對象,不可以更改。?
下面的幾行相信大家就可以告訴我含義了。?
Trailer << /Size 8 /Root 1 0 R >> startxref 553 %%EOF trailer說明文件尾trailer對象的開始。?
/Size 8說明該P(yáng)DF文件的對象數(shù)目。?
/Root 1 0 R說明根對象的對象號為1。?
Startxref?
553說明交叉引用表的偏移地址,從而可以找到PDF文檔中所有的對象的相對地址,進(jìn)而訪問對象。?
%%EOF為文件結(jié)束標(biāo)志。?
6.2.PDF解析過程
7.結(jié)束語:?
到這里,我們對一個(gè)最簡單的PDF文件的介紹就結(jié)束了,我想大家對PDF文件的格式和特定應(yīng)該已經(jīng)有所了解了。?當(dāng)然,我這里介紹的是不完整的,完整的信息,請?jiān)L問adobe的網(wǎng)站下載:?
http://partners.adobe.com/public/developer/pdf/index_reference.html
總結(jié)
- 上一篇: 如何关闭mac的SIP
- 下一篇: M2Det 网络解读