Давайте не будем предполагать, что вы говорите о PDF-файлах, которые просто оборачивают какое-то растровое изображение, потому что должно быть ясно, что в этом случае вы можете использовать только OCR со всеми его ограничениями.в имеющемся документе PDF.
То, что нарисовано на странице PDF, определяется последовательностью из в потоке содержимого этой страницы.«Текст рисуется» на странице означает, что среди этих инструкций есть некоторые настройки шрифта, которые будут использоваться в последующих инструкциях, некоторые установки положения и направления текста, которые будут использоваться в последующих инструкциях, а некоторые на самом деле будут рисовать текст, заданный командой «строковые аргументы ".
Извлечение текста - это задача извлечения последовательности инструкций из потока содержимого и вместо рисования текста, указанного в инструкциях по настройке шрифта и позиции, для его экспорта.в разумном порядке с использованием стандартной кодировки, обычно кодировки типа символов используемого языка программирования / платформы.
Первая проблема заключается в понимании кодирования строковых аргументов этих инструкций рисования текста:
каждый шрифт может иметь свою собственную кодировку;чтобы извлечь текст, нельзя просто игнорировать все, кроме инструкций, рисующих текст и конкатенировать их строковое содержимое, вы всегда должны учитывать текущий шрифт (некоторые чрезвычайно простые экстракторы текста игнорируют это и, следовательно, довольно часто не могут вернуть что-то разумное);
существует большое количество предопределенных кодировок, некоторые напоминают о кодировках, которые вы знаете, например, WinAnsiEncoding , многие из которых вы, вероятно, не знаете, например, Надстройка RKSJ-H ;эти кодировки могут использовать постоянное число байтов на глиф, или они могут быть смешанными-многобайтовыми;таким образом, текстовый экстрактор должен поддерживать очень много кодировок, чтобы начать с;
кодировки также могут быть полностью произвольными и произвольными;в частности, в случае встроенных шрифтов подмножества часто встречаются специальные кодировки, генерируемые путем выдачи кодов символов из некоторого начального значения всякий раз, когда это необходимо;т.е. первый глиф в данном шрифте, используемый на странице, получает начальное значение в виде кода, следующий, другой глиф получает начальное значение плюс один, следующий, отличный от начального значения плюс два и т. д .;«Hello World» и начальное значение 48 (значение ASCII «0») приведут к «01223453627»;эти шрифты могут содержать сопоставление с Unicode, но они не обязательны для этого.
Следующая проблема заключается в том, чтобы разобраться в порядке строк:
инструкции по рисованию строки могут появляться в произвольном порядке, например, «Hello» может быть сначала нарисовано «lo», затем после возврата назад «el», затем после повторного перемещения назад «H»;чтобы извлечь текст, нельзя игнорировать инструкции по позиционированию текста и просто объединять текстовые строки, всегда нужно учитывать текущую позицию (некоторые простые экстракторы текста игнорируют это и, следовательно, могут не вернуть что-то разумное);
Многостолбцовый текст может представлять трудности, текст может быть нарисован построчно, например, сначала текст верхней строки первого столбца, затем верхняя строка второго столбца, затем вторая строкапервого столбца, затем второй строки второго столбца и т. д .;в PDF не должно быть никаких намеков на то, что текст является многостолбцовым.
Другая проблема заключается в распознавании артефактов форматирования или стиля:
пробелы между словами не нужно создавать с помощью глифа, это также можно сделать с помощью инструкций по изменению положения текста;экстракторы текста, не пытающиеся распознать пробелы, созданные инструкциями позиционирования текста, могут возвращать результат без пробелов;с другой стороны, та же самая техника может использоваться, чтобы нарисовать соседние глифы на оптимальном расстоянии, иначе говоря, кернинг;экстракторы текста, пытающиеся распознать пробелы, созданные инструкциями позиционирования текста, могут ошибочно возвращать пробелы там, где их не должно быть;
иногда выбранные слова печатаются с интервалом для дополнительного выделения;в извлеченном тексте эти пробелы могут быть представлены пробелами, которые автоматическая постобработка текста может видеть как разделители слов;
обычно для полужирного текста используется другая программа для полужирного шрифта;если этого нет, люди иногда проявляют творческий подход и подражают жирному шрифту, печатая один и тот же текст дважды с минутным смещением;с немного большим смещением (или другим преобразованием) и другим цветом можно эмулировать эффект тени;если средство извлечения текста не пытается распознать это, в результате вы получите несколько повторяющихся символов.
Дополнительные проблемы возникают из-за неполной или неправильной дополнительной информации:
ToUnicode карты шрифтов (необязательные карты из кода символа в Unicode) могут быть неполными или содержать ошибки;например, здесь много вопросов о переполнении стека, связанных с неправильными картами ToUnicode для индийских произведений;результаты извлечения текста отражают эти ошибки;
есть даже PDF-файлы с противоречивой информацией, например, с ошибкой в карте ToUnicode , но с правильной информацией в ActualText запись;это используется некоторыми создателями PDF, чтобы разрешить правильное копирование и вставку из некоторых программ (предпочитая запись ActualText в такой ситуации), при этом вводя ошибки в вывод других программ (предпочитая тогда информацию ToUnicode ).
Еще одна проблема возникает, если вы ожидаете, что средство извлечения текста будет извлекать только текст, в конечном итоге видимый на странице:
текст может быть нарисованза пределами текущей области отсечения или за пределами видимой области страницы;экстракторы текста должны помнить об этом;
текст может быть нарисован с использованием режима рендеринга «невидимый»;экстракторы текста должны следить за режимом рендеринга; текст
может быть нарисован с использованием того же цвета, что и фон;чтобы распознать это, средство извлечения текста может не только просматривать текущую инструкцию и некоторые детали состояния графики, но и учитывать все, что было нарисовано заранее в месте расположения текста;
текст может быть нарисован как путь клипа;чтобы распознать, виден ли этот текст в конце, экстрактор текста должен отслеживать, что нарисовано в текстовой области, пока активен путь клипа;
текст может быть покрытчем-то другим позже;экстрактор текста должен отбрасывать распознанный текст в таком случае;но в зависимости от режимов наложения и настроек прозрачности эти покрытия могут или не могут позволить тексту просвечивать;таким образом, для правильного результата текстовый экстрактор должен для каждого глифа отслеживать цвет, которым он нарисован, цвет фона и то, что все эти элегантные эффекты будут делать с этими цветами позже;и, конечно, могут быть интересны как цвет глифа, так и цвет фона, например, некоторые оттенки;и используемые цветовые пространства могут отличаться, требуя преобразования между цветовыми пространствами;и т. д.
Кроме того, текст может быть нарисован там, где текстовые экстракторы обычно не выглядят:
- некоторые инструменты скрывают текст от извлечения текста, помещая егов шаблон и заполнение области страницы этим шаблоном;
- аналогично есть шрифты типа 3;каждый символ шрифта типа 3 представлен собственным потоком контента;Таким образом, инструмент может нарисовать весь текст в потоке содержимого одного шрифта глифа типа 3, а затем нарисовать этот глиф на странице.
...
У вас наверняка естьполучил представление, почему результаты извлечения текста могут быть менее чем оптимальными.И будьте уверены, приведенный выше список неполон, есть еще сложности для извлечения текста.