2013-04-16 200 views
1

當我使用一個小的PHP類(pdf2text)打開和讀取一個「文本」 PDF搞砸了特殊字符。閱讀PDF

目前我不能讓它來處理特殊字符像E,A,ö,ü等正確。我嘗試將頭文件設置爲UTF-8並將接收數據編碼爲UTF-8,但仍無法正確顯示。

的Class可以在這裏找到:http://pastebin.com/PSmu03nH

如果有人有什麼意見,甚至是解決方案,請讓我知道。

+0

你會得到什麼? PDF文件的外觀如何? – silkfire

+0

Datasprzedaży:=> Datasprzeda | y – ThatMSG

+0

鏈接到文件? – silkfire

回答

3

一言以蔽之:

您使用的PDF2Text類忽略PDF規範ISO-32000-1:2008的重要組成部分。它僅適用於非常特殊的環境。

爲了sligthly提高解碼在你的問題中提到的特殊字符(變音,重音符號,...)的結果,您可能希望根據附件d 字符集和編碼的PDF specification添加翻譯。

詳細地:

decodePDF越過在PDF中的對象,並選擇流對象。在這裏,它完全忽略了這些對象是否仍在使用中(即在一個文檔中經常會看到來自所有修訂版的修訂流)。

從這些流,這一切與一個長度1類型,或子類型鍵刪除。 (好)意圖是去除包含除頁面內容之外的其他內容的流。不幸的結果是對象流也被刪除;對象流自PDF 1.5起是PDF規範的一部分,並捆綁了多種其他任何類型的對象,包括流;它們提供比常規頂級對象更好的壓縮屬性。因此,使用此功能的文檔內容在此丟失。

在剩餘流它檢查是否含有文本對象與否。如果它們包含文本對象BT ... ET,這些對象的內容由處理getDirtyTexts。如果他們不這樣做,他們是由getCharTransformations處理。

getDirtyTexts收集文字運營商TJTJ的字符串參數;一方面,這意味着它忽略文本運營商的論據」,進而對這些字符串是如何定位彼此相關的任何信息。文件具有廣泛用途的字距信息和內容在字符串分隔單詞使用這樣的操作,而不是空間的文件,因此可能完全不可讀以下。另外選擇字體的操作都扔掉了這裏---但這裏所有的流沒有連接到它們各自的ressources對象,字體信息反正無法匹配......

getCharTransformations假定流是一個ToUnicode映射流,並增加了從所有這些流中的所有映射到一個單一地圖。由於多個流如果存在,很可能屬於不同的字體並且可能具有完全不同的映射,將它們全部放在一個映射中將丟失大量映射信息,除非所討論的字體被安排爲具有不重疊的字符標識符範圍...爲什麼他們應該!

現在decodePDF調用getTextUsingTransformations來處理這兩種方法的結果。它遍歷由getDirtyTexts提取的字符串。如果它們是十六進制編碼,則它們將被解碼,然後使用由getCharTransformations提取的映射進行翻譯。如果它們不是十六進制編碼的,則它們將被原樣複製,而無需進一步翻譯。

因此,根據一些ToUnicode映射來解釋十六進制編碼的字符串的內容,該映射可能是也可能不是與它們使用的相應字體相關的編碼,並且非十六進制編碼的字符串的內容被用作是完全忽略了各自字體的編碼。

因此,從本質上講,這個類可以在某種程度上被成功地使用,只能使用標準編碼來使用非十六進制編碼的字符串(直到字符代碼127的標準編碼都是ASCII-ish)並使用相同的映射進行編碼,其中字符代碼範圍與用於十六進制編碼的字符串一起使用的字體重疊。

爲了sligthly提高從不是十六進制編碼的字符串解碼特殊字符的結果,您可能希望根據附件d 字符集和編碼的PDF specification添加翻譯。

+0

Thx爲您的重播!你提到我的班級不是最好的......有沒有人喜歡你呢? – ThatMSG

+0

不幸的是我沒有在PHP中做太多工作。如果Java是一種選擇... – mkl

+0

我只是搜索了一下,唯一正確提取解決方案似乎依賴於某些Java PDF庫,例如PDFBox或iText,或二進制xpdf。 – mkl