Сканы договоров, книг и архивов бесполезны, если с них нельзя скопировать текст или найти строку поиском. Tesseract решает эту задачу локально, без облака и передачи документов третьим лицам. Он не «понимает» документ, а распознаёт символы по обученной модели, поэтому качество зависит от подготовки изображения и правильных параметров. Ниже — рабочий конвейер от установки до проверки результата.
Что умеет Tesseract
Движок поддерживает больше сотни языков, включая русский, и умеет выдавать простой текст, hOCR, TSV с координатами слов и PDF с текстовым слоем. Версия 5.x использует нейросетевую модель LSTM, которая заметно лучше читает печатный текст, чем старый движок. Рукописный текст, таблицы сложной структуры и плохие фотографии по-прежнему остаются проблемой.
Важно понимать границы: Tesseract не открывает PDF напрямую. Ему нужна картинка или многостраничный TIFF, поэтому PDF сначала разбирают на страницы. Для сборки результата обратно в PDF используют ocrmypdf. Ключ --oem выбирает движок: 1 — только LSTM, 0 — устаревший, 3 — режим по умолчанию. В пятой версии рабочий вариант — LSTM.
Установка и языковые данные
В Debian и Ubuntu пакет ставится вместе с нужными языками. Если русского пакета нет, запуск с -l rus завершится ошибкой загрузки языка, а без ключа -l Tesseract возьмёт английский — отсюда и «кракозябры» вместо текста.
sudo apt install tesseract-ocr tesseract-ocr-rus tesseract-ocr-eng
tesseract --version
tesseract --list-langs
tesseract --list-langs --tessdata-dir /usr/share/tesseract-ocr/5/tessdata
Для лучшего качества можно взять модели tessdata_best из официального репозитория проекта и положить файлы в отдельный каталог, подключив его ключом --tessdata-dir. Модели fast быстрее, best точнее, но требуют больше памяти.
Подготовка изображения
Больше половины ошибок распознавания лечится до запуска OCR. Скан должен быть ровным, контрастным и достаточно крупным: оптимально 300–400 dpi. Перекос даже в два градуса ломает разбиение на строки.
magick scan.png -colorspace Gray -deskew 40% -level 15%,85% clean.png
magick scan.png -colorspace Gray -threshold 60% bw.png
unpaper --layout single --deskew-scan-direction left page.png page-clean.png
tesseract clean.png out -l rus+eng --psm 3
Порядок обработки зависит от исходника. Для чистого сканера хватает оттенков серого и лёгкого контраста. Для фотографии с телефона добавьте выравнивание, обрезку полей и подавление шума. Не увлекайтесь бинаризацией: жёсткий порог съедает тонкие штрихи и ухудшает результат.
identify -format '%x %y %[colorspace]\n' scan.png
pdfimages -list doc.pdf
Эти две команды стоит выполнить до обработки. Первая показывает реальное разрешение и цветовое пространство, вторая — какие изображения и с каким сжатием лежат внутри PDF. Если картинка сохранена в JPEG с сильным сжатием, никакая фильтрация не вернёт потерянные детали.
Режимы сегментации
Ключ --psm подсказывает движку, как устроена страница. Неверный режим — вторая по частоте причина провала после плохого скана.
--psm 3— автоматическое разбиение, подходит для большинства страниц;--psm 6— единый блок текста, удобно для писем и справок;--psm 4— одна колонка переменного размера;--psm 11— разреженный текст: вывески, фрагменты, подписи;--psm 7— одна строка, например номер или заголовок;--psm 1— авторежим с определением ориентации.
Если документ содержит две колонки, а --psm 3 смешивает строки, попробуйте --psm 4 или обрежьте страницу на две части. Для смешанного русского и английского указывайте -l rus+eng: движок будет выбирать язык по контексту, хотя на коротких словах может ошибаться.
Из PDF в текст
Сначала страницы превращают в PNG с нужным разрешением, затем распознают каждую отдельно. Так проще найти проблемную страницу и не держать в памяти весь документ.
mkdir -p page text
pdftoppm -r 300 -png doc.pdf page/p
for f in page/*.png; do
tesseract "$f" "text/$(basename "$f" .png)" -l rus+eng --psm 3
done
cat text/*.txt > doc.txt
Если нужен PDF с текстовым слоем, используйте ocrmypdf. Он сам вызовет Tesseract, сохранит исходное изображение и добавит невидимый текст, по которому работает поиск. Ключ --skip-text пропускает страницы, где текст уже есть, --redo-ocr перераспознаёт проблемные.
Многостраничный TIFF обрабатывается одной командой: tesseract book.tif book -l rus. Если страницы сохранены отдельными файлами, проще цикл: он даёт понятные имена и позволяет пропустить уже готовые. Разрешение задавайте явно ключом --dpi 300, когда в метаданных картинки стоит неверное значение: Tesseract использует его при оценке размера шрифта.
sudo apt install ocrmypdf
ocrmypdf -l rus+eng --skip-text doc.pdf doc-ocr.pdf
ocrmypdf -l rus+eng --deskew --clean --optimize 1 scan.pdf out.pdf
pdfinfo doc-ocr.pdf
Пакетная обработка
На сотнях страниц последовательный цикл работает часами. Распараллельте его по числу ядер, но оставьте запас для системы: Tesseract активно использует память.
find scans -name '*.png' -print0 | xargs -0 -P 4 -I{} sh -c 'tesseract "$1" "text/$(basename "$1" .png)" -l rus+eng' _ {}
grep -c . text/*.txt
du -sh text
Для повторяемых задач оформите Makefile или небольшой скрипт с журналом: какие файлы обработаны, сколько заняло времени, где упало. Это экономит часы при повторном запуске после сбоя.
Проверка качества
Средняя уверенность по документу ничего не говорит о конкретных словах. TSV-вывод содержит колонку conf с уверенностью для каждого слова, и по ней удобно находить проблемные места.
tesseract clean.png out -l rus+eng --psm 3 tsv
awk -F'\t' 'NR>1 && 59 >= $11+0 {print $12}' out.tsv | head -30
Порог уверенности в примере — 60: все слова с меньшим значением попадут в вывод. Их стоит проверить глазами: часто это фамилии, номера и латиница внутри русского текста.
Что ещё помогает:
- указывайте
--user-wordsсо словарём терминов и названий вашей организации; - проверяйте ориентацию страницы, иначе
--psm 1может перевернуть текст; - не смешивайте языки без необходимости: лишняя модель увеличивает число ошибок;
- храните исходные сканы, чтобы можно было перераспознать без повторной оцифровки.
Итог
Tesseract даёт предсказуемый локальный OCR без облака и подписок. Качество определяется не магической командой, а нормальным сканом, правильным --psm, нужным языковым пакетом и проверкой результата. Начните с 300 dpi и --psm 3, затем подгоняйте обработку под конкретный тип документов, а для PDF сразу берите ocrmypdf.