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

所以,你得到了轻微的胡言乱语,因为只有一些Unicode映射是错误的.有时这是故意的,例如防止数据挖掘.我之前在财务报告中看过它.

点赞