2014-11-13 3 views
1

В настоящее время я работаю над сканированием PDF в формате PDF с использованием PDFKitten. Я пытаюсь извлечь текст для поиска в PDF с шрифтом Type0. Я не могу извлечь текст из PDF. Некоторые записи в Недостаточно, чтобы учесть, что ToUnicode отсутствует, а некоторые неверно истолкованы. Может ли быть проблема с разбором CMap? Если у меня нет полного CMap, как мне его получить? Могу ли я взять внешние записи для этих отсутствующих ToUnicode записей?Проблема для анализа CMap Type0

Благодаря

ответ

3

PDF specification предлагает подсказки о том, как извлечь содержимое текста в разделе 9.10.2 Отображение кодов символов в Unicode Значения:

  • Если словарь шрифт содержит ToUnicode CMAP (см. 9.10.3, «ToUnicode CMaps»), используйте этот CMap для преобразования символьного кода в Unicode.

  • Если шрифт простой шрифт, который использует один из предопределенных кодировок MacRomanEncoding, MacExpertEncoding или WinAnsiEncoding, или имеет кодировку, чьи Разницы массив содержит только символьные имена, взятые из Adobe стандартный латинский набор символов и набор именованных символов в шрифте Symbol (см. Приложение D):

    a) Сопоставьте код символа с именем символа в соответствии с таблицей D.1 и шрифтом Различия.

    б) Посмотрите имя персонажа в Adobe Glyph List (см библиографию), чтобы получить соответствующее значение Unicode.

  • Если шрифт является составным шрифтом, который использует один из предопределенных CMaps, перечисленных в таблице 118 (кроме Identity-H и Identity-V) или чей потомок CIDFont использует Adobe-GB1, Adobe-CNS1, Adobe-Japan1 , или коллекция символов Adobe-Korea1:

    a) Сопоставьте код символа с символьным идентификатором (CID) в соответствии с CMap шрифта.

    b) Получить реестр и заказать коллекцию символов, используемую CMap шрифта (например, Adobe и Japan1) из его словаря CIDSystemInfo.

    c) Создайте второе имя CMap, объединив реестр и порядок, полученные на этапе (b) в формате реестра-заказа-UCS2 (например, Adobe-Japan1-UCS2).

    d) Получите CMap с именем, построенным на этапе (c) (доступно на веб-сайте ASN, см. Библиографию).

    e) Сопоставьте CID, полученный на этапе (a), согласно CMap, полученному на этапе (d), создавая значение Unicode.

Кроме того, в качестве раздела 9.10.1 указывает на то,

    запись
  • ActualText для элемента структуры или последовательности обозначены-содержимого (см 14.9.4, «Замена текста») может быть использован для указания содержания текста непосредственно

Согласно спецификация, , если эти методы не дают значение Unicode, невозможно определить, что представляет собой код символа. Это не совсем так; например встроенные программы шрифтов могут содержать свои собственные сопоставления для Unicode; но такие дополнительные источники информации находятся за пределами формата PDF.

EDIT

ОП при условии, что файл в вопросе, iPhoneConfigurationProfileRef-2013-GM.pdf, по почте и указал

Я получаю проблему для каждого глифа.

Проблема в том, что диапазоны, присутствующие в PDF, не являются полными и отличаются от формата adobe-identity-cmap.

Если я использую только CMap, встроенный в PDF, у меня нет сопоставления для каждого символа, и если я использую adobe one, все сопоставления ошибочны.

Поскольку он не получил сопоставление для любого глифа, давайте посмотрим на титульную страницу в качестве примера.

поток контента содержит эти операции, имеющие значение для извлечения текста:

