天天看點

java列印pdf檔案亂碼_java – 從PDF複制粘貼在原始檔案上是亂碼,但在使用CutePDF列印pdf時已修複...

我有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> &LT 020B&GT < 039a>,将其正确映射到U+039E

是以,你得到了輕微的胡言亂語,因為隻有一些Unicode映射是錯誤的.有時這是故意的,例如防止資料挖掘.我之前在财務報告中看過它.

标簽:java,pdf

來源: https://codeday.me/bug/20190702/1357736.html