Обработка файлов и распознавание¶
Обработка загруженного файла происходит в несколько этапов: преобразование в изображения, исправление ориентации, сегментация на отдельные документы, извлечение данных и сохранение результатов. В этом разделе описаны модули, отвечающие за первые два этапа --- работу с файлами и распознавание текста.
Поддерживаемые форматы¶
Система принимает файлы двух типов:
| Формат | Расширения | Особенности |
|---|---|---|
.pdf |
Основной формат, обрабатывается напрямую | |
| TIFF | .tif, .tiff |
Многостраничные изображения, перед обработкой автоматически преобразуются в PDF |
Определение формата выполняется по расширению имени файла (регистр не учитывается). Файлы остальных форматов системой не принимаются.
Преобразование TIFF в PDF¶
Многостраничный TIFF-файл преобразуется в PDF постранично с целью экономии памяти: каждый кадр обрабатывается отдельно, преобразуется в промежуточный PNG, а затем --- в страницу PDF. После обработки промежуточные данные кадра удаляются из памяти. Готовый PDF сжимается алгоритмом deflate.
Преобразование выполняется библиотекой PyMuPDF (fitz) совместно с Pillow.
Преобразование страниц в изображения¶
Класс PDFProcessor (модуль pdf_processor.py) отвечает за работу со страницами PDF: подсчёт страниц, преобразование в растровые изображения, извлечение диапазонов страниц в отдельные файлы.
Разрешение¶
Изображения создаются с разрешением, заданным параметром dpi (по умолчанию --- 150 точек на дюйм). Коэффициент масштабирования вычисляется как dpi / 72, где 72 --- базовое разрешение PDF.
Повышение dpi улучшает качество распознавания текста, но увеличивает размер изображений и время обработки. Значение 150 обеспечивает баланс между качеством и скоростью для типичных бухгалтерских документов.
Автоматическое исправление ориентации¶
При преобразовании страницы в изображение система может автоматически определить и исправить поворот текста. Для этого используется механизм определения ориентации и письменности Tesseract (OSD --- Orientation and Script Detection).
Порядок действий:
- Изображение страницы передаётся в Tesseract OSD.
- Tesseract возвращает угол поворота (0, 90, 180 или 270 градусов) и степень уверенности.
- Если уверенность превышает порог 1,0 --- изображение поворачивается в обратную сторону для компенсации.
Автоматическое исправление ориентации управляется переменной окружения AUTO_FIX_ROTATION (по умолчанию --- включено). Если используется Google Cloud Vision для распознавания текста, автоповорот через Tesseract отключается, чтобы избежать двойной коррекции.
Преобразование в формат base64¶
Перед отправкой изображения в Claude его необходимо закодировать в формат base64. При кодировании система автоматически контролирует размер:
- Изображение преобразуется в формат JPEG (если исходный формат иной).
- Если какая-либо сторона превышает 2048 пикселей --- изображение пропорционально уменьшается.
- Если размер закодированных данных превышает 4,5 мегабайта (при ограничении Claude в 5 мегабайт) --- снижается качество JPEG (от 90 до 30).
- Если снижение качества не помогает --- изображение уменьшается на 25% и процесс повторяется.
- Минимальный допустимый размер --- 800 пикселей по любой стороне.
Извлечение страниц в отдельный PDF¶
После определения границ документа (какие страницы относятся к одному документу) система извлекает соответствующий диапазон страниц из исходного PDF в новый файл. Этот файл сохраняется в хранилище MinIO и привязывается к записи документа в базе данных.
При извлечении также выполняется автоматический поворот страниц: каждая страница проверяется через Tesseract OSD, и если обнаружен поворот --- он компенсируется на уровне PDF (свойство rotation страницы).
Превью документа¶
Для каждого извлечённого документа создаётся миниатюра первой страницы в формате PNG. Максимальный размер превью --- 400 на 566 пикселей. Превью сохраняется в отдельном хранилище MinIO и используется для отображения в пользовательском интерфейсе.
Распознавание текста через Google Cloud Vision¶
Модуль gcp_vision.py реализует распознавание текста с помощью Google Cloud Vision API. Это альтернативный способ получения текста со страниц, который может использоваться вместо Tesseract.
Подключение¶
Сервис инициализируется как единственный экземпляр (синглтон). Для работы необходимы:
- Включённая настройка
GCP_VISION_ENABLED(по умолчанию --- выключено). - Файл учётных данных сервисного аккаунта Google (путь задаётся в
GCP_CREDENTIALS_PATH) либо стандартные учётные данные через переменную окруженияGOOGLE_APPLICATION_CREDENTIALS.
Если оплата сервиса Google Cloud отключена, система выбрасывает специальную ошибку GCPBillingDisabledError, чтобы задание не обрабатывалось молча с пустыми результатами.
Пакетная обработка¶
Для повышения производительности изображения обрабатываются пакетами:
- До 16 изображений включаются в один запрос к сервису (ограничение API).
- Пакеты обрабатываются параллельно в 4 потока (настройка
GCV_PARALLEL_BATCHES). - Для 650 изображений это означает около 41 пакетного запроса вместо 650 отдельных, распределённых по 4 потокам --- то есть примерно 11 раундов.
Определение поворота¶
Помимо распознавания текста, сервис определяет угол поворота страницы. Для этого анализируются координаты ограничивающего прямоугольника первого существенного блока текста:
- Если верхний край прямоугольника направлен слева направо --- поворот 0 градусов (нормальная ориентация).
- Если сверху вниз --- 90 градусов по часовой стрелке.
- Если справа налево --- 180 градусов.
- Если снизу вверх --- 270 градусов.
Сегментация и сохранение результатов¶
Класс SegmentationService (модуль segmentation.py) объединяет все этапы обработки в единую последовательность. Именно этот класс вызывается при обработке загруженного файла.
Последовательность обработки задания¶
-
Подготовка. Из базы данных извлекается задание, определяется количество страниц в PDF.
-
Разбиение на порции. Страницы обрабатываются порциями (по умолчанию --- 20 страниц, настраивается через параметр
batch_sizeв настройках программы). Это позволяет обрабатывать большие файлы без чрезмерного потребления памяти. -
Преобразование и отправка. Для каждой порции:
- страницы преобразуются в изображения;
- изображения кодируются в base64;
- пакет отправляется в Claude для анализа (подробнее --- в разделе Распознавание через Claude);
- результаты накапливаются.
-
Создание документов. Для каждого распознанного документа:
- извлекаются соответствующие страницы в отдельный PDF;
- создаётся превью первой страницы;
- PDF и превью сохраняются в MinIO;
- определяется контрагент на основе типа документа и извлечённых сторон;
- выполняется валидация дат (дата договора должна быть раньше даты документа --- если даты перепутаны, они меняются местами);
- данные из содержимого и имени файла объединяются (приоритет отдаётся содержимому);
- вычисляются нормализованные значения для последующей группировки;
- проверяется расхождение между данными из содержимого и именем файла (флаг
sync_error); - запись документа сохраняется в коллекцию
documents.
-
Группировка. Если найдено два или более документов, запускается автоматическая группировка (подробнее --- в разделе «Группировка документов»).
-
Завершение. В задании обновляются статус, количество документов и групп, предупреждения и сведения об использовании языковой модели. Если задание связано с файлом из архива --- обновляется и статус архивного файла.
Проверка расхождений (sync_error)¶
Если данные извлечены одновременно из содержимого документа и из имени файла, система сравнивает их и выявляет расхождения. Сравниваются:
- номер документа (после нормализации);
- дата (после приведения к единому формату);
- контрагент (с учётом частичного вхождения);
- номер договора.
Если найдены расхождения --- в записи документа устанавливается флаг sync_error и сохраняется список несовпадающих полей. Это позволяет пользователю увидеть документы, требующие ручной проверки.
Обновление шаблонов¶
После создания каждого документа система обновляет счётчик в коллекции templates. Если шаблон для данного типа и подтипа документа ещё не существует --- он создаётся автоматически. Шаблоны используются на экране «Типы документов» для отображения статистики.
Учёт потребления ресурсов языковой модели¶
При каждом запросе к Claude фиксируются:
- количество входящих и исходящих токенов;
- использованная модель;
- текст подсказки (сохраняется из первого запроса порции, поскольку подсказка одинакова для всех порций);
- число запросов.
Все значения накапливаются по порциям и сохраняются в задании в поле usage.
Переменные окружения¶
| Переменная | Значение по умолчанию | Описание |
|---|---|---|
AUTO_FIX_ROTATION |
true |
Включить автоматическое исправление ориентации через Tesseract |
DEBUG_SAVE_IMAGES |
отключено | Сохранять изображения страниц в /tmp/debug_images для отладки |
GCP_VISION_ENABLED |
false |
Использовать Google Cloud Vision вместо Tesseract для распознавания текста |
GCP_CREDENTIALS_PATH |
(не задан) | Путь к файлу учётных данных сервисного аккаунта Google |
Связь с другими разделами¶
- Распознавание через Claude --- анализ изображений страниц, классификация и извлечение данных
- Группировка документов --- автоматическое объединение связанных документов
- Конфигурация --- полный список переменных окружения
- Хранилища данных --- описание коллекций MongoDB и хранилищ MinIO