PDF文件的基本結構(詳細)


1 Header部分

PDF文件的第一行應是由5個字符“%PDF-”后跟“1.N”的版本號組成的標題,其中N是0到7之間的數字。例如下面的:

  %PDF1.0
  %PDF1.1
  %PDF1.2
  %PDF1.3
  %PDF1.4
  %PDF1.5
  %PDF1.6
  %PDF1.7

從PDF 1.4開始,應使用文檔目錄字典中的Version 條目(通過文件Trailer部分Root條目指定版本),而不是標題中指定的版本。

2 Body部分

PDF文件的正文應由表示文件內容的一系列間接對象組成,例如字體、頁面和采樣圖像。從PDF 1.5開始,Body還可以包含對象流,每個對象流包含一系列間接對象。例如下面這樣:

1 0 obj
<< /Type /Catalog
  /Outlines 2 0 R
  /Pages 3 0 R
>>
endobj
2 0 obj << /Type Outlines   /Count 0 >> endobj
3 0 obj << /Type /Pages /Kids [4 0 R] /Count 1 >> endobj
4 0 obj << /Type /Page   /Parent 3 0 R   /MediaBox [0 0 612 792]   /Contents 5 0 R   /Resources << /ProcSet 6 0 R >> >> endobj 5 0 obj
<< /Length 35 >> stream   …Page-marking operators… endstream endobj
6 0 obj [/PDF] endobj

3 Cross-Reference Table 交叉引用表部分

交叉引用表包含文件中間接對象的信息,以便允許對這些對象進行隨機訪問,因此無需讀取整個文件即可定位任何特定對象。

交叉引用表以xref開始,緊接着是一個空格隔開的兩個數字,然后每一行就是一個對象信息:

xref
0 7
0000000000 65535 f
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000179 00000 n
0000000300 00000 n
0000000384 00000 n

上面第二行中的兩個數字“0 7”,0表示下面的對象從0號對象開始,7表示對象的數量,也就是說表示從0到6共7個對象。

每行一個對象信息的格式如下:

nnnnnnnnnn ggggg n eol
  • nnnnnnnnnn 長度10個字節,表示對象在文件的偏移地址;
  • ggggg 長度5個字節,表示對象的生成號;
  • n (in-use)表示對象被引用,如果此值是f (free),表示對象未被引用;
  • eol  就是回車換行

交叉引用表中的第一個編號為0的對象始終是f(free)的,並且生成號為65535;除了編號0的對象外,交叉引用表中的所有對象最初的生成號應為0。刪除間接對象時,應將其交叉引用條目標記為“free”,並將其添加到free條目的鏈表中。下次創建具有該對象編號的對象時,條目的生成號應增加1,最大生成號為65535;當交叉引用條目達到此值時,它將永遠不會被重用。


交叉引用表也可以是這樣的:

xref
0 1
0000000000 65535 f
3 1
0000025325 00000 n
23 2
0000025518 00002 n
0000025635 00000 n
30 1
0000025777 00000 n

 

4 Trailer部分

PDF閱讀器是從PDF的尾部開始解析文件的,通過Trailer部分能夠快速找到交叉引用表和某些特殊對象。如下所示:

trailer
<< /Size 7
    /Root 1 0 R
>>
startxref
408
%%EOF

文件的最后一行應僅包含文件結束標記%%EOF。關鍵字startxref下面的數字表示最后一個交叉引用表的xref關鍵字開頭的字節偏移量。trailer和startxref之間是尾部字典,由包含在雙尖括號(<<…>>)中的鍵值對組成。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM