从PDF复制粘贴在原始文件上是乱码,但在使用CutePDF打印pdf时已修复
我有这个PDF文件 ,是希腊语。 尝试从中复制和粘贴文本时会出现一个已知问题 ,导致轻微的乱码。 我说轻微而不是全部的原因是,虽然粘贴的输出在希腊语中没有意义,但它由有效的希腊字符组成。 此外,该问题的一个有趣方面是并非所有字符都映射错误。 例如,如果您比较此原始文本条带
ΕΞ. ΕΠΕΙΓΟΝ – ΑΜΕΣΗ ΕΦΑΡΜΟΓΗ ΝΑ ΣΤΑΛΕΙ ΚΑΙ ΜΕ Ε-ΜΑIL
使用PDF中粘贴的内容:
ΔΞ. ΔΠΔΙΓΟΝ – ΑΜΔΗ ΔΦΑΡΜΟΓΗ ΝΑ ΣΑΛΔΙ ΚΑΙ ΜΔ Δ-ΜΑIL
您会注意到某些字符被正确粘贴,而其他字符则没有。 值得一提的是,错误的字符reflection映射错误,例如Ε变为Δ ,反之亦然。
当我使用Adobe打开PDF,并使用PDF编写器打印它,在这种情况下,CutePDF,复制和粘贴时的输出是正确的!
鉴于上述情况,我的问题如下:
- 这种行为的根本原因是什么?
- 如何将解决方案集成到基于java的工作流程中,以便随机导入PDF文件?
编辑:一些错别字
一些基本背景:
通过从字体中选择字形来显示PDF格式的文本。 字形是一个或多个字符的直观表示。 字形选择使用字符代码完成。 对于文本提取,您需要知道哪些字符与字符代码相对应。
在这种情况下,这是使用ToUnicode CMap实现的。
在本文档中,文本片段的第一个字母E显示如下:
[0x01FC, ...] TJ
ToUnicode CMap包含此条目:
4 beginbfrange <01f9> <01fc> <0391> ... endbfrange
这意味着字符代码0x01F9
, 0x01FA
和0x01FC
分别映射到Unicode U+0x391
, U+0x392
, U+0x393
和U+0x394
。
U + 0394是希腊三角洲Δ,在复制/粘贴时显示。
下一个字母使用字符代码0x0204
绘制。 相关的ToUnicode条目是<0200> <020b> <039a>
,它将其正确映射到U + 039E
所以,你会有轻微的胡言乱语,因为只有一些Unicode映射是错误的。 有时,这是故意进行的,例如,以防止数据挖掘。 我之前在财务报告中看过它。