Задать вопрос
@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) с корректно распознанными русскими наименованиями для дальнейшего создания смет.

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


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





  • Вопрос задан
  • 496 просмотров
Подписаться Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillbox
    Профессия Python-разработчик + ИИ
    10 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
Имхо без комбинации подходов ловить вообще нечего. Найди инструмент (и набор предобработок), который найдёт тебе разметку таблиц, выдерни содержимое отдельных ячеек, и подбирай предобработки+инструмент, который будет распознавать ячейки.
Ответ написан
Комментировать
Maksim_64
@Maksim_64
ML Engineer
Было дело работал с российскими нормативными документами гостами. По сталям и фиттингам для трубопроводов.

1. Качество pdf очень важная история. Если совсем плохое парсер не возьмет (нужно искать в интеренте) есть открытые нормативные базы.
2. парсеры (tabula, camelot) с множеством настроек, в зависимости от того, как настроишь зависит практически все.
3. Ну и pandas обе библиотеки вернут список с дата фреймами, где фрейм это каждая таблица. Обычно требует много пост процессинга, например две таблицы на странице а их конкатенировать одна на одну, таблицы имеют "многоуровневую шапку" column multi index на языке пандаса и т.д.

После пункта три, до желаемого результата одна строчка кода.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Краснодар
от 220 000 до 300 000 ₽
ITK academy Краснодар
от 75 000 ₽
DimaTech Ltd Краснодар
от 140 000 до 140 000 ₽