BT 
50 0 0 50 60 669.225 Tm 
/G1 1 Tf 
<0025> Tj 
ET 
BT 
50 0 0 50 87.6 669.225 Tm 
/G1 1 Tf 
<005100500048004b004900570054> Tj 
ET 
BT 
50 0 0 50 238 669.225 Tm 
/G1 1 Tf 
<0043> Tj 
ET 
BT 
50 0 0 50 261.45 669.225 Tm 
/G1 1 Tf 
<0056004b00510050> Tj 
ET 
BT 
50 0 0 50 355.4 669.225 Tm 
/G1 1 Tf 
<0032> Tj 
ET 
BT 
50 0 0 50 380.75 669.225 Tm 
/G1 1 Tf 
<0054> Tj 
ET 
BT 
50 0 0 50 396.55 669.225 Tm 
/G1 1 Tf 
<00510048004b004e0047> Tj 
ET 
BT 50 0 0 50 60 609.225 Tm 
/G1 1 Tf 
<0034> Tj 
ET 
BT 
50 0 0 50 86.65 609.225 Tm 
/G1 1 Tf 
<00470048> Tj 
ET 
BT 
50 0 0 50 125.05 609.225 Tm 
/G1 1 Tf 
<00470054> Tj 
ET 
BT 
50 0 0 50 165.45 609.225 Tm 
/G1 1 Tf 
<004700500045> Tj 
ET 
BT 
50 0 0 50 238.9 609.225 Tm 
/G1 1 Tf 
<0047> Tj 
ET 

Таким образом, мы должны смотреть только на шрифте G1 на странице 1. К счастью, шрифт имеет ToUnicode карты:

/CIDInit /ProcSet findresource begin 
12 dict begin 
begincmap 
/CIDSystemInfo << 
    /Registry (Adobe) 
    /Ordering (UCS) 
    /Supplement 0 
>> def 
/CMapName /Adobe-Identity-UCS def 
/CMapType 2 def 
1 begincodespacerange 
<0000><FFFF> 
endcodespacerange 
1 beginbfchar 
<000f><002d 2010> 
endbfchar 
15 beginbfrange 
<0002><0002><0020> 
<0004><000c><0022> 
<000e><000e><002c> 
<0010><001d><002e> 
<001f><001f><003d> 
<0022><0032><0040> 
<0034><003d><0052> 
<003f><003f><005d> 
<0041><0041><005f> 
<0043><005c><0061> 
<005e><005e><007c> 
<008a><008a><00a9> 
<00a4><00a4><2014> 
<00a5><00a6><201c> 
<00a8><00a8><2019> 
endbfrange 
endcmap 
CMapName currentdict /CMap defineresource pop 
end 
end 

Попытка применить эту карту один получает (на основе явных beginbfrange...endbfrange записей):

<0025> Tj       % "C"  = <0043>       due to <0022><0032><0040> 
<005100500048004b004900570054> Tj % "onfigur" = <006f006e00660069006700750072> due to <0043><005c><0061> 
<0043> Tj       % "a"  = <0061>       due to <0043><005c><0061> 
<0056004b00510050> Tj    % "tion" = <00740069006f006e>    due to <0043><005c><0061> 
<0032> Tj       % "P"  = <0050>       due to <0022><0032><0040> 
<0054> Tj       % "r"  = <0072>       due to <0043><005c><0061> 
<00510048004b004e0047> Tj   % "ofile" = <006f00660069006c0065>   due to <0043><005c><0061> 
<0034> Tj       % "R"  = <0052>       due to <0034><003d><0052> 
<00470048> Tj      % "ef"  = <00650066>      due to <0043><005c><0061> 
<00470054> Tj      % "er"  = <00650072>      due to <0043><005c><0061> 
<004700500045> Tj     % "enc"  = <0065006e0063>     due to <0043><005c><0061> 
<0047> Tj       % "e"  = <0065>       due to <0043><005c><0061> 

Это очень хорошо соответствует внешний вид страницы:

scrrenshot of the title page

+1

Спасибо за ответ .. Я столкнулся эту проблему для Adobe-Identity-UCS (типа 0 с CIDType2 как потомка) и I есть Adobe CMAP для того же самого. Я проанализировал этот CMAP, и все еще некоторые записи отсутствуют, а некоторые сопоставления неверны. Как я могу это исправить? – Swaroop

+1

Как насчет того, чтобы показать документ, с которым у вас проблемы? –

+0

@ Извлечение текста из вашего PDF-файла в формате SVOROOOP выходит за рамки того, что спецификация рассматривает как обычную задачу извлечения. Таким образом, пожалуйста, разделите данный PDF-файл и укажите, с какими глифами у вас возникают проблемы. – mkl