Python: уроки, справочник и задачи

Pytesseract: OCR и извлечение текста из изображений

Раздел: Модули и библиотеки Python · Обновлено 31.10.2026

Pytesseract - обертка на Python для движка Tesseract OCR, которая распознает текст на изображениях и возвращает его строкой, таблицей слов с координатами или готовым PDF. Ниже описано, как установить движок и языковые пакеты, распознать русский текст, выбрать режим сегментации страницы и подготовить картинку, чтобы ошибок в результате было меньше.

Pytesseract
Фото: Unknown author / Public domain, Wikimedia Commons
Содержание статьи
  1. Как устроен pytesseract
  2. Установка Tesseract и пакета
  3. Распознавание текста с изображения
    1. Параметр config и режимы psm
  4. Слова с координатами и уверенностью
    1. Сохранение в PDF с текстовым слоем
  5. Подготовка изображения
  6. Типичные ошибки
  7. Частые вопросы
    1. Можно ли распознать текст из PDF?
    2. Распознает ли pytesseract рукописный текст?
    3. Как ускорить распознавание большого количества файлов?
    4. Чем pytesseract отличается от EasyOCR?

Как устроен pytesseract

Сама библиотека ничего не распознает. Она сохраняет изображение во временный файл, запускает программу tesseract из командной строки и читает ее вывод. Поэтому установка состоит из двух частей: движок ставится в систему, а пакет на Python ставится через pip.

Tesseract начинали в HP, позже его развивала Google, сейчас проект поддерживает сообщество. Начиная с версии 4 в движке работает распознавание на нейросети LSTM, которое заметно точнее старого режима на обычных шрифтах. Рукописный текст и сложные фоны Tesseract распознает плохо, для них нужны другие инструменты.

Установка Tesseract и пакета

Порядок действий зависит от операционной системы. Языковые данные нужны для каждого языка отдельно, по умолчанию доступен только английский.

После движка ставятся пакеты Python: pip install pytesseract pillow. Pillow нужен, чтобы открывать и обрабатывать картинки, об этом подробнее в статье про Pillow. Если Windows не добавила Tesseract в переменную PATH, путь указывают в коде:

import pytesseract

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
print(pytesseract.get_tesseract_version())   # например 5.4.0
print(pytesseract.get_languages())           # ['eng', 'osd', 'rus']

Если список языков не содержит rus, распознавание с русским языком завершится ошибкой TesseractError: файла rus.traineddata нет в папке tessdata.

Распознавание текста с изображения

Основная функция image_to_string() принимает объект Pillow, путь к файлу или массив NumPy и возвращает строку. Язык задается параметром lang, несколько языков перечисляют через плюс.

from PIL import Image
import pytesseract

image = Image.open("scan.png")
text = pytesseract.image_to_string(image, lang="rus+eng")
print(text.strip())

Указывать только нужные языки важно: лишний язык замедляет работу и добавляет ошибки, когда похожие буквы кириллицы и латиницы путаются между собой. Если на картинке только русский текст, ставьте lang="rus".

Параметр config и режимы psm

Через config передаются параметры командной строки Tesseract. Самый полезный из них --psm, режим сегментации страницы: он подсказывает движку, как расположен текст.

--psmКогда использовать
3значение по умолчанию, автоматический разбор страницы
4одна колонка текста разного размера, например чек
6один ровный блок текста
7одна строка
8одно слово
11разрозненный текст без порядка

Для распознавания только цифр, например номеров или сумм, к режиму добавляют белый список символов:

digits = pytesseract.image_to_string(
    image,
    config="--psm 7 -c tessedit_char_whitelist=0123456789",
)
print(digits)

Слова с координатами и уверенностью

Функция image_to_data() возвращает каждое найденное слово с его положением на картинке и оценкой уверенности от 0 до 100. С параметром output_type=Output.DICT результат приходит словарем списков, где элементы с одинаковым индексом относятся к одному слову.

from pytesseract import Output

data = pytesseract.image_to_data(image, lang="rus", output_type=Output.DICT)
for word, conf, x, y in zip(data["text"], data["conf"], data["left"], data["top"]):
    if word.strip() and float(conf) > 60:
        print(f"{word} ({conf}) at {x},{y}")

По этим данным удобно отсеивать мусор с низкой уверенностью или рисовать рамки вокруг слов. Для отдельных символов есть image_to_boxes(), а image_to_osd() определяет поворот страницы и систему письма.

Сохранение в PDF с текстовым слоем

Функция image_to_pdf_or_hocr() превращает скан в PDF, в котором текст можно выделять и искать. Она возвращает байты, их остается записать в файл.

pdf = pytesseract.image_to_pdf_or_hocr("scan.png", lang="rus", extension="pdf")
with open("scan.pdf", "wb") as f:
    f.write(pdf)

Склеить несколько таких страниц в один документ можно библиотекой PyPDF2.

Подготовка изображения

Качество распознавания больше зависит от картинки, чем от настроек. Tesseract рассчитан на черный текст на белом фоне с высотой заглавных букв около 20-30 пикселей. Фото с телефона, мелкий шрифт и цветной фон стоит обработать перед распознаванием.

from PIL import Image, ImageOps

img = Image.open("photo.jpg")
img = ImageOps.grayscale(img)                    # оттенки серого
img = img.resize((img.width * 2, img.height * 2))  # увеличить мелкий текст
img = img.point(lambda p: 255 if p > 150 else 0)   # бинаризация
print(pytesseract.image_to_string(img, lang="rus"))

Порог 150 подбирают под конкретные снимки: на темных фото его снижают, на бледных повышают. Для неровного освещения лучше подходит адаптивная бинаризация из OpenCV (cv2.adaptiveThreshold). Перекошенный скан выравнивают поворотом, угол можно узнать через image_to_osd().

Типичные ошибки

Большинство проблем с pytesseract связаны с установкой движка, а не с кодом.

Полное описание функций и параметров есть на странице проекта pytesseract на GitHub.

Частые вопросы

Ответы на вопросы, которые чаще всего задают при работе с pytesseract.

Можно ли распознать текст из PDF?

Tesseract принимает только изображения. Страницы PDF сначала рендерят в картинки, например пакетом pdf2image (нужен Poppler) или PyMuPDF, а затем передают в image_to_string().

Распознает ли pytesseract рукописный текст?

Почти нет: модели Tesseract обучены на печатных шрифтах. Для рукописи используют облачные OCR-сервисы или специализированные нейросети.

Как ускорить распознавание большого количества файлов?

Обрезайте картинку до области с текстом, указывайте один язык и запускайте обработку файлов параллельно через concurrent.futures.ProcessPoolExecutor, так как каждый вызов запускает отдельный процесс tesseract.

Чем pytesseract отличается от EasyOCR?

EasyOCR работает на PyTorch, лучше справляется с фотографиями и текстом на сложном фоне, но тяжелее и медленнее без видеокарты. Pytesseract легче, быстрее на чистых сканах и не требует скачивания больших моделей.