Задать вопрос
@AianBack

Извлечение таблиц со спецификациями из PDF чертежей металлоконструкций — решаемо? Или я встрял?


Извлечение таблиц-спецификаций из технических чертежей: двухэтапный подход с 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. Этап 1: Найти в PDF только страницы с таблицами-спецификациями (по ключевым словам "специф", "спецификация", анализу плотности линий и т.д.)
  2. Этап 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)



Вопросы к сообществу
  1. Имеет ли смысл такой двухэтапный подход? Или лучше сразу весь PDF обрабатывать?
  2. Какими инструментами лучше искать страницы с таблицами? PyMuPDF, PDFPlumber, или что-то еще?
  3. Стоит ли предобрабатывать найденные страницы (повышение контрастности, бинаризация) перед отправкой в Mistral OCR?
  4. Может, есть готовые решения для поиска таблиц в многостраничных PDF?


Ожидаемый результат
Получить таблицы-спецификации в структурированном виде (JSON/CSV/Excel) с корректно распознанными русскими наименованиями для дальнейшего создания смет.

Готов предоставить примеры проблемных файлов и более детальный код по запросу.


Буду благодарен за любые советы по реализации такого подхода!





  • Вопрос задан
  • 56 просмотров
Подписаться Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Имхо без комбинации подходов ловить вообще нечего. Найди инструмент (и набор предобработок), который найдёт тебе разметку таблиц, выдерни содержимое отдельных ячеек, и подбирай предобработки+инструмент, который будет распознавать ячейки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы