2017-02-14 64 views
1

情況:我有一個PDF使用版本1.6。在該PDF中,有幾個流。這些流中有壓縮文本(Flate),所以我解壓縮了這些流。之後,我提取了相應的解壓縮流的部分。我以爲會有的TJ命令之前,括號中的可讀文本,但結果如下:PDF提取的文本似乎是不可讀

Result

實際問題:由於我不知道,我已經得到了我想知道它是什麼類型的內容。此外:是否可以從這些字符串中獲取純文本,還是需要更多信息來提取純文本?

進一步的研究:的PDF文件,我試圖分析其中由iTextSharp的產生的(似乎是一個C#庫中生成PDF)。不知道它是否是一個相關的信息,但它可能是該庫採用加密的一種特殊的方式是文本數據或東西...

回答

1

我認爲會有括號之間可讀文本在Tj命令之前

這個假設只適用於簡單的PDF。

文本表示操作者的字符串操作數應被解釋爲識別該字符的字形代碼序列被塗:

爲了從PDF規格(ISO 32000-1)引用。

使用簡單的字體,字符串的每個字節應被視爲單獨的字符代碼。然後按照字體的編碼查找字符代碼以選擇字形,如第9.6.6節「字符編碼」中所述。

使用複合字體(PDF 1.2),可以使用多字節代碼來選擇字形。在這種情況下,字符串的一個或多個連續字節將被視爲單個字符代碼。代碼長度以及從代碼到字形的映射在名爲CMap的數據結構中定義,如9.7所述,「複合字體」。

(第9.4.3節 - 文本顯示運營商 - ISO 32000-1

因此,

我想知道它是什麼類型的內容。

如上所述,這些「字符串」由單字節或多字節字符代碼組成。這些代碼取決於當前字體的編碼。 PDF中的每個字體對象可以有不同的編碼。

那些編碼可以是一些標準編碼(MacRomanEncodingMacExpertEncoding,或WinAnsiEncoding)或一些定製編碼。特別是在嵌入字體子集的情況下,您經常會發現編碼,其中1是頁面上繪製的第一個字形的代碼,2是第二個不同字形的代碼,第三個是不同的字形,等等。

此外:是否有可能從這些字符串中獲取純文本,還是需要更多信息來提取純文本?

由於用文字說明的字符串參數的編碼依賴於當前的字體,你至少需要跟蹤當前的字體名稱(TF指令)和查找編碼信息(編碼ToUnicode map)從當前字體對象。

第9.10節 - 文本內容提取 - ISO 32000-1對此進行了更詳細的解釋。

此外,顯示指令的文本順序不一定是閱讀順序。單詞「你好」可以例如首先畫出'o',然後向左,然後'el',然後再離開,然後'H',然後向右,最後剩下'l'。而且兩個單詞不需要用空格字形分隔,只需要一個文本定位指令即可。

因此,一般來說,您還必須跟蹤繪製的單獨字符串的位置。