我有this PDF file,這是希臘文.嘗試從中複制和粘貼文本時出現known problem,導緻輕微的亂碼.我說輕微而不是全部的原因是,雖然粘貼的輸出在希臘語中沒有意義,但它由有效的希臘字元組成.此外,該問題的一個有趣方面是并非所有字元都映射錯誤.例如,如果您比較此原始文本條帶
ΕΞ. ΕΠΕΙΓΟΝ – ΑΜΕΣΗ ΕΦΑΡΜΟΓΗ
ΝΑ ΣΤΑΛΕΙ ΚΑΙ ΜΕ Ε-ΜΑIL
使用PDF中粘貼的内容:
ΔΞ. ΔΠΔΙΓΟΝ – ΑΜΔΗ ΔΦΑΡΜΟΓΗ
ΝΑ ΣΑΛΔΙ ΚΑΙ ΜΔ Δ-ΜΑIL
您會注意到某些字元被正确粘貼,而其他字元則沒有.值得一提的是,錯誤的字元被反射映射錯誤,例如Ε變為Δ,反之亦然.
當我使用例如打開PDF時Adobe,并使用PDF編寫器列印,在本例中為CutePDF,複制和粘貼時的輸出是正确的!
鑒于上述情況,我的問題如下:
>這種行為的根本原因是什麼?
>我如何将解決方案內建到基于java的工作流程中,以便随機導入PDF檔案?
編輯:一些錯别字
解決方法:
一些基本背景:
通過從字型中選擇字形來顯示PDF格式的文本.字形是一個或多個字元的直覺表示.字形選擇使用字元代碼完成.對于文本提取,您需要知道哪些字元與字元代碼相對應.
在這種情況下,這是使用ToUnicode CMap實作的.
在本文檔中,文本片段的第一個字母E顯示如下:
[0x01FC,…] TJ
ToUnicode CMap包含此條目:
4 beginbfrange
<01f9> <01fc> <0391>
...
endbfrange
這意味着字元代碼0x01F9,0x01FA,0x01FB和0x01FC分别映射到Unicode U 0x391,U 0x392,U 0x393和U 0x394.
U+0394是希臘三角洲Δ,在複制/粘貼時顯示.
下一個字母使用字元代碼0x0204繪制.相關的ToUnicode條目是< 0200> < 020B> < 039a>,将其正确映射到U+039E
是以,你得到了輕微的胡言亂語,因為隻有一些Unicode映射是錯誤的.有時這是故意的,例如防止資料挖掘.我之前在财務報告中看過它.
标簽:java,pdf
來源: https://codeday.me/bug/20190702/1357736.html