在最一般的情况下,您要解码神秘字符串的是所选字体的 /Encoding 字段,在您的情况下是字体 /F1。编码方案很可能是 /Identity-H,它可以包含 PDF 字符串中的 16 位字符到 UTF-16 字符的任意映射。
这是我正在编写的 PDF 解析器的一个示例。每个页面都包含一个资源字典,其中包含一个字体字典:
[&3|0] => Array [
[/Type] => |/Page|
[/Resources] => Array [
[/Font] => Array [
[/F1] => |&5|0|
[/F2] => |&7|0|
[/F3] => |&9|0|
[/F4] => |&14|0|
[/F5] => |&16|0|
]
]
[/Contents] => |&4|0|
]
在我的例子中,/F3 产生了不可用的文本,所以看看 /F3:
[&9|0] => Array [
[/Type] => |/Font|
[/Subtype] => |/Type0|
[/BaseFont] => |/Arial|
[/Encoding] => |/Identity-H|
[/DescendantFonts] => |&10|0|
[/ToUnicode] => |&96|0|
]
这里可以看到 /Encoding 类型是 /Identity-H。 /F3 中使用的解码字符的字符解码映射存储在 /ToUnicode 引用的流中。以下是 '&96|0' (96 0 R) 引用的流中的相关文本 - 其余部分作为样板被省略,可以忽略:
...
beginbfchar
<0003> <0020>
<000F> <002C>
<0015> <0032>
<001B> <0038>
<002C> <0049>
<003A> <0057>
endbfchar
...
beginbfrange
<0044> <0045> <0061>
<0047> <004C> <0064>
<004F> <0053> <006C>
<0055> <0059> <0072>
endbfrange
...
beginbfchar
<005C> <0079>
<00B1> <2013>
<00B6> <2019>
endbfchar
...
beginbfchar/endbfchar 之间的 16 位对是单个字符的映射。例如 (0x0003) 映射到 (0x0020),即空格字符。
beginbfrange/endbfrange 之间的 16 位三元组是字符范围的映射。例如,从 (第一个)到 (最后一个)的字符被映射到 、、、 和 (UTF16 中的“r”到“v”和ASCII)。