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>
Это очень хорошо соответствует внешний вид страницы:
Спасибо за ответ .. Я столкнулся эту проблему для Adobe-Identity-UCS (типа 0 с CIDType2 как потомка) и I есть Adobe CMAP для того же самого. Я проанализировал этот CMAP, и все еще некоторые записи отсутствуют, а некоторые сопоставления неверны. Как я могу это исправить? – Swaroop
Как насчет того, чтобы показать документ, с которым у вас проблемы? –
@ Извлечение текста из вашего PDF-файла в формате SVOROOOP выходит за рамки того, что спецификация рассматривает как обычную задачу извлечения. Таким образом, пожалуйста, разделите данный PDF-файл и укажите, с какими глифами у вас возникают проблемы. – mkl