因為最近很忙,所以就不做嚴格的翻譯了,這個筆記將是一個比較簡單的文檔,而且不會涉及到比較復雜的PDF特性,目前關注點主要在于Pdf->Txt的轉換。
下面是正式的筆記:
概述
PDF文件依賴于PostScript的圖像模型,對文本和圖像用設備無關和資源無關的語法進行描述。為了提高交互速度,PDF定義了一些不同于PostScrtpi的格式。PDF支持對象,比如注釋和超鏈接,他們不是頁面的組成部分,但是對于交互式顯示非常重要。
PDF文件是用一系列編號的對象來建立的。文本,圖形和圖像等對象用PsostScript語言組織成頁面。
但是PDF文件不是一個PostScript語言程序,也不能直接用PostScript解釋器來解釋。但是PDF文件的頁面描述信息是可以轉換成PostScript程序的。
坐標系統
PDF的坐標系統定義了一個畫布,用來顯示你的PDF文檔。文本、圖形和圖像在頁面上的位置、方向和大小都是用這個坐標系統來定義的。PDF支持幾種坐標系統,他們大部分和PostScript的坐標系統相同。
后暫略...
對象
PDF支持7種類型的對象,booleans, numbers, strings, names, arrays, dictionaries 和 streams.
boolrans就是true和false。
number,PDF同時兩種數字,整數和實數,但是不支持指數格式的實數(科學計數法)。
string和text
string就是用"("和")"包括起來的字符串,如果字符串太長可以在行尾加上\,表明下一行和本行是連在一起的。
text一般用PDFDocEncoding或者Unicode來進行編碼。PDFDocEncoding是ISOLatin1的一個超集,在0-255的編碼上PDFDocEncoding和Unicode是兼容的。
如果text是用Unicode編碼的,那么text的前兩個字節必須是[FE FF]。[FE FF]代表Unicode的高位字節必須在前。
text還可以包含一個換碼序列來標明text使用的語言。換碼序列必須用Unicode的16進制值U+001B開頭,后面跟隨兩個由ISO639標準 定義的表示語言的ASCII代碼,然后可選擇的,跟隨兩個由ISO3166定義的表示國家的ASCII代碼。漢語的語言編號是zh,中國的編號是CN。
name就是一個用/開頭的string。
array就是一個對象的序列。一個array可以有多種類型的對象在其中。用"["開頭,用"]"結束。下面是一個array的例子:
[0 (Higgs) false 3.14 3 549 /SomeName]
上面的例子也可以作為剛才說過的幾種對象的例子。
dictionary是一對對象的對應表。第一個對象叫做key,第二個叫做value。key必須是一個name對象(這點和PostScript里面的dictionay對象的key不同)。value可以是任何的對象,甚至也可以是一個dictionary。
dictionay用"<<"開始,">>"結束。一般dictionay的例子:
<< /Type /Example /Key2 12 /Key3 (a string) >>
包含dictionay的dictionay的例子:
<<
/Type /AlsoAnExample
/Subtype /Bad
/Reason (unsure)
/Version 0.01
/MyInfo
<<
/Item1 0.4
/Item2 true
/LastItem (not!)
/VeryLastItem (OK)
>>
>>
dictionary對象是PDF文檔的主要構成部分。PDF文檔的很多部分,比如頁面、字體,都是用dictionary來表現的。
stream和string一樣就是一個字符的序列。然而應用程序可以讀取stream的一個部分,但是讀取string就必須讀取整個string。所以,尺寸大的數據,比如圖像或者頁面描述,一般用stream來表現。
一個stream包含一個dictionary,后面是關鍵字stream,然后是0行或者多行的字符序列,后面是關鍵字endstream。
所有的stream必須是間接對象。stream的dictionary必須是一個直接對象。關鍵字stream和stream的dictionary之間必須用回車換行符來分割而不能僅僅用換行符。
stream的格式細節暫略。
null關鍵字用來表現null對象。
直接對象就是boolean、number、string、name、array、dictionary、stream或者null。一個間接對象就是一 個直接對象加上了一個標簽,這樣就可以被其他的對象所引用。任何類型的對象都可以被標簽為間接對象。間接對象非常有用,比如,你可以把stream的 Length key設定為了一個間接對象,這樣長度可以保存在stream后面。這樣可以讓應用程序用一個流程來生成一個PDF文件。
一個間接對象包括一個對象標識符,一個直接對象和一個endobj關鍵字。對象標識符包括一個整數的對象編號,一個整數的生成編號,和一個obj關鍵字。形如:
1 0 obj
(test)
endobj
用在arrary和dictionary元素里面的對象可以是直接對象,也可以是間接對象。間接對象引用包含一個間接對象的對象編號和產生編號,還有一個關鍵字R。例如:
<< /Length 8 0 R >>
8 0 obj
64
endobj
這里的長度就等于8 0代表的number??64。
注意:引用一個沒有定義的對象,不是一個錯誤,而是相當于引用一個null對象。
?
?