Разбор PDF-файла и вывод односимвольных расположений - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь извлечь текстовую информацию из (цифрового) PDF путем определения содержания и местоположения каждого символа и каждого слова.Словом, pdftotext --bbox из xpdf / poppler работает довольно хорошо, но я не могу найти простой способ извлечь местоположение персонажа.

Что я пробовал

В настоящее время у меня есть решение преобразовать pdf в svg (через pdf2svg), а затем проанализировать полученный svg, чтобы извлечь местоположения из одного символа (= глифа).На третьем шаге сравниваются полученные блоки, каждому символу присваивается слово, и, надеюсь, числа совпадают.

Проблемы

Хотя вышеприведенное работает для большинства "«Основные» шрифты, есть две (основные) ситуации, когда этот подход не срабатывает:

  • В шрифтах сценария (или некоторых шрифтах с крайним курсивом) ограничивающие рамки намного больше, чем их содержимое;в результате слова значительно перекрываются, и вполне может случиться, что символ целиком содержится в двух словах.В этом случае сопоставление не выполняется, поскольку после перевода в svg у меня нет информации о том, какой символ содержится в каком глифе.
  • Во многих шрифтах можно лигировать несколько символов, что приводит к появлению одного глифа.В этом случае количество блоков символов не совпадает с количеством символов в слове, и сопоставление каждой буквы с блоком снова проблематично.

Второй пункт (который является основным дляя) имеет частичный обходной путь, идентифицируя общие лигатуры и (если количество не совпадает) разбивая соответствующие ограничивающие рамки на несколько частей;но это не всегда может работать, потому что, например, «ffi» иногда связывается с одним глифом, иногда с двумя глифами «ff» + «i», а иногда с двумя глифами «f» + «fi», в зависимости от шрифта.

На что я надеюсь

Насколько я понимаю, pdf на самом деле содержит информацию о глифе, а не слова.Если это так, все программы, которые извлекают текст из PDF (например, pdftotext), должны сначала извлечь и найти различные символы, а затем, возможно, сгруппировать их в слова / строки;поэтому я немного удивлен, что не смог найти варианты вывода местоположения для каждого отдельного символа.Конвертация в svg, по сути, дает мне это, но при таком преобразовании вся информация о содержимом (т.е. сопоставление глифа с символом или глифа с символами, если была лигатура) теряется, потому что шрифта больше нет.И повторение попытки сопоставить каждый глиф с символом, снова посмотрев на шрифт, похоже на переписывание парсера pdf ...

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

1 Ответ

1 голос
/ 17 мая 2019

Файл PDF не обязательно указывает положение каждого символа в явном виде.Как правило, он разбивает текст на серии символов (все, используя один и тот же шрифт, думаю, что угодно, вплоть до строки), а затем для каждого цикла указывает положение ограничительной рамки, которая должна содержать глифы для этих символов.Таким образом, точное положение каждого глифа будет зависеть от метрик (главным образом, ширины глифа) шрифта, используемого для его визуализации.

Пакет Python pdfminer содержит скрипт pdf2txt.py.Попробуйте вызвать его с помощью -t xml.Документы просто говорят XML format. Provides the most information. Но мои заметки указывают, что он будет применять метрику шрифта и даст вам элемент <text> для каждого отдельного символа с информацией о шрифте и ограничительной рамке.

Существуют различные версии в разных местах (например, PyPI и github).Если вам нужна поддержка Python 3, поищите pdfminer.six.

...