从PDF复制粘贴在原始文件上是乱码,但在使用CutePDF打印pdf时已修复

我有这个PDF文件 ,是希腊语。 尝试从中复制和粘贴文本时会出现一个已知问题 ,导致轻微的乱码。 我说轻微而不是全部的原因是,虽然粘贴的输出在希腊语中没有意义,但它由有效的希腊字符组成。 此外,该问题的一个有趣方面是并非所有字符都映射错误。 例如,如果您比较此原始文本条带

ΕΞ. ΕΠΕΙΓΟΝ – ΑΜΕΣΗ ΕΦΑΡΜΟΓΗ ΝΑ ΣΤΑΛΕΙ ΚΑΙ ΜΕ Ε-ΜΑIL 

使用PDF中粘贴的内容:

 ΔΞ. ΔΠΔΙΓΟΝ – ΑΜΔ΢Η ΔΦΑΡΜΟΓΗ ΝΑ ΢ΣΑΛΔΙ ΚΑΙ ΜΔ Δ-ΜΑIL 

您会注意到某些字符被正确粘贴,而其他字符则没有。 值得一提的是,错误的字符reflection映射错误,例如Ε变为Δ ,反之亦然。

当我使用Adobe打开PDF,并使用PDF编写器打印它,在这种情况下,CutePDF,复制和粘贴时的输出是正确的!

鉴于上述情况,我的问题如下:

  1. 这种行为的根本原因是什么?
  2. 如何将解决方案集成到基于java的工作流程中,以便随机导入PDF文件?

编辑:一些错别字

一些基本背景:

通过从字体中选择字形来显示PDF格式的文本。 字形是一个或多个字符的直观表示。 字形选择使用字符代码完成。 对于文本提取,您需要知道哪些字符与字符代码相对应。

在这种情况下,这是使用ToUnicode CMap实现的。

在本文档中,文本片段的第一个字母E显示如下:

[0x01FC, ...] TJ

ToUnicode CMap包含此条目:

 4 beginbfrange <01f9> <01fc> <0391> ... endbfrange 

这意味着字符代码0x01F90x01FA0x01FC分别映射到Unicode U+0x391U+0x392U+0x393U+0x394

U + 0394是希腊三角洲Δ,在复制/粘贴时显示。

下一个字母使用字符代码0x0204绘制。 相关的ToUnicode条目是<0200> <020b> <039a> ,它将其正确映射到U + 039E

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