我有
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映射是错误的.有时这是故意的,例如防止数据挖掘.我之前在财务报告中看过它.