PDF學習二 PDF檔案物理結構

2021-08-20 14:08:55 字數 2175 閱讀 5786

在pdf學習一 hello world中簡單提到了pdf檔案結構。本文將重點講pdf檔案結構,指的是其檔案物理組織方式,決定物件是如何存放在乙個pdf檔案中, 它們是如何被訪問的,如何被更新的。

掌握pdf基本物理結構。

pdf檔案格式包含以下4個部分:

——指明了該檔案所遵從的pdf規範的版本號,它出現在pdf檔案的第一行。

%pdf−1.7

這是個固定格式,表示這個pdf檔案遵循的pdf規範版本。從1.4版本以後,pdf檔案的版本並不唯一的只是在這裡表示了,可能後面會改寫(catalog的version詞條),所以解析pdf的時候,如果這裡的版本大於等於1.4,應該再比較一下catalog裡面的version,取其中高一點的版本。

格式如下:

2 0 obj     

... 

end obj

乙個物件的定義包含4個部分:

前面的2是物件序號,其用來唯一標記乙個物件。0是生成號,按照pdf規範,如果乙個pdf檔案被修改,那這個數字是累加的,它和物件序號一起標記是原始物件還是修改後的物件,但是實際應用開發中,很少有用這種方式修改pdf的,都是重新編排物件號。obj和endobj是物件的定義範圍,可以抽象的理解為這就是乙個左括號和右括號;省略號部分是pdf規定的任意合法物件(一共8種)。

可以通過r關鍵字來引用任何乙個物件,比如要引用上面的物件,可以使用2 0 r。

——為了能對間接物件進行隨機訪問而設立的乙個間接物件的位址索引表。(實際以偏移+索引的方式儲存物件位址)

普通檔案交叉引用表

xref                             % 表示交叉引用表開始

0 5                              % 0表示交叉引用表描述的物件編號從0開始,5表示共有5個物件

0000000000 65535 f  % 一般pdf都是以這行開始交叉引用表,起始位址0和最大產生號65535,f 表示釋放

0000000017 00000 n % 物件號為1的偏移位址,產生號0,n表示在使用中

0000000081 00000 n % 物件號為2的偏移位址,產生號0,n表示在使用中,其他類同

0000000331 00000 n

0000000409 00000 n

增量更新的交叉引用表

xref

0 10000000000 65535 f

3 1                              % 物件編號從3開始,1表示共有1個物件

0000025325 00000 n % 物件號為3的偏移位址,產生號0,n表示在使用中

23 2

0000025518 00002 n % 物件號為23的偏移位址,產生號為2表示被刪除過,又重新開始使用,n表示在使用中

0000025635 00000 n

30 1

0000025777 00000 n

——宣告了交叉引用表的位址,即指明了檔案體的根物件(catalog),從而能夠找到pdf檔案中各個物件體的位置,達到隨機訪問。另外還儲存了pdf檔案的加密等安全資訊。

trailer              % 檔案尾標識,是小寫t

/size 20>>     % 檔案中物件總數為20

startxref 

2559              % 交叉引用表偏移位址

%%eof        % 檔案結束標識

1)pdf檔案內容可以增量更新無需重寫整篇檔案。變化資料被附加到檔案尾段,保持原內容不變。用這種方法更新檔案最大的優勢是乙個篇幅很大的檔案做小改動可以快速儲存。

2)檔案更新時新增的交叉引用表部分僅包含那些已經被修改,替換,或刪掉的物件。刪除掉的物件原封不動的留在檔案中,對應的交叉引用表項被標記為已刪除。新增的檔案尾包括所有的選項(可能是改進過的)包括之前的檔案尾部分,prev項給出之前交叉引用部分的位置。一篇被更新過多次的檔案包含了多個檔案尾;每個檔案尾都有自己的結束標識(%%eof)。

pdf 1.4之後,版本號version是可以在增量更新中修改。

a:是的。增量更新之後pdf檔案會有多個檔案體,多個交叉引用表,多個檔案尾。

PDF檔案儲存結構

pdf檔案由檔案頭 版本號 檔案體 物件 交叉索引表 和檔案尾四部分組成。pdf 1.4 檔案頭,顯示版本資訊 檔案體,儲存著1 n 個間接物件,其內部可以是所有型別的基礎物件 請檢視pdf基礎物件 1 0 obj 間接物件頭,表示 索引號為1,更新號 在文件增量更新的時候會用到 為 0 type ...

PDF預覽 pdfJS預覽pdf檔案

方式1 檔案流轉為blob let urlsrc window.url.createobjecturl blob this src urlsrc pdf空白頁 else 正確解析了頁碼,但是每頁空白。解決方法 responsetype blob html visible.sync dialo isi...

生成pdf檔案

public void createpdf throws exception tablet.settotalwidth f this.addcell tablet,姓名 yy 1,0,20,fontcn.getnormalfont element.align left,0,0,0,0 this.ad...