Тут попросили глянуть, можно ли в ELiS запилить распознавание изображений. Типа есть 100500 PDF и почему-то нераспознанные и можно-ли чтобы все само распознавалось при загрузке.
Очевидным кандидатом является Tesseract, который развивает Google и которым типа даже текст в Android-приложениях распознается для индексирования.
Ну ок. Потыкал в Tesseract. Выяснилось:
1) Распознает, ага. Но надо языки подсунуть на которых текст.
2) С 4 версии появилось распознавание нейросетями и в комплекте уже обученные на сотню языков, но вот использование GPU до сих пор в экспериментальной версии и к использованию не рекомендуется. Tesseract написан на C и TensorFlow не использует.
3) На процессоре можно ориентироваться где-то на 10 процессорных секунд на одну страницу. Ну это грубо, конечно. Но в любом случае не сильно быстро будет работать, если только 10 ядрами его не накормить (умеет по ядрам масштабироваться).
4) Tesseract умеет в несколько режимов вывода: просто текст, hOCR (HTML), PDF, ALTO. Текстовый формат, понятно, просто строки без позиций, а хочется с позициями, чтобы можно было подложку сделать. Значит нужны более сложные форматы. Казалось бы это будет hOCR и PDF, но PDF выдается битым, а hOCR визуально от txt не отличается. Остается ALTO.
Написал конвертер из ALTO в HTML (на скриншоте), так как все равно надо чтоб в браузере отображалось и при визуальном сравнении выяснилось:
5) Распознавание выделяет текстовые линии, в них слова с некоторыми координатами и пробелами между словами. Все это в ALTO хранится, но только высота слов и даже их вертикальное положение гуляет, а размер шрифта вообще не известен (известна только высота прямоугольника в котором вписано слово).
Ну в конвертере ALTO в HTML кой-чего покрутил, чтобы текст на одной линии был выравнен и размер шрифта в ней не гулял, но таки шрифт меньше ширины прямоугольной области в которую он вписан и не понятно как текст технически растянуть, чтобы не было между словами больших пробелов.
6) Под RHEL8 есть только Tesseract 4.1, тогда как актуальный 5.2. Подумал, что может в 5.2 исправили PDF, собрал его под RHEL8 и фиг там. Ну ладно, если модуль для библиотеки с OCR пойдет в прод, опубликую пакет Tesseract 5.2 для RHEL8 в публичном репозитории.