PDF文件格式的一些研究心得

現在讓我簡要介紹一下PDF的文件格式,PDF的文件格式說明,最權威的就是Adobe官方網上的PDFReference,純英文版的,一千多 頁,個人認爲對於國內的開發者做PDF的生成的時候,最大的困難就在這裏了,一個是沒有充足的時間去看,二個一看滿篇的英文基本上就頭大。我只看了三分之 一左右,看了整體描述和有針對性地看了一些,必竟HTML轉PDF的時候,有不少的東西是用不着的。現在我介紹一下PDF格式的一些要點:
一、 PDF文件是一種文本和二進制混排的格式,但是Adobe更願意讓人把它當成二進制的文件,所以在裏面建議當文件裏面的文本太多的時候,可以加一些二進制 的註釋,好讓現有的一些編譯器把它當成二進制文件。裏面的文本主要是對文件結構的一種描述,二進制的內容來自於三個方面:1、圖片;2、字體;3、壓縮後 的Post Script。
二、文件結構可以分爲三方面:
1、首部。用文本編輯器打開的時候就可以看到:%PDF-1.4 這樣的字眼,其中最後一位就是PDF文件格式版本號,軟件的版本號總要比文件格式的版本號高1,比如說Read 5能打開的內容就是4。
2、文件體。裏面有若干個的obj,以及xref來組成,OBJ這種形式:
30979 0 obj
<<
/Linearized 1
/O 30982
/H [ 15061 25084 ]
/L 9379963
/E 166967
/N 978
/T 8760262
>>
endobj 
第一個數字就是這個OBJ的順序號,是爲了便於在xref中查找,後面的0是爲了區分不同的OBJ,現在都是0(個人感覺是爲了以後擴展用的)後面就是關鍵字obj.下面的各行就是屬性,/關鍵字 值 的形式。
xref是obj的索引表,用來索引各個obj在文檔中的起始位置,它的形式是:
xref
0 211
0000000000 65535 f
0000000009 00000 n
……
0000087999 00000 n

trailer
<<
/Size 211
/Root 2 0 R
/Info 1 0 R
/ID [<B29FBB52459C4623DB1A90CBFC28381E><B29FBB52459C4623DB1A90CBFC28381E>]
>>
其 中0,211分別代表這個xref的obj的起始和終止序號。其中0這個是估計是爲了程序中好處理所以加了這個(個人英文水平不行,有些地方看不明白), 可以不加入這個。下面的各行就代表各個obj在這個文檔的起始位置,其中第一串字符(10個)代表起始位置,中間的五個字符也是爲了區分用的,現在基本上 全爲0, 後面的字母有兩種f代表刪除的,n代表要使用的。後面的trailer是對整個xref的摘要,說明裏面有多少個OBJ,讀的時候從哪個OBJ開始解析, 信息節點等,ID是爲了讓一些文件檢索工具能夠唯一區分文件。
3、文件尾。
startxref
88019
%%EOF
因爲一個文檔中可以有多個xref,所以這裏要指明要從哪個xref開始進行解析這個文件。
從 上面的分析來看:PDF文件內部校驗是很複雜的,只要裏面有一位錯位了,就會導致整個文檔讀取錯誤。而且它時碩會有不少的二進制內容,所以一般來說在內存 裏面存儲的時候,用流對象,而不能用字串,特別是生成的時候,每加入一個obj的時候,去獲取一下當前流的長度就可以得到每個obj的起始位置,同時把獲 取的這些位置存到ArrayList裏面,這樣就可以很方便地得到和內容相一致的xref了。
三、PDF裏面對象的組成形式,可以說是用樹形結構來相互關聯的,駔下面掛頁集合,頁集合下面掛頁,頁裏掛圖片,鏈接,內容等
四、PDF裏面的obj的類型主要有以下幾種:
1、文件描述對象,用來描述這個文件的標題,作者,時間等
2、組對象,也就是文檔內容的起始結點。Type 爲Catalog
3、頁集合,裏面聚合了大量的頁對象。  Type 爲pages
4、頁對象,裏面指明瞭當前頁裏面用到的字體,內容,活動對象,圖片等。Type 爲page
5、活動對象,有鏈接,文字,聲音,電影等,Type 爲Annots
6、圖片對象, Type 爲 XObject
7、字體對象,Type 爲 Font 。PDF可以內置字體,所以即使目標機器上沒有,只要它內置了,也可以正常地顯示,不受影響(內置字體,這個我還沒有研究清楚,希望知道的人可以告訴我一下,這裏先謝了)
8、 流對象。所有的二進制內容都是存在這個對象裏面,文件流的常見的壓縮方式是:圖片的一些壓縮算 法,FlateDecode,ASCIIHexDecode,ASCII85Decode等等,FlateDecode事實上就是ZIP的壓縮算法(關這 個,我就花了好長的時間去研究)。流對象的長度是關連到一個長度對象上的/Length  188 0 R這種形式。188就是存這個長度的OBJ的順序號。
9、數字對象。
188 0 obj
2538
endobj
裏面只有一個數字,經常用來表示長度,爲什麼要把長度還要再用對象來表示,這個到現在我也想不太明白。
以上就是我對PDF文件格式的理解的摘要。也許有些地方可能理解得不正確,希望得到大家的指正。

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