Декодировать коды шрифтов CID в эквивалентные символы ASCII

Я пытаюсь добыть какой-нибудь текст из нескольких PDF-файлов, и в некоторых из них есть встроенные шрифты CID:

(cid:80)(cid:72)(cid:87)(cid:68)(cid:70)(cid:76)(cid:87)(cid:76)(cid:72)(cid:86)(cid:3)
(cid:177)(cid:3)(cid:71)(cid:72)(cid:191)(cid:81)(cid:72)(cid:71)(cid:3)(cid:69)(cid:92
(cid:3)(cid:56)(cid:49)(cid:3)(cid:43)(cid:68)(cid:69)(cid:76)(cid:87)(cid:68)(cid:87)
(cid:3)(cid:68)(cid:86)(cid:3)(cid:70)(cid:76)(cid:87)(cid:76)(cid:72)(cid:86)(cid:3)
(cid:90)(cid:76)(cid:87)(cid:75)(cid:3)(cid:80)(cid:82)(cid:85)(cid:72)(cid:3)(cid:87)
(cid:75)(cid:68)(cid:81)(cid:3)(cid:20)(cid:19)(cid:3)

Когда я смотрю на этот точный фрагмент текста в PDF, буквы, безусловно, можно преобразовать в ASCII:

скриншот соответствующей порции pdf

Возможно, это говорит о том, что будет работать декодирование методом грубой силы (то есть прочитать фрагмент текста, который соответствует пачке кодов CID и создать отображение таким образом), но будет ли это надежным для множества различных PDF-файлов? Существует ли надежное сопоставление этих кодов CID с символами ASCII или это будет сильно зависеть от шрифта в PDF? Как я могу определить, какой символ ASCII код CID, как (cid:72) соответствует?

Для чего стоит, я извлекаю текст, используя PDFminer, который, кажется, единственный инструмент, который на самом деле сообщает CID-коды. Если есть лучший инструмент для преобразования PDF-файлов в HTML или любой другой текстовый формат, доступный для синтаксического анализа, я открыт для других предложений!

В качестве дополнительного бонуса этот вопрос, по-видимому, связан с несколькими другими оставшимися без ответа вопросами, поэтому здесь налицо богатая репутация:

1 ответ

Хотя вы, вероятно, можете сделать это путем догадок для простого примера здесь, чтобы действительно сделать это правильно, вам потребуется 2 дополнительных элемента информации:

1) Информация о реестре-заказе-дополнении (ROS) для соответствующего шрифта. Обычно это что-то вроде "Adobe-Japan1-5" или что-то подобное, и это информационное свойство, хранящееся в шрифте. ROS определяет, как CID должны интерпретироваться. Данный CID в одном шрифте не обязательно совпадает с CID в другом шрифте, если ROS не совпадают. Другими словами, CID12345 в Adobe-Japan1-5 отличается от CID12345 в Adobe-GB1-3!

2) Вооружившись информацией о ROS, выберите совместимый CMap и декодируйте через него. ASCII немного близорукий; Я бы пошел с Unicode, ASCII которого является подмножеством. Вы можете найти файлы CMap для определенных ROS Adobe на http://sourceforge.net/projects/cmap.adobe/files/

Более подробную информацию о CID и CMaps непосредственно от изобретателей можно найти по адресу http://www.adobe.com/content/dam/Adobe/en/devnet/font/pdfs/5014.CIDFont_Spec.pdf

Другие вопросы по тегам