从 PDF 文件复制+粘贴希伯来文本会导致最后的字母被错误复制

Copy+pasting Hebrew text from PDF files results in final letters being incorrectly copied

所以我得到了一些希伯来语的 PDF 文件,我想将其翻译成英文,当我尝试将 PDF 文件中的文本复制并粘贴到文本编辑器时,全部 的希伯来语末尾字母被错误复制。

我找到了 this 个问题,但没有找到解决方案,那个问题只是在谈论一个被错误阅读的特定最后一封信,它只指一个特定的图书馆。

我尝试从 acrobat reader 和 chrome PDF 查看器进行复制和粘贴,但无法使用它们正确复制内容。

我发现的另一件有趣的事情是,当你在浏览器中按 Ctrl+F(我在 chrome 上试过)并搜索最后一个字母 "Pe" 例如,它会给出以下结果常规 "Pe" 和最终 "Pe"(反之亦然,当您搜索常规 "Pe" 时),即使它们具有不同的代码点(以及 ANSI 代码页中的不同代码) ), 这也很奇怪。 (所有最后的字母和它们对应的常规字母都是一样的)

所以问题是 - 有人知道为什么会这样吗?
我知道可能没有 actual 代码点映射到字形,但在那种情况下,字符是如何呈现的?我对这个主题不是很熟悉,所以我很感激任何解释。此外,任何能让我用最后字母提取文本的好的解决方案都将非常感激,因为我想解析文本并且弄乱字母会导致单词不完整。

编辑:
根据 weibeld 的要求,我添加了一些复制的单词和相应的正确单词。 我还将添加他们的 hexdump。

E1 F7 F8 1B    בקר.  # Should be בקרן (Final letter "Nun") Switches every 
final Nun with 1B instead of EF according to the windows 1255 code page.

F2 F1 F7 E9 E9 17 עסקיי. # Should be עסקיים (Final letter "Mem") Switches 
every final Mem with 17 instead of ED.  

谢谢!

PDF 参考在很大程度上没有提及对非拉丁非 CJK 文本进行编码以进行文本提取的正确方法(none 渲染字形需要这样做),但基本上有两种方法可以做到这一点:第一个是有一个 ToUnicode table(对于简单字体和复合字体),第二个,对于简单字体,是指定一个带有差异数组的编码字典,用来自 Adob​​e Registry 的名称标识每个字形(例如 https://github.com/adobe-type-tools/agl-aglfn/blob/master/glyphlist.txt).

Identity-H 编码意味着复合(双字节)字体,它可能具有 ToUnicode table。自定义编码意味着具有差异数组的编码字典。标准编码意味着没有指定预定义(或自定义)编码。

这三者的混合意味着一个非常混乱的起源。

因此,根据您的编辑,PDF 文件似乎使用了一些奇怪的(非 ASCII 兼容的)希伯来语编码来提取文本,它将字母的最终形式放在 1X 区域在 ASCII 中,不可打印的控制字符是。

如果您只想重建 PDF 中的文本,最简单的解决方案可能是不更改 PDF,而是在从 PDF 复制文本后用正确的代码替换错误的代码。

例如,将从PDF复制的文本粘贴到file,然后:

cat file | tr '3' '7' | tr '7' '5' >out_file

也就是说,每个错误的最后一个字母一个 tr。数字 033357 等只是您用 hexdump 发现的十六进制字节 1BEF 等的八进制形式。只需找出剩余的映射并将它们添加到链中即可。然后 out_file 应该包含正确编码的文本,您可以使用某些文本编辑器使用 Windows-1255.

打开它