PDF: дублирующиеся имена шрифтов с разными CUPS ToUnicode - PullRequest
3 голосов
/ 22 января 2012

Я анализирую файл PDF и извлекаю часть текста, и я столкнулся с ситуацией, когда я сталкиваюсь со словарем шрифтов с именем "C2_0", который содержит CIDFont (Тип 0) с ToUnicode CMap,Итак, нет проблем - у меня есть инструменты для синтаксического анализа ToUnicode CMap и сопоставления 2-байтовых кодов символов со значениями Unicode.

Но позже файл PDF включает в себя еще один объект словаря шрифтов,который также называется C2_0, который содержит другой ToUnicode CMap.Я не совсем понял, как мне обращаться со вторым CMap, поэтому я только угадал и объединил записи из обоих CMap.Это на самом деле сработало, и правильно извлек текст.

Но я не могу найти в справочном руководстве PDF ничего, что говорит, что это разрешено, или даже разрешает эту ситуацию.Я бы подумал, что повторяющиеся имена шрифтов приведут к неопределенному поведению, или, по крайней мере, вторые переопределят первый или что-то еще.Я только попытался объединить их как длинное предположение - и был удивлен, что на самом деле это сработало.Кто-нибудь знает, разрешено ли в PDF иметь дубликаты имен шрифтов, которые ссылаются на разные объекты с разными CMaps, которые «объединяются» при вызове оператором Tf?

Ответы [ 2 ]

4 голосов
/ 22 января 2012

C2_0 является символическим именем в словаре ресурсов / Font и имеет локальную область видимости, используется только в потоке контента, к которому принадлежит словарь ресурсов.Если C2_0 также присутствует в другом словаре ресурсов / Font, это не проблема.У вас в том же / Font ресурсном словаре 2 C2_0 записей:/ C2_0 X 0 R/ C2_0 Y 0 Rтогда у вас есть проблема, потому что поведение не определено, и вам решать, как справиться с ситуацией.Разрешение символьных имен работает следующим образом: если вы находитесь в потоке содержимого страницы, найдите символическое имя шрифта (операнд Tf) в словаре ресурсов страницы.Если вы не можете найти его, зайдите в дерево страниц и найдите словарь ресурсов (если они существуют) для каждого родительского узла страницы.Если вы достигли вершины дерева страниц и не нашли шрифт, поведение не определено.На данный момент вы можете реализовать различные резервные стратегии: вы можете использовать шрифт по умолчанию, вы можете искать ресурсы, включенные в форму XObjects на странице, вы можете искать словари ресурсов на других страницах.

1 голос
/ 22 января 2012

К сожалению, вы можете найти много файлов PDF в дикой природе, которые не являются «идеальными» ...

То, что вы описываете, может легко произойти, если вы объедините 2 файла PDF в 1 с помощью таких инструментов, как pdftk.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...