示例文档显示如下:
但从 Adobe Acrobat 复制和粘贴会导致:
4144144714614 6991-6991
乍一看,字符顺序的颠倒可能是由于在内容流中将文本的语言设置为希伯来语:
/P <</MCID 0/Lang (he-IL)>> BDC
但这不可能是错误提取多个字形的原因,例如年份数字1992 和1996 都被提取为“6991”。
真正的罪魁祸首是这里使用的字体的 ToUnicode 表:
2 beginbfchar
<0003> <0020>
<0010> <002D>
endbfchar
1 beginbfrange
<0014> <001A> [<0036> <0031> <0034> <0034> <0037> <0031> <0034>]
endbfrange
1 beginbfchar
<001C> <0039>
endbfchar
文本提取器使用此表将字形标识符与 Unicode 代码点相关联。这里的 bfchar 和 bfrange 部分暗示了这种映射:
0003 -> 0020 " "
0010 -> 002D "-"
0014 -> 0036 "6"
0015 -> 0031 "1"
0016 -> 0034 "4"
0017 -> 0034 "4"
0018 -> 0037 "7"
0019 -> 0031 "1"
001A -> 0034 "4"
001C -> 0039 "9"
显然,三个不同的字形映射到数字“4”,两个不同的字形映射到数字“1”。
不过,在文本绘制操作中将呈现的字形与字形 ID 进行比较,
[<0014001C001C0019>] TJ
[<0010>] TJ
[<0014001C001C0015>] TJ
[<0003>] TJ
[<00170019001A00170019001A001700180019001A>11<001400150016>] TJ
表格应该是这样映射的:
0003 -> " "
0010 -> "-"
0014 -> "1"
0015 -> "2"
0016 -> "3"
0017 -> "4"
0018 -> "5"
0019 -> "6"
001A -> "7"
001C -> "9"
在我看来,构建 ToUnicode 表的工具既不知道如何在 PDF 中绘制字形,也不知道明文数字中的数字是如何排序的。
第一个字符串<0014001C001C0019> 中最右边年份1996 的字形从左到右排列。但是,如果假设明文中的字形顺序或字符顺序是从右到左的,则会得出错误的结论,即0014 将映射到“6”而0019 映射到“1” .对于上面引用的文本绘制操作中的所有字符串以及尚未关联的所有字形 ID,如果得出这样的错误结论,就会得到错误的映射,如 PDF 中的 ToUnicode 表所示。
因此,从本质上讲,PDF 是关于哪个字形代表哪个数字的谎言。要解决此问题,必须修复生产者程序(或生成 ToUnicode 映射的工具)。