Я пытаюсь извлечь текстовую информацию из (цифрового) PDF путем определения содержания и местоположения каждого символа и каждого слова.Словом, pdftotext --bbox
из xpdf / poppler работает довольно хорошо, но я не могу найти простой способ извлечь местоположение персонажа.
Что я пробовал
В настоящее время у меня есть решение преобразовать pdf в svg (через pdf2svg
), а затем проанализировать полученный svg, чтобы извлечь местоположения из одного символа (= глифа).На третьем шаге сравниваются полученные блоки, каждому символу присваивается слово, и, надеюсь, числа совпадают.
Проблемы
Хотя вышеприведенное работает для большинства "«Основные» шрифты, есть две (основные) ситуации, когда этот подход не срабатывает:
- В шрифтах сценария (или некоторых шрифтах с крайним курсивом) ограничивающие рамки намного больше, чем их содержимое;в результате слова значительно перекрываются, и вполне может случиться, что символ целиком содержится в двух словах.В этом случае сопоставление не выполняется, поскольку после перевода в svg у меня нет информации о том, какой символ содержится в каком глифе.
- Во многих шрифтах можно лигировать несколько символов, что приводит к появлению одного глифа.В этом случае количество блоков символов не совпадает с количеством символов в слове, и сопоставление каждой буквы с блоком снова проблематично.
Второй пункт (который является основным дляя) имеет частичный обходной путь, идентифицируя общие лигатуры и (если количество не совпадает) разбивая соответствующие ограничивающие рамки на несколько частей;но это не всегда может работать, потому что, например, «ffi» иногда связывается с одним глифом, иногда с двумя глифами «ff» + «i», а иногда с двумя глифами «f» + «fi», в зависимости от шрифта.
На что я надеюсь
Насколько я понимаю, pdf на самом деле содержит информацию о глифе, а не слова.Если это так, все программы, которые извлекают текст из PDF (например, pdftotext
), должны сначала извлечь и найти различные символы, а затем, возможно, сгруппировать их в слова / строки;поэтому я немного удивлен, что не смог найти варианты вывода местоположения для каждого отдельного символа.Конвертация в svg, по сути, дает мне это, но при таком преобразовании вся информация о содержимом (т.е. сопоставление глифа с символом или глифа с символами, если была лигатура) теряется, потому что шрифта больше нет.И повторение попытки сопоставить каждый глиф с символом, снова посмотрев на шрифт, похоже на переписывание парсера pdf ...
Поэтому я был бы очень благодарен за любую идею, как решить эту проблему. Верхний ответ здесь предполагает, что это может быть выполнимо с TET, но это вариант оплаты, и замена всей моей инфраструктуры для обработки только одного предельного случая кажется большим излишним ...