1. 程式人生 > >PDF學習三 PDF檔案邏輯結構

PDF學習三 PDF檔案邏輯結構

本文轉自: https://blog.csdn.net/u012632138/article/details/80648760

說明:

要解析一個PDF檔案,首先要掌握PDF的物理結構,這是第一步。但是這個僅僅只是基礎,更重要的是對PDF邏輯結構的解析。PDF的邏輯大體上是一個樹狀結構,根節點是catalog字典,通過這裡去解析頁、目錄、連結資訊等等。

PDF reference 1.7.pdf 中3.6節。

目標:

掌握PDF樹型結構,掌握從Root到Page Content解析流程。

Catalog根節點

Catalog是整個PDF邏輯結構的根節點,是通過trailer的Root欄位定位,相當重要,因為這裡是PDF檔案物理結構和邏輯結構的連線點。Catalog字典包含的資訊非常多,這裡僅列了Pages做個說明。

完整的可檢視 PDF reference1.7.pdf Page 137。

以下是Catalog 字典

3 0 obj                % 根據Root中指定的間接引用物件號找到Catalog字典
<<
/Type /Catalog    % 指定型別是Catalog,區分大小寫 
/Pages 1 0 R      % 指向頁面樹的跟節點
>>

endobj                % 物件結束關鍵字

Page Tree 根節點

1 0 obj             % 根據Catalog字典中Pages指定的間接引用物件號找到Pages字典
<<
/Type /Pages
/Kids [2 0 R]    % 該Page Tree節點下的子節點,可以是Page字典,也可以是其他Page Tree節點           
/Count 1          % 該文件的頁面數,1說明文件只有1頁。
>>

endobj

Page 字典

2 0 obj                                   % Page 字典
<<
/Type /Page 
/Parent 1 0 R                         % parent page tree node
/MediaBox [0 0 612 792]       % page size (612x792 points)
/Contents 4 0 R                     % content stream
/Resources <<                       % resource dictionary
/Font <<                                 % font list
/Font1 5 0 R>>
 >> >>

endobj

Contents字典

4 0 obj                                   % the page content stream
<<
/Length 0                              % should be byte length of the stream data. 
                                             % We use 0 here for convenience.
>> stream

% Text example: draw "Hello World!" text

BT                                        % begin text object
/Font1 10 Tf                         % set font to /Font1, font size to 10 points
100 700 TD                         % move text position to 100,700
(Hello World!) Tj                  % output the text
ET                                        % end text object

endstream
endobj

Resources字典

這個例子中包含的是font字典

5 0 obj                                 % a font dictionary. 
                                            % This is a base-14 font, so only a few data is required.
<<
/Type /Font
/Subtype /Type1
/BaseFont /Helvetica
>>
endobj

頁面繼承

看下圖,例如Rotate屬性可以從page 父節點中繼承。

Caption

Name Dictionary

PDF檔案中的一些物件型別可以被名稱引用而不是被物件引用。名稱和物件之間的對應是通過文件的名稱字典(PDF1.2)建立的,通過Names選項定位在文件目錄冊中(參看3.6.1部分,“文件目錄冊”)。在這個字典中的每個選項指派一個名稱樹結構的根節點(參看3.8.5部分,“名稱樹”)。

後記:

Catalog中還有許多其他條目,例如:Outline、OpenAction、PageLabels、OpenAction、AA、AcroForm,大家對哪個感興趣,可留言給我。

問題彙總:

1)Q:Catalog指向的Pages root節點中的Count數是表示該文件的所有頁面嗎?

A:是的,是該文件的頁面總數。PDF中說明:(Required) The number of leaf nodes (page objects) that are descendants of this node within the page tree.

2)Q:Points單位

1 Points = 1/72 inch

螢幕 1 inch = 96 pixel

PDF中Points 座標轉換為螢幕pixel。 例如頁面寬為w:w*96/72 得出在螢幕上顯示的值。

3)Q:PDF單位能換嗎?例如可以將Points換為inch嗎?

A:PDF單位只能是Point,1/72 inch。在Page 物件中有UserUnit,可以設定使用者空間單位,預設是1。可以設定為2,相當於整個座標系放大2倍,例如 10*10的矩形框,在UserUnit 為2的裡面相當於20*20的矩形框。

/UserUnit 2