PDF(Portable Document Format)文件是一種用于文檔傳輸和顯示的文件格式,也是結(jié)構(gòu)性的文件。通過(guò)本文的分析,可以清楚PDF的文件結(jié)構(gòu)和對(duì)象尋址原理,對(duì)于PDF的文件修復(fù)思路也能有自己的見(jiàn)解。 PDF文件結(jié)構(gòu)PDF文件的結(jié)構(gòu)主要包括以下4個(gè)部分: - 文件頭:
PDF文件的開(kāi)頭包含一個(gè)文件頭,它標(biāo)識(shí)了文件的類(lèi)型和版本信息。 - 對(duì)象:
PDF文件中的所有內(nèi)容都被表示為對(duì)象,這些對(duì)象可以是文本、圖像、矢量圖形等。每個(gè)對(duì)象都有一個(gè)唯一的編號(hào),以及一些描述該對(duì)象的信息。 - 交叉引用表(xref):
PDF文件通常包含一個(gè)交叉引用表,它記錄了PDF文件中所有對(duì)象的位置和編號(hào)。這些對(duì)象包括頁(yè)面、字體、圖片等。 - 文件尾(trailer):
包括文件大小、根對(duì)象的編號(hào)等信息。startxref 指向交叉引用表的位置,文件結(jié)束符 “%%EOF”。
PDF文件讀取過(guò)程分析PDF閱讀器讀取渲染顯示PDF文件,有如下過(guò)程。 PDF內(nèi)容詳解PDF文件頭PDF文件的開(kāi)頭所包含的幾個(gè)字節(jié),用于標(biāo)識(shí)這個(gè)文件的類(lèi)型和版本。PDF文件頭的格式是:%PDF-1.x,其中x代表版本號(hào)。 上圖是“%PDF-1.0”,說(shuō)明該文件是一個(gè)PDF版本1.0的文檔。 PDF對(duì)象obj對(duì)象obj是pdf文件的主體內(nèi)容。上面選中的部分是第一個(gè)完整的obj,注意obj開(kāi)頭的偏移地址為21。 1 0 obj
<<
/Length 44
>>
stream
q
595.80 0 0 842.40 0.00 0.00 cm
/Im33 Do
Q
endstream
endobj
對(duì)上圖中所有的obj各個(gè)字段進(jìn)行解釋。 - 1 0 obj – 對(duì)象編號(hào)及版本號(hào)
- << >> – 對(duì)象屬性字典的開(kāi)始和結(jié)束標(biāo)記
- /Length 44 – 圖像數(shù)據(jù)的長(zhǎng)度,單位為字節(jié)
- stream – 圖像數(shù)據(jù)流的開(kāi)始標(biāo)記
- q – 圖形狀態(tài)保存命令,保存當(dāng)前的圖形狀態(tài),方便后續(xù)恢復(fù)
- /Im33 Do – 在當(dāng)前位置插入名稱為”Im33″的圖像資源
- Q – 圖形狀態(tài)還原命令,恢復(fù)之前保存的圖形狀態(tài)
- endstream – 圖像數(shù)據(jù)流的結(jié)束標(biāo)記
- endobj – 對(duì)象定義的結(jié)束標(biāo)記
PDF交叉引用表xref交叉引用表xref位于文件尾部,所有obj結(jié)束后就是xref。注意xref的偏移地址為7990754??梢运阉鱴ref快速定位交叉引用表的位置。 xref
0 1
0000000000 65535 f
1 1
0000000021 00000 n
2 1
0000000118 00000 n
每個(gè)字段的含義解釋: - xref – 交叉引用表的開(kāi)始標(biāo)記
- 0 – 第一個(gè)對(duì)象的編號(hào)
- 1 – 對(duì)象的數(shù)量
- 0000000000 65535 f – 第一個(gè)對(duì)象的描述,其中:0000000000 – 第一個(gè)對(duì)象在文件中的偏移量65535 – 對(duì)象的生成號(hào),因?yàn)榇颂幨恰眆”,所以表示這個(gè)對(duì)象是一個(gè)自由對(duì)象(free object),即已被刪除的對(duì)象,可以被其他新對(duì)象重復(fù)使用
- 1 1 – 第二個(gè)對(duì)象的編號(hào)和數(shù)量
- 0000000021 00000 n – 第二個(gè)對(duì)象的描述,其中:0000000021 – 第二個(gè)對(duì)象在文件中的偏移量00000 – 對(duì)象的生成號(hào)n – 表示這個(gè)對(duì)象是一個(gè)普通對(duì)象(normal object),即當(dāng)前被使用的對(duì)象
- 后面的依次同上
所以上面的0 1表示的是刪除對(duì)象,1 1實(shí)際對(duì)應(yīng)PDF中的第一個(gè)obj,其偏移地址就是對(duì)應(yīng)的之前第一個(gè)obj的地址,為21。這樣pdf解析工具就能正常尋址找到文件中所有obj的對(duì)象了。 PDF文件尾trailerPDF文件尾trailer位于文件的末尾,在交叉引用表xref的后面。包含了PDF文件中的對(duì)象位置信息和文件總體描述信息,是解析和渲染PDF文件的必要信息。 這里startxref就是對(duì)應(yīng)上面的7990754。 trailer
<<
/Root 74 0 R
/Size 84
>>
startxref
7990754
%%EOF
對(duì)trailer每個(gè)字段含義的解釋: - trailer – 文件總體描述信息的開(kāi)始標(biāo)記
- << >> – 文件總體描述信息的屬性字典,其中包含:/Root 74 0 R – 根對(duì)象的引用,其中74 0 R表示該對(duì)象在文件中的編號(hào)為74,第二個(gè)數(shù)字0表示該對(duì)象在交叉引用表中的位置/Size 84 – PDF文件中的對(duì)象數(shù)量,包括自由對(duì)象和普通對(duì)象
- startxref – 交叉引用表的起始位置標(biāo)記
- 7990754 – 交叉引用表在文件中的偏移量,即從文件的開(kāi)頭到交叉引用表的位置的字節(jié)數(shù)
- %%EOF – 文件結(jié)束標(biāo)記,表示PDF文件正式結(jié)束
總結(jié)從分析結(jié)果來(lái)看,PDF是非常結(jié)構(gòu)化的文件。搞清楚了PDF文件對(duì)象的尋址原理甚至可以自己寫(xiě)一個(gè)PDF解析工具,這樣對(duì)任何文件系統(tǒng)的結(jié)構(gòu)原理理解也會(huì)更加深刻。
|