簡體   English   中英

使用Java從pdf文件提取文本時面臨的問題

[英]Facing issues on extracting text from pdf file using java

無法從具有客戶加密字體的pdf中提取文本,該字體可以通過Adobe Reader中的文件->屬性->字體進行標識。 其中一種字體稱為C0EX02Q0_22類型:Type 3編碼:自定義實際字體:C0EX02Q0_22實際字體類型:Type 3

讓我知道有什么方法可以從此類pdf文件中提取文本內容。 目前,我正在使用pdf實用工具中的PDFText2HTML。 在提取此類pdf文件時獲取“ÁÙÅ@ÅÕãÉ”之類的值

樣本pdf: tesis completa.pdf

在此pdf中,您可以看到所使用的字體具有自定義編碼,例如:T3Font_1(請通過File-> Properties-> Adob​​e Reader中的Font進行引用)由於無法上傳我的pdf更新了具有相同問題的樣本

如標准中所述提取

PDF規范ISO 32000-1在9.10節中描述了文本內容的提取,如果PDF提供了所需的信息並且正確地進行了提取,那么如何進行文本提取。

但是,使用此算法只能在文檔的幾個頁面范圍內使用(即摘要,內容列表,感謝函和Publicación7部分),但在其他范圍內則導致亂碼,例如8QLYHUVLWDWGH/OHLGD Universitat de Lleida 查看有問題的PDF對象可以清楚地看到所需的信息已丟失(沒有ToUnicode映射,並且在Encoding基於WinAnsiEncoding的情況下 ,所有使用中的位置均通過Differences映射到非標准名稱)。

同樣,嘗試使用Adobe Reader中的復制粘貼來提取文本會返回該亂碼。 通常,這表明不可能進行通用提取。

解決方法

但是,檢查PDF對象和常規文本提取嘗試的輸出會產生這樣的想法:對於所有使用的字體,提取為亂碼的文本的實際編碼是相同的,並且是一些基於ASCII的編碼,偏移了一個常數:在Universitat de Lleida的提取的8QLYHUVLWDWGH/OHLGD結果的每個字符中添加'U' - '8' 只要文本僅使用ASCII字符,向從文檔中其他位置提取的文本的char中添加相同的常量也將導致正確的文本。

用這種簡單的方法無法正確映射ASCII范圍以外的字符,但它們似乎總是被提取為相同的錯誤字符,例如,字形“ó”始終被提取為“ y”。

因此,您可以通過以下方法從該(以及類似創建的)文檔中提取文本:首先使用標准算法提取文本,然后在亂碼部分(可能可以由字體名稱標識)中,通過添加'U' - '8'替換每個字符'U' - '8'表示較小的值,並通過根據某些映射進行替換以獲得較高的值。

正如您在問題中提到的Java一樣,我已經通過iText和PDFBox文本提取來運行您的文檔,並且帶有或不帶有'U' - '8'移位,結果看起來很有希望。 我認為其他通用Java PDF庫也將起作用。

另一個解決方法

您可以嘗試通過將ToUnicode映射條目添加到相關字體中來嘗試修復相關PDF,而不是創建自定義提取例程。 之后,普通的文本提取程序應能夠正確提取內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM