Извлечение таблиц-спецификаций из технических чертежей: двухэтапный подход с Mistral OCR
Теги: python, ocr, pdf, таблицы, mistral-ai, техническая-документация
Суть задачи
Нахожусь в раздумьях по поводу технического решения. Заказчик хочет автоматизировать составление смет из технических чертежей со спецификациями. Я пока на первом этапе — выделение таблиц из чертежей.
Специфика документов
- Технические чертежи в PDF (обычно сканы)
- Таблицы-спецификации с заголовками: "Поз.", "Обозначение", "Наименование", "Кол."
- Русские чертежные шрифты ГОСТ — основная проблема
- Размер файлов: 2-10 МБ, многостраничные документы (10-50 страниц)
- Качество сканирования часто оставляет желать лучшего
Текущая проблема
Пробовал Mistral OCR API для обработки всего PDF целиком:
ocr_response = client.ocr.process(<br>
model="mistral-ocr-latest",<br>
document={"type": "document_url", "document_url": pdf_url}<br>
)
Результат: Хорошо понимает структуру таблиц и возвращает markdown, но плохо распознает русские технические шрифты. Плюс обрабатывает весь чертеж (50 страниц), а мне нужны только 2-3 страницы со спецификациями.
Моя идея решения
Думаю о двухэтапном подходе:
- Этап 1: Найти в PDF только страницы с таблицами-спецификациями (по ключевым словам "специф", "спецификация", анализу плотности линий и т.д.)
- Этап 2: Вырезать найденные страницы и отправить только их в Mistral OCR
Преимущества такого подхода:
- Обрабатываем 2-3 страницы вместо 50 — быстрее и дешевле
- Меньше шума для OCR — только релевантный контент
- Можно предобработать найденные страницы (улучшить контрастность, качество)
- Mistral OCR сможет лучше сосредоточиться на таблицах
Примерный алгоритм
# Этап 1: Поиск страниц со спецификациями<br>
def find_specification_pages(pdf_bytes):<br>
pages_with_specs = []<br>
<br>
# Поиск по ключевым словам<br>
for page_num, page in enumerate(pdf_pages):<br>
text = extract_text_from_page(page)<br>
if any(keyword in text.lower() for keyword in ["специф", "спецификация", "поз.", "обозначение"]):<br>
pages_with_specs.append(page_num)<br>
<br>
return pages_with_specs<br>
<br>
# Этап 2: Обработка найденных страниц через Mistral<br>
def process_specification_pages(pages):<br>
for page in pages:<br>
# Вырезаем страницу<br>
page_pdf = extract_single_page(page)<br>
<br>
# Отправляем в Mistral OCR<br>
result = mistral_ocr_process(page_pdf)<br>
<br>
# Обрабатываем результат<br>
tables = extract_tables_from_markdown(result)
Вопросы к сообществу
- Имеет ли смысл такой двухэтапный подход? Или лучше сразу весь PDF обрабатывать?
- Какими инструментами лучше искать страницы с таблицами? PyMuPDF, PDFPlumber, или что-то еще?
- Стоит ли предобрабатывать найденные страницы (повышение контрастности, бинаризация) перед отправкой в Mistral OCR?
- Может, есть готовые решения для поиска таблиц в многостраничных PDF?
Ожидаемый результат
Получить таблицы-спецификации в структурированном виде (JSON/CSV/Excel) с корректно распознанными русскими наименованиями для дальнейшего создания смет.
Готов предоставить примеры проблемных файлов и более детальный код по запросу.
Буду благодарен за любые советы по реализации такого подхода!