То, что вы пытаетесь декодировать загадочную строку в самом общем случае, - это поле /Encoding выбранного шрифта, в вашем случае шрифт /F1. Более чем вероятно, что используется схема кодирования /Identity-H, которая может содержать произвольное сопоставление 16-битных символов в строках PDF с символами 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
...
16-битные пары между beginbfchar и endbfchar представляют собой отображения отдельных символов. Например, ‹0003> (0x0003) отображается на ‹0020> (0x0020), который является символом пробела.
16-битные триплеты между beginbfrange и endbfrange являются отображениями диапазонов символов. Например, символы от ‹0055> (первый) до ‹0059> (последний) отображаются на ‹0072>, ‹0073>, ‹0074>, ‹0075> и ‹0076> (от 'r' до 'v' в UTF16 и ASCII).
person
Greg Young
schedule
20.03.2016