PP-Structure

PP-Structure разбирает PDF и изображения страниц на заголовки, абзацы, таблицы, формулы, рисунки, печати и служебные области, распознаёт текст, восстанавливает порядок чтения и сохраняет результат в Markdown, JSON, Word, HTML или XLSX. Пользователь может включать выравнивание снимка, определение поворота, распознавание таблиц и формул, получать координаты каждого блока и собирать многостраничный документ в структуру, пригодную для поиска, долговременного хранения, RAG-системы или последующей проверки.

Работа начинается с передачи одного файла, адреса изображения, массива пикселей либо каталога с изображениями в команду paddleocr pp_structurev3 или в метод predict(). Конвейер последовательно исправляет ориентацию страницы, выделяет зоны макета, направляет содержимое в подходящий распознаватель и возвращает объект результата; в нём доступны исходные размеры страницы, номер страницы PDF, координаты областей, распознанные строки, типы блоков, данные таблиц и сформированный Markdown.

Качество удобнее контролировать не по одному итоговому тексту, а по визуализациям разметки, OCR и порядка чтения: они сразу показывают пропущенную колонку, ошибочно объединённый заголовок или таблицу, принятую за рисунок. После проверки можно скорректировать порог макета, заменить модель распознавания языка, отключить тяжёлый модуль, изменить режим объединения рамок и повторить обработку только проблемной группы документов.

Скачать PP-Structure

Оценка 9.7 Рекомендуем
  • Редактирование PDF
  • Русский интерфейс
  • Просто новичкам
Скачать бесплатно на Windows
Лучшая альтернатива
PP-Structure
Оценка 8.5
  • Нужна настройка Python
  • GPU желателен
  • Нет визуального редактора
Скачать PP-Structure
Загрузка начнётся после нажатия

Как устроен разбор страницы

PP-Structure рассматривает страницу не как сплошную картинку, а как набор областей с разными правилами обработки. Сначала определяется геометрия документа, затем модель макета находит прямоугольники и присваивает им классы: заголовок документа, заголовок раздела, обычный текст, колонтитул, номер страницы, список, таблица, подпись, рисунок, формула, печать и другие служебные типы. После этого текстовые области поступают в OCR, таблицы — в распознавание структуры и ячеек, формулы — в специализированную модель, а найденные элементы сортируются в предполагаемом порядке чтения.

Такое разделение важно для сложных PDF. Если просто выполнить OCR всей страницы, две колонки часто смешиваются, подпись попадает внутрь абзаца, а значения таблицы теряют связь со строками и столбцами. Здесь у каждого блока остаются координаты и тип, поэтому последующая программа может исключить колонтитулы, отдельно индексировать подписи, сохранить формулу как LaTeX и превратить таблицу в HTML или электронную таблицу. Результат подходит не только для чтения человеком, но и для автоматической загрузки в базу знаний.

Конвейер состоит из обязательных и отключаемых этапов. Выделение макета и OCR формируют основу. Распознавание таблиц и формул включено в типовой конфигурации, а обработка печатей, диаграмм, ориентации и деформации страницы активируется по задаче. Это позволяет не расходовать память и время на модели, которые конкретному набору документов не нужны. Для обычных цифровых отчётов достаточно макета, текста и таблиц; для фотографий книг полезны выравнивание и поворот; для научных статей нужны формулы; для актов и справок может потребоваться распознавание печати.

Пример преобразования страницы PDF в структурированный Markdown

Схема этапов PP-Structure: подготовка страницы, анализ макета, OCR и распознавание элементов

Первый запуск через командную строку

Самый короткий способ проверить документ — команда с подкомандой pp_structurev3 и параметром -i. В качестве входа можно указать путь к изображению или PDF, адрес доступного файла либо каталог с изображениями. Каталог, содержащий PDF, не разбирается как пакет: многостраничный файл нужно передавать отдельным путём. Для сохранения результатов задают --save_path; без него данные выводятся в процессе работы, но файлы в выбранную папку не записываются.

paddleocr pp_structurev3 -i ./document.pdf --save_path ./result

При первом обращении к стандартным моделям их веса загружаются автоматически. Поэтому начальный запуск обычно дольше последующих и требует свободного места в каталоге моделей. Если сеть ограничена прокси, корпоративным сертификатом или запретом на внешние хранилища, лучше заранее скачать нужные модели и передать каталоги через параметры вида layout_detection_model_dir, text_detection_model_dir и text_recognition_model_dir. Такой подход также фиксирует набор весов для воспроизводимой пакетной обработки.

Для быстрой диагностики сначала используйте одну репрезентативную страницу: с двумя колонками, таблицей, формулой и изображением. После запуска проверьте файлы визуализации и структуру JSON. Если результат приемлем, переходите к нескольким страницам разных типов, а затем ко всему набору. Это быстрее, чем сразу обрабатывать сотни PDF и только в конце обнаружить, что выбран неподходящий языковой распознаватель или порог макета отбрасывает мелкие подписи.

Поворот, выравнивание и ориентация строк

Параметр --use_doc_orientation_classify True включает классификацию поворота страницы по четырём направлениям: 0, 90, 180 и 270 градусов. Он полезен для смешанного пакета сканов, где часть листов была подана в сканер боком. Классификатор меняет ориентацию до анализа макета, поэтому координаты последующих областей относятся уже к исправленному изображению. Если все страницы заранее нормализованы, модуль можно оставить выключенным и сократить время обработки.

Параметр --use_doc_unwarping True исправляет перспективные и волнообразные искажения. Он особенно заметен на фотографиях разворотов: строки у корешка изгибаются, ширина символов меняется, а прямоугольная таблица превращается в трапецию. После выравнивания детектор текста получает более ровные строки, а модель таблиц — более предсказуемые границы. На плоских экспортированных PDF дополнительная коррекция не нужна и иногда лишь увеличивает расход памяти.

Классификация направления отдельных текстовых строк включается через use_textline_orientation. Она нужна, когда внутри нормально ориентированной страницы встречаются вертикальные подписи, повёрнутые ячейки или боковые отметки. Не следует путать её с поворотом всей страницы: первый параметр исправляет документ целиком, второй уточняет направление отдельных фрагментов перед распознаванием.

Пример исправления поворота и деформации страницы перед распознаванием

Интеграция через Python API

Для программной обработки создают объект PPStructureV3 и вызывают predict(). Метод возвращает итерируемую последовательность результатов: для изображения обычно один элемент, для PDF — элемент на каждую страницу. Потоковая форма удобна для длинных документов, потому что страницу можно сохранить и освободить связанные данные, не накапливая весь результат в памяти. В цикле доступны методы печати структуры, экспорта и визуализации.

from paddleocr import PPStructureV3

pipeline = PPStructureV3(
    use_doc_orientation_classify=True,
    use_table_recognition=True,
    use_formula_recognition=True,
    device="gpu",
)

for result in pipeline.predict("document.pdf"):
    result.save_to_json("output")
    result.save_to_markdown("output")
    result.save_to_word("output")

Параметры можно задать при создании конвейера и переопределить в конкретном вызове predict(). Это удобно, когда основной поток документов обрабатывается с одной конфигурацией, а отдельная партия требует распознавания печатей или более низкого порога макета. Приоритет имеет значение, переданное в вызов предсказания; если там указано None, используется настройка объекта. Такой механизм избавляет от повторного создания всех моделей для каждой страницы.

Входом метода служит путь, адрес файла, объект изображения, массив NumPy или список поддерживаемых объектов. Для PDF в результате заполняются page_index и page_count; для обычной картинки номер страницы отсутствует. Поля width и height помогают перевести координаты блоков в относительные значения, построить интерактивную подсветку или сопоставить распознанный элемент с областью исходного документа.

В рабочем сервисе полезно оборачивать обработку одной страницы в отдельный блок контроля ошибок. Повреждённый PDF, изображение с нулевой шириной или нехватка памяти не должны останавливать всю очередь. Сохраняйте имя входа, индекс страницы, активные параметры и сообщение исключения; затем повторяйте только сбойные элементы с облегчённой конфигурацией, например без распознавания диаграмм и с мобильными OCR-моделями.

Что находится в объекте результата

Результат содержит не только итоговый Markdown. В нём сохраняются сведения о входе, настройках моделей, предобработанном изображении, областях макета, OCR, таблицах, формулах, печатях и порядке чтения. Конкретный набор полей зависит от включённых модулей. Если распознавание печатей выключено, соответствующего блока не будет; это нормальное состояние, а не ошибка. Перед обращением к необязательному полю проверяйте его наличие либо используйте безопасное чтение словаря.

Область макета обычно описывается классом, оценкой уверенности и прямоугольником. Координаты позволяют вырезать проблемный фрагмент, провести повторный OCR другой моделью или показать оператору только места с низкой уверенностью. Для текстовых строк доступны распознанные значения и оценки; для таблиц — структура, ячейки и представления, пригодные для HTML или XLSX; для формул — строка разметки; для визуализаций — изображения с рамками и подписями.

Метод print() удобен для знакомства со схемой, но в производственном коде лучше работать со структурированным представлением и сохранять его в JSON. Текстовый вывод терминала предназначен для чтения человеком и может изменяться в оформлении. JSON проще валидировать, сравнивать между запусками и загружать в аналитическую систему. Для долгосрочного хранения сохраняйте также параметры запуска и имена моделей, иначе спустя время будет трудно объяснить различия в разборе одинаковых страниц.

Определение областей и порядок чтения

Модель макета отделяет смысловые зоны до OCR. На научной странице она может найти название статьи, имена авторов, аннотацию, две колонки основного текста, формулу, подпись к рисунку, список литературы и номер страницы. На договоре — заголовок, реквизиты, обычные абзацы, таблицу и печать. Классы нужны не ради красивых рамок: они определяют, какой распознаватель получит фрагмент и как его содержимое будет представлено в итоговом документе.

Порог layout_threshold управляет минимальной уверенностью областей. Значение по умолчанию 0,5 подходит как отправная точка. Если исчезают мелкие подписи, номера формул или узкие боковые заметки, порог постепенно снижают и проверяют, не появилось ли много ложных блоков. Если декоративные элементы ошибочно принимаются за текст, порог повышают. Для неоднородной коллекции разумнее использовать словарь порогов по классам, если конфигурация это допускает, чем одинаково ослаблять фильтр для всех типов.

Параметр layout_nms включает подавление перекрывающихся рамок. Он полезен, когда модель создаёт несколько почти одинаковых областей вокруг одного абзаца или рисунка. Параметр layout_unclip_ratio расширяет рамки после обнаружения; слишком маленькая рамка может обрезать крайние символы, а слишком большая захватит текст соседней колонки. Изменяйте коэффициент небольшими шагами и оценивайте не только визуализацию, но и итоговое чтение.

Режим объединения рамок влияет на то, как соседние детекции превращаются в логические блоки. Ошибка объединения проявляется двумя способами: абзац распадается на множество коротких фрагментов либо две колонки склеиваются в одну область. Для диагностики сравните изображение макета с картой порядка чтения. Если рамки правильные, но последовательность неверна, проблема находится на этапе восстановления порядка; если рамки уже пересекают колонки, сначала корректируют детектор и правила объединения.

Распознанные области макета с отдельными классами и рамками

Как проверять многоуровневые заголовки

Иерархия документа не всегда полностью выводится из размера шрифта. Заголовок раздела может быть набран тем же кеглем, что и обычный текст, но иметь номер, отступ или жирное начертание. PP-Structure использует класс области и геометрию, однако итоговый Markdown всё равно следует проверить правилами проекта. Полезно сопоставлять последовательность заголовков с нумерацией: после раздела 2 ожидается 2.1 или 3, а внезапный заголовок четвёртого уровня часто указывает на ошибочную классификацию короткой строки.

Для RAG-системы рекомендуется сохранять путь заголовков рядом с каждым фрагментом текста. Если Markdown строится корректно, этот путь можно извлечь при разбиении на чанки. Если иерархия нестабильна, лучше использовать координаты, номер страницы и ближайший надёжно распознанный заголовок, чем слепо доверять количеству символов решётки. Такая проверка уменьшает риск, что ответ поиска будет лишён контекста раздела.

OCR текста и выбор языковой модели

В стандартном сценарии детектор находит строки, а распознаватель преобразует их в символы. Для смешанных китайско-английских документов используется соответствующая модель, однако чисто английский материал может точнее обрабатываться специализированной английской моделью. Тот же принцип относится к русскому, арабскому, японскому и другим письмам: выбирайте модель по фактическому языку страниц, а не по языку имени файла или метаданных PDF.

Неверная языковая модель обычно проявляется систематически: похожие латинские и кириллические буквы смешиваются, знаки препинания заменяются, редкие символы пропадают, а уверенность остаётся неоднородной. Случайные единичные ошибки чаще связаны с разрешением, шумом или обрезанной строкой. Перед заменой модели сохраните несколько характерных фрагментов и сравните распознавание при одинаковой предобработке, иначе улучшение может оказаться следствием другого масштаба изображения.

Порог оценки текста позволяет отсеять сомнительные строки, но его нельзя использовать как единственный контроль качества. Низкий порог сохраняет больше содержания и одновременно добавляет мусор; высокий делает вывод чище, но может удалить даты, индексы, мелкий шрифт и бледные сноски. Для распознавания фондовых документов обычно безопаснее сохранить строки вместе с оценками и отправить низкоуверенные элементы на проверку, чем безвозвратно удалить их до формирования результата.

Цифровой PDF иногда уже содержит текстовый слой, но PP-Structure анализирует визуальное представление страницы, чтобы сохранить связь текста с макетом. Это помогает при сложных колонках и таблицах, однако не гарантирует буквального совпадения с встроенным текстом. Для контроля можно сравнить оба варианта: текстовый слой использовать как дополнительную подсказку, а геометрию и типы областей брать из анализа изображения.

Распознавание таблиц

Таблица требует трёх разных решений: найти её область, определить тип и структуру, затем сопоставить распознанный текст с ячейками. PP-Structure различает таблицы с линиями и без линий, применяет специализированные модели структуры и при необходимости детекторы ячеек. Итог может сохраняться как HTML и XLSX, поэтому строки и столбцы остаются доступны для вычислений, а не превращаются в набор фраз, расположенных приблизительно по координатам.

Для таблицы с явной сеткой важны границы ячеек и объединения. На бледном скане линии могут прерываться, а фоновые пометки восприниматься как граница. Увеличение контраста и выравнивание перспективы часто дают больший эффект, чем простое снижение порога. Для таблицы без линий решающими становятся выравнивание текста и интервалы между колонками; здесь ошибка OCR в коротком числовом значении способна нарушить сопоставление с ячейкой, поэтому полезно проверять числовые столбцы отдельными правилами.

Классификатор таблиц помогает выбрать подходящий распознаватель для линованного и безлинейного варианта. Если известно, что вся коллекция состоит из одного типа форм, автоматическую классификацию можно заменить фиксированной конфигурацией и сократить лишний этап. Если документы смешанные, фиксированный выбор приведёт к отличному результату на одной группе и заметным ошибкам на другой. Решение принимают по выборке, а не по одной удачной странице.

Определение границ и ячеек таблицы

После распознавания сравнивайте количество столбцов, устойчивость заголовков и типы значений. Например, столбец дат должен содержать даты в большинстве строк, сумма — числа, а идентификатор — значения предсказуемой длины. Если одна строка внезапно содержит вдвое больше ячеек, вероятно, была неверно распознана объединённая область. Такие проверки не исправляют изображение, но точно указывают страницы, которые требуют повторной обработки или ручной сверки.

Экспорт в XLSX удобен для проверки, однако он не должен быть единственным сохранённым результатом. Табличный файл показывает значения, но может потерять исходные координаты, оценки и связь с другими блоками страницы. Для трассировки сохраняйте JSON и изображение визуализации вместе с XLSX. Тогда спорное число можно быстро найти на оригинале, а не пытаться восстановить его положение по номеру строки электронной таблицы.

Сопоставление исходной таблицы и восстановленной структуры

Таблицы, продолжающиеся на следующей странице

Многостраничная таблица редко распознаётся как единый объект без дополнительной логики. На каждой странице появляются отдельные области; заголовок столбцов может повторяться, а последняя строка первой страницы продолжаться на второй. Для объединения сравнивают геометрию колонок, текст заголовков и положение таблицы относительно верхнего и нижнего края. Повторный заголовок удаляют только после уверенного совпадения, иначе можно потерять реальную строку данных.

Если ширины столбцов немного различаются из-за масштаба или полей, переводите координаты в доли ширины страницы. Совпадение нормализованных границ устойчивее абсолютных пикселей. Дополнительно проверяйте типы значений в каждом столбце. Объединение следует фиксировать в журнале: номера страниц, уверенность правила и причина, по которой две таблицы признаны продолжением. Это особенно важно для финансовых и юридических документов.

Формулы и математическая разметка

Формульный модуль сначала получает область от анализа макета, затем преобразует изображение выражения в строку разметки. В результате формулу можно сохранить внутри Markdown, индексировать отдельно или передать системе, понимающей LaTeX. Координаты области позволяют оставить связь с исходной страницей и показать пользователю изображение, если разметка оказалась сомнительной.

На качество сильнее всего влияют разрешение, обрезка и соседний текст. Если рамка захватывает номер формулы, часть пояснения или строку из соседней колонки, распознаватель получает смешанное содержимое. Сначала исправьте область макета и только затем меняйте модель формул. Для встроенных формул важно, чтобы они не были разделены на несколько несвязанных рамок; для многострочных выражений, наоборот, чрезмерное объединение с текстом вокруг приводит к длинной ошибочной последовательности.

Области текста и формул на научной странице

Проверку можно автоматизировать частично. Сбалансированные скобки, наличие закрывающих команд, допустимые символы и отсутствие чрезмерно длинных повторов выявляют очевидно повреждённые строки. Семантическую правильность такая проверка не гарантирует: знак минус, индекс или степень могут быть синтаксически допустимыми и всё же неверными. Поэтому критические формулы следует сверять по визуализации или сохранять вместе с фрагментом страницы.

Визуальное воспроизведение формул требует установленной системы LaTeX и зависит от окружения; в документации этот сценарий ориентирован на Ubuntu. Само извлечение разметки и сохранение результата не следует смешивать с её рендерингом. На сервере без LaTeX можно сохранить строку формулы, а изображение для предпросмотра создавать в отдельном сервисе. Такое разделение упрощает диагностику и уменьшает набор системных зависимостей основного конвейера.

Результат определения формульных областей и их содержимого

Диаграммы и преобразование в таблицу

Модуль диаграмм распознаёт графическую область и пытается представить её данные в табличном виде. Он отключён по умолчанию, потому что требуется не каждому документу и заметно увеличивает объём загружаемых моделей и вычисления. Включать его имеет смысл для отчётов, где значения на столбчатых или линейных графиках нужны для анализа, а не только для визуального чтения.

Распознанная таблица диаграммы должна проходить предметную проверку. Сопоставьте подписи осей, единицы измерения, категории и число серий. Отрицательные значения, вторичная ось, накопленные столбцы и близко расположенные подписи усложняют задачу. Если подпись категории не распознана, число без контекста почти бесполезно; поэтому сохраняйте исходный график и координаты вместе с табличным результатом.

Пример диаграммы, передаваемой модулю преобразования в табличные данные

Для документов, где графики служат только иллюстрацией, лучше оставить модуль выключенным и сохранить область как изображение в Markdown. Это быстрее и снижает число ложных таблиц. Если отдельные страницы содержат значимые диаграммы, включайте распознавание выборочно через параметр вызова predict(), а не для всей коллекции. Выборочная стратегия особенно полезна на CPU и при ограниченной видеопамяти.

Печати и штампы

Распознавание печатей состоит из поиска области и OCR текста внутри неё. Круговая надпись, цветной фон, пересечение с подписью и слабый оттиск делают обычное построчное OCR ненадёжным, поэтому используется отдельный конвейер. Результат содержит найденную область и строки, которые можно сопоставить с ожидаемым названием организации, номером или иной проверяемой частью.

Выделение печати и распознанные строки внутри оттиска

Не следует считать наличие распознанного текста доказательством подлинности печати. Модуль извлекает видимые символы и координаты, но не выполняет криминалистическую проверку, не подтверждает полномочия подписанта и не сравнивает оттиск с эталоном. В документообороте его используют для поиска и маршрутизации: например, отметить страницы со штампом, извлечь название и отправить низкоуверенные случаи оператору.

Если печать перекрывает основной текст, полезно сохранить оба результата и исходный фрагмент. Агрессивное удаление цветного слоя может улучшить чтение абзаца и одновременно уничтожить символы печати. Для двух задач применяют разные предобработки: одну копию страницы — для обычного OCR, вторую — для цветного оттиска. Координаты позволяют затем объединить сведения, не изменяя оригинал.

Markdown, JSON, Word, HTML и XLSX

Метод save_to_markdown() создаёт Markdown для каждой страницы. В нём сохраняется логическая последовательность блоков, заголовки, обычный текст, формулы, таблицы и ссылки на извлечённые изображения. Для PDF безопаснее передавать каталог, а не один путь к файлу: иначе результаты разных страниц могут перезаписываться в зависимости от способа именования. Изображения, на которые ссылается Markdown, нужно переносить вместе с текстом.

Метод save_to_json() сохраняет подробное структурированное представление. Это основной формат для интеграции, потому что он содержит координаты, классы, оценки и промежуточные результаты. Схему JSON следует фиксировать тестами: проверить обязательные поля, типы чисел и допустимые значения классов. При обновлении зависимостей сравнение схемы и контрольной выборки раньше обнаружит несовместимость, чем ошибка в уже работающем поисковом индексе.

Экспорт Word удобен для человека, который хочет открыть восстановленный документ и вручную поправить текст. Он не равен точному воспроизведению исходного PDF: цель — перенести распознанное содержание и структуру в редактируемую форму. Сложная верстка, плавающие изображения и точные межстрочные интервалы могут отличаться. Для задач, где важна юридически точная копия страницы, храните исходный PDF и используйте Word только как рабочую производную.

Методы save_to_html() и save_to_xlsx() ориентированы прежде всего на таблицы. HTML удобно встраивать в веб-интерфейс или последовательно анализировать, XLSX — отдавать специалисту для фильтрации и сверки. Если на странице несколько таблиц, заранее определите правила именования и каталогов, чтобы файлы не смешивались. В журнале сохраняйте связь: входной документ, индекс страницы, номер таблицы и путь к производному файлу.

Метод save_to_img() создаёт визуализации распознавания. Если указать каталог, сохраняются разные изображения — макет, OCR, порядок чтения и другие доступные представления. Если указать один файл, последующие изображения могут перезаписать предыдущие, и останется только последнее. Для контроля качества всегда используйте каталог и понятную структуру имён; тогда можно автоматически собрать HTML-отчёт со ссылками на проблемные страницы.

Как объединить PDF в один Markdown

При обработке PDF каждая страница возвращается отдельно. Для единого файла собирают свойство markdown всех результатов, затем вызывают concatenate_markdown_pages(). Важно также собрать словари markdown_images и сохранить изображения по путям, указанным в Markdown. Простая конкатенация текстов без ресурсов приводит к битым изображениям и иногда нарушает разделение страниц.

markdown_pages = []
images = []
for result in pipeline.predict("document.pdf"):
    info = result.markdown
    markdown_pages.append(info)
    images.append(info.get("markdown_images", {}))

text = pipeline.concatenate_markdown_pages(markdown_pages)

После объединения проверьте границы страниц. Заголовок внизу одной страницы и продолжение абзаца вверху следующей могут требовать склейки, а два самостоятельных раздела — явного разделителя. Автоматическое правило должно учитывать пунктуацию, отступ, класс блока и положение на странице. Не удаляйте разрыв только потому, что первая строка следующей страницы начинается со строчной буквы: это полезный признак, но не достаточное доказательство продолжения.

Настройка моделей и конфигурационного файла

Большинство параметров доступно напрямую в конструкторе, однако сложный проект удобнее описывать конфигурационным YAML. В нём фиксируют имена и каталоги моделей, включённые модули, пороги, размеры пакетов и параметры устройства. Команда принимает изменённый файл через --paddlex_config. Конфигурацию следует хранить рядом с кодом и контрольными результатами, чтобы повторный запуск не зависел от случайных аргументов командной строки.

Замена модели выполняется либо по имени из поддерживаемого списка, либо по каталогу пользовательской модели. Имя выбирает стандартные веса и связанную предобработку; каталог позволяет использовать предварительно загруженный или дообученный вариант. Нельзя без проверки подменять только файл весов: архитектура, словарь, размеры входа и постобработка должны соответствовать конфигурации. При несовпадении возможны ошибки загрузки или правдоподобный, но неверный результат.

Для макета доступны модели разного размера. Крупная модель лучше подходит для сложных журналов, договоров и научных страниц, но требует больше памяти и времени. Средняя или малая модель разумна для однотипных форм, где классы хорошо разделены и важна пропускная способность. Выбор делайте по собственному набору: измеряйте полноту значимых блоков, правильность классов и задержку, а не только общую метрику из таблицы модели.

Пакетные размеры задаются отдельно для некоторых модулей, включая формулы и OCR. Увеличение batch size повышает загрузку GPU, но расходует больше видеопамяти и может ухудшить задержку одного документа. Для сервиса с короткими интерактивными запросами важна малая задержка; для ночной обработки коллекции — суммарная скорость. Подбирайте размер на реальных страницах, поскольку количество текстовых строк и формул меняется сильнее, чем число входных изображений.

CPU, GPU и движки инференса

Устройство выбирается параметром device. CPU подходит для проверки, небольшого набора и облегчённых моделей; GPU заметно ускоряет крупные модели макета, OCR, таблиц и формул. Наличие видеокарты само по себе не гарантирует запуск: должны совпадать драйвер, сборка вычислительного фреймворка и поддерживаемая сборка CUDA. Перед анализом полного PDF выполните короткий тест и убедитесь, что в журнале действительно выбран GPU, а не произошло незаметное переключение на CPU.

По умолчанию модули используют подходящий движок Paddle: статический там, где модель его поддерживает, и динамический для остальных. В качестве альтернативы можно выбрать Transformers или ONNX Runtime, но поддержка отдельных моделей различается. Для ONNX Runtime документация требует отключить распознавание формул в сценариях, где соответствующие модели ещё не поддержаны. Поэтому смена движка должна сопровождаться проверкой полного набора включённых функций, а не только успешным запуском первой страницы.

Высокопроизводительный режим, TensorRT, MKL-DNN и число потоков могут ускорить обработку, но добавляют ограничения. Некоторые модели таблиц или формул не работают с определённым ускорителем и переключаются на базовый механизм. Если после включения оптимизации результат изменился или появилась ошибка формы тензора, сначала повторите страницу в обычном режиме. Совпадение результата важнее выигрыша скорости; оптимизацию включают по одному параметру и закрепляют контрольными тестами.

На CPU следите за количеством потоков и параллельных процессов. Если каждый процесс создаёт много вычислительных потоков, система начинает тратить время на переключения и конкурировать за память. Для пакетной очереди часто эффективнее ограничить потоки одного процесса и запустить несколько рабочих процессов по числу доступных ядер. Конкретное соотношение зависит от моделей и размера страниц, поэтому измеряйте страницы в секунду и пиковую память одновременно.

Память, скорость и обработка больших документов

Пиковый расход памяти определяется не только размером PDF, а разрешением отрисованной страницы, числом найденных областей и набором включённых моделей. Страница формата A3 с мелким текстом может быть тяжелее десятка простых страниц A4. Если процесс завершается без понятной ошибки, сначала уменьшите число одновременно обрабатываемых страниц, отключите диаграммы и печати, выберите более лёгкую модель макета и проверьте масштаб входного изображения.

Итерирование по результатам PDF помогает не хранить все страницы сразу. После сохранения страницы удаляйте крупные изображения и не добавляйте объекты результата в бесконечный список. Для единого Markdown достаточно накапливать компактные словари и необходимые ресурсы. Если изображения Markdown крупные, сохраняйте их сразу на диск, а в памяти оставляйте только пути. Такой поток снижает риск, что длинный документ заполнит оперативную память к концу обработки.

Скорость нужно измерять после прогрева. Первый запуск включает загрузку моделей, компиляцию графа и создание кэшей, поэтому он не отражает обычную задержку. Выполните несколько одинаковых страниц, исключите время скачивания и отдельно запишите предобработку, инференс и постобработку, если доступен подробный benchmark. Это помогает понять, даст ли эффект более быстрая OCR-модель или узкое место находится в рендеринге PDF и сохранении изображений.

Если коллекция содержит простые и сложные документы, используйте двухступенчатую очередь. Лёгкая конфигурация быстро обрабатывает стандартные формы; страницы с низкой уверенностью, большим числом формул или нестабильной структурой переходят в точную конфигурацию. Такой маршрут экономит ресурсы без безусловного снижения качества. Критерии повторной обработки должны быть прозрачными: доля низкоуверенных строк, отсутствие обязательной таблицы, нарушение ожидаемого числа колонок или слишком много пересекающихся блоков.

Практический сценарий: научные статьи

Для научной статьи включают таблицы и формулы, оставляют восстановление порядка чтения и подбирают модель макета, устойчивую к двум колонкам. На контрольной странице должны присутствовать название, аннотация, основной текст, рисунок с подписью, отдельная и встроенная формула, сноска и список литературы. Если такая страница разобрана верно, вероятность успешной обработки однотипного сборника выше, чем при тесте на простой титульной странице.

После распознавания формируют единый Markdown, но изображения и формулы сохраняют как отдельные связанные объекты. Для поиска текст делят по заголовкам и абзацам, а подпись рисунка присоединяют к описанию изображения. Формулу не стоит превращать в обычные слова: храните разметку и фрагмент страницы, чтобы пользователь мог сверить знак, индекс и степень. Список литературы можно пометить отдельным типом и не смешивать с содержательными чанками основного текста.

Контроль порядка чтения обязателен. На двух колонках последняя строка левой колонки должна предшествовать первой строке правой, а подпись рисунка — располагаться рядом с соответствующим изображением. Если порядок нарушается только на страницах с широким рисунком, проверьте рамку рисунка и соседние текстовые блоки: широкая область может ошибочно разделить страницу на верхнюю и нижнюю части. Исправление детекции обычно надёжнее ручной перестановки строк по координате X.

Практический сценарий: договоры и акты

В договоре важны заголовки, нумерованные пункты, реквизиты, таблицы, подписи и печати. Распознавание печати включают только там, где её текст нужен для маршрутизации или сверки. Сам оттиск сохраняют изображением. Для нумерованных пунктов полезна проверка последовательности: пропуск номера может означать, что короткая строка потеряна, а повтор номера — что колонтитул или перекрёстная ссылка ошибочно попали в основной поток.

Реквизиты часто оформлены двумя колонками без явной таблицы. Модель макета может представить их как отдельные текстовые блоки или таблицу без линий. Оба варианта допустимы, если сохраняется связь названия поля со значением. В последующей обработке не полагайтесь только на порядок строк: используйте координаты и словари ожидаемых меток, например обозначения банковских данных, адреса и идентификаторов. Значения с контрольной длиной проверяйте регулярными правилами, но не исправляйте автоматически без сохранения исходного варианта.

Для юридически значимого фонда результат распознавания является производной копией. Храните исходный PDF неизменным, вычисляйте его контрольную сумму и связывайте с JSON по идентификатору. Любое ручное исправление должно создавать новый вариант результата с журналом изменений. Такая дисциплина позволяет использовать распознанный текст для поиска и аналитики, не выдавая его за оригинал документа.

Практический сценарий: счета и формы

Счёт обычно сочетает шапку, реквизиты, табличную часть, итоги и примечания. Сначала проверьте, что табличная область не захватывает верхние реквизиты и нижний текст. Затем валидируйте строки: количество, цена и сумма должны быть числами, а итог должен согласовываться с детализацией с учётом налогов и округления. Несогласованность не всегда означает ошибку OCR, но точно указывает страницу для проверки.

Однотипные формы позволяют сильнее оптимизировать конфигурацию. Если положение полей стабильно, после общего анализа можно сопоставлять блоки с ожидаемыми зонами и быстро выявлять смещение скана. Однако жёсткие координаты нельзя использовать без нормализации по ширине и высоте: разные сканеры добавляют поля и меняют DPI. Сначала исправляют ориентацию и перспективу, затем переводят рамки в относительные координаты.

Для рукописных пометок и подписей возможности обычной текстовой модели ограничены. Их лучше сохранять как изображения и помечать отдельными областями, если класс макета это позволяет. Попытка обязательного OCR каждой подписи создаёт ложные строки, которые могут попасть в поиск или автоматическое заполнение. В критическом процессе неизвестное значение должно оставаться неизвестным и направляться оператору, а не заменяться наиболее похожей последовательностью символов.

Практический сценарий: книги и старые сканы

Фотографии книг требуют исправления кривизны, поворота и неравномерных полей. Разворот лучше предварительно разделить на две страницы, если центральный сгиб заметно деформирует строки и смешивает порядок чтения. После разделения модуль выравнивания работает с каждой страницей отдельно. Для старой бумаги полезна умеренная коррекция контраста, но агрессивная бинаризация может уничтожить тонкие штрихи и диакритические знаки.

Колонтитулы, номера страниц и примечания следует сохранять в JSON, даже если они исключаются из Markdown. Номер страницы помогает сопоставить цитату с оригиналом, а примечание может содержать важное содержание. Параметр markdown_ignore_labels позволяет исключить выбранные классы из итогового текста без удаления самих детекций. Это предпочтительнее необратимой фильтрации на раннем этапе.

Для дореформенной орфографии, редких шрифтов и нестандартных алфавитов базовая модель может давать систематические ошибки. Сначала соберите размеченную выборку и измерьте типы ошибок. Словарная постобработка исправляет только предсказуемые замены и способна испортить имена собственные. Если коллекция велика, разумнее дообучить распознаватель на реальных строках и затем повторно прогнать контрольные страницы, сохранив сравнение до и после.

Развёртывание как сервис

Конвейер можно обернуть в сервис и вызывать из приложений на разных языках. Запрос передаёт файл или адрес документа и флаги модулей, ответ возвращает структурированный результат и при необходимости визуализации. Сервисный слой должен ограничивать размер файла, число страниц, время обработки и допустимые форматы. Без ограничений один огромный PDF способен занять рабочий процесс и задержать всю очередь.

Типовая реализация обрабатывает один запрос на экземпляр в каждый момент времени. Для параллелизма запускают несколько реплик или используют поддерживаемый режим параллельного инференса. Нельзя просто создать десятки потоков вокруг одного набора GPU-моделей: это может привести к конкуренции за видеопамять и непредсказуемой задержке. Нагрузочное тестирование должно включать разные размеры страниц и смешанные функции, а не только одинаковые короткие запросы.

Клиентам на Python, TypeScript, Go или другом языке лучше отдавать стабильную собственную схему, а внутренний JSON конвейера сохранять как диагностический слой. Так обновление библиотек не заставит одновременно менять все приложения. В контракте сервиса явно укажите единицы координат, нумерацию страниц, кодировку текста, способ передачи изображений и поведение при частичном сбое одной страницы.

Для конфиденциальных документов контролируйте, куда записываются временные файлы и модели. Автоматическая загрузка весов обращается к внешнему хранилищу, поэтому в изолированной среде модели заранее размещают во внутреннем репозитории. Журналы не должны содержать полный распознанный текст, если он включает персональные или коммерческие данные. Достаточно идентификатора задания, страницы, времени, параметров и технической ошибки.

Дообучение и замена отдельных модулей

PP-Structure позволяет дообучать отдельные компоненты на собственных данных: макет, OCR, таблицы, формулы и другие поддерживаемые модули. Это полезно, когда ошибки повторяются на устойчивом типе документов: фирменные формы, редкий шрифт, особая таблица или нестандартные подписи. Дообучение не начинают с нескольких случайных страниц; сначала определяют метрику и собирают репрезентативные примеры, включая сложные отрицательные случаи.

Для макета разметка должна точно отражать классы и границы. Если аннотаторы по-разному решают, включать ли подпись в рисунок или выделять отдельно, модель выучит противоречивое правило. Создайте инструкцию с примерами, проверяйте пересечения рамок и распределение классов. Редкий класс нельзя оценивать общей точностью: нужны полнота и ошибки именно по нему, иначе улучшение частого текста скроет исчезновение печатей или формул.

После обучения пользовательскую модель подключают через каталог и прогоняют той же контрольной выборкой, что и базовую. Сравнивайте не только метрику модуля, но и итоговый Markdown или JSON. Более точная рамка таблицы может неожиданно ухудшить порядок чтения, если меняется её пересечение с соседним текстом. Интеграционный тест должен охватывать весь конвейер от изображения до конечного формата.

Контроль качества и приёмка результата

Хорошая проверка сочетает визуальные, структурные и предметные правила. Визуализация отвечает, найден ли нужный объект и верна ли рамка. Структурная проверка контролирует допустимые классы, координаты внутри страницы, отсутствие невозможных пересечений и связность порядка чтения. Предметная проверка знает, что в форме ожидается таблица, сумма, дата или определённый заголовок. Ни один слой не заменяет остальные.

  • Проверяйте, что координаты каждой области не выходят за ширину и высоту страницы.
  • Отмечайте страницы без текста, если по типу документа текст на них ожидается.
  • Сравнивайте число таблиц, формул и рисунков с контрольной выборкой.
  • Выделяйте строки с низкой уверенностью и подозрительными повторениями символов.
  • Контролируйте последовательность заголовков, пунктов и номеров страниц.
  • Сохраняйте визуализацию рядом с JSON для быстрой ручной сверки.

Для регрессионного теста выберите небольшой набор трудных страниц и сохраните эталонные признаки: текст ключевых полей, классы основных областей, число таблиц, координаты с допустимым отклонением и несколько критических формул. Побайтовое сравнение всего JSON слишком строго: небольшое изменение оценки или рамки не всегда ухудшает результат. Проверка должна различать существенные и косметические отклонения.

Ручная выборочная проверка остаётся необходимой. При большом фонде используйте стратифицированную выборку: разные годы, сканеры, языки, типы форм, качество бумаги и число страниц. Случайные десять документов могут случайно оказаться простыми. Отдельно просматривайте все случаи, которые автоматические правила пометили как подозрительные, и часть уверенных результатов для оценки пропущенных ошибок.

Типичные ошибки и способы устранения

Команда не находится или модуль не импортируется

Если оболочка не находит paddleocr, проверьте, что активировано нужное окружение Python и каталог исполняемых файлов находится в PATH. При ошибке импорта PPStructureV3 убедитесь, что установлен набор зависимостей для разбора документов, а не только минимальное OCR-ядро. Команда python -m pip show paddleocr должна указывать то же окружение, из которого запускается скрипт.

Модели не загружаются

Ошибка загрузки часто связана с недоступным хранилищем моделей, прокси, сертификатом или неполным файлом в кэше. Удалите только повреждённый каталог конкретной модели и повторите загрузку, не очищая весь кэш без необходимости. В закрытой сети скачайте веса на машине с доступом, проверьте контрольную сумму и передайте явный каталог. Если канал загрузки можно выбирать параметром, используйте доступное официальное зеркало и зафиксируйте выбор в конфигурации.

Процесс завершается из-за памяти

Сначала уменьшите пакетный размер, выключите диаграммы, печати и ненужную предобработку, затем выберите более лёгкие модели. Обрабатывайте PDF постранично и немедленно сохраняйте результат. На GPU проверьте, не занята ли видеопамять другим процессом; на CPU — не создаёт ли очередь слишком много параллельных работников. Уменьшение разрешения допустимо только после проверки мелкого текста и формул.

Текст читается в неправильном порядке

Откройте визуализацию макета и порядка чтения. Если рамка одного блока охватывает две колонки, корректируйте порог, расширение и объединение областей. Если рамки раздельны, но последовательность неверна, используйте геометрию и классы для собственного правила сортировки проблемного шаблона. Не сортируйте все блоки только по Y: две колонки требуют учёта горизонтальных зон и широких элементов, пересекающих страницу.

Таблица превращается в обычный текст

Убедитесь, что включено распознавание таблиц и область получила класс таблицы. Если класс неверен, проблема относится к макету; если класс верен, но структура не строится, проверьте классификацию линованного и безлинейного типа, качество границ и выбранные модели ячеек. Для фото исправьте перспективу. Сохраните вырезанную область и запустите табличный конвейер отдельно, чтобы отделить ошибку поиска области от ошибки структуры.

Формулы пропущены или повреждены

Проверьте, что модуль формул включён и поддерживается выбранным движком. Увеличьте качество исходного изображения, уточните рамки и исключите соседний текст. Если пропадают только встроенные формулы, модель макета может относить их к обычной строке; тогда нужна более подходящая модель или последующая эвристика. Ошибка визуального рендеринга LaTeX не означает, что строка разметки отсутствует: проверяйте эти этапы отдельно.

Результаты перезаписываются

Передавайте каталог в методы сохранения для PDF и формируйте уникальные имена из идентификатора документа, номера страницы и типа результата. Один путь к изображению в save_to_img() может оставить только последнюю визуализацию. Аналогично несколько таблиц требуют отдельных имён. После завершения задания проверяйте ожидаемое число файлов и отсутствие одинаковых путей в журнале.

Как подобрать конфигурацию без лишних экспериментов

  1. Определите обязательные элементы: текст, таблицы, формулы, печати, диаграммы и порядок чтения.
  2. Соберите 20–50 страниц, охватывающих самые разные и самые трудные документы.
  3. Запустите базовую конфигурацию и сохраните JSON, Markdown и все визуализации.
  4. Разделите ошибки по этапам: предобработка, макет, OCR, таблица, формула или постобработка.
  5. Меняйте за один тест только один параметр или одну модель и записывайте результат.
  6. После улучшения выполните регрессионный прогон по всей выборке, а не по одной странице.
  7. Зафиксируйте конфигурацию, имена моделей, окружение и контрольные признаки в проекте.

Такой порядок не позволяет случайному улучшению одной страницы скрыть ухудшение остальных. Например, снижение порога макета может вернуть сноску и одновременно создать десятки ложных блоков на страницах с фоном. Сводная таблица по типам ошибок покажет компромисс. Для производственного решения выбирают конфигурацию, которая выполняет обязательные требования и предсказуемо маркирует сомнительные случаи, а не ту, что визуально идеальна на одном демонстрационном PDF.

Сравнение PP-Structure с аналогами

ПрограммаЛучше подходит дляГлавное ограничение
PP-StructureРазбора макета, OCR, таблиц, формул, печатей и координат блоков в одном настраиваемом конвейереТребует настройки Python и моделей
MinerUПреобразования сложных научных и офисных документов в Markdown и JSON для RAGТяжёлые зависимости и модели
MarkerБыстрого преобразования PDF и других форматов в Markdown, JSON, HTML и чанкиКачество сложных страниц зависит от выбранного режима и моделей
DoclingЕдиного разбора большого числа офисных и издательских форматов в структурированный документДля узких OCR-сценариев нужна дополнительная настройка
UnstructuredПодготовки разнородных файлов к индексации и разделению на элементыНе ориентирован на точное восстановление сложной верстки

PP-Structure выбирают, когда нужны координаты, управляемые модули макета и отдельная работа с таблицами, формулами, печатями или диаграммами. MinerU удобен для быстрого документного парсинга научных материалов, Marker — для гибкого преобразования и постобработки Markdown, Docling — для унификации множества входных форматов, а Unstructured — для построения общего конвейера загрузки и разбиения контента. Перед выбором прогоните одинаковый набор страниц и сравните не только текст, но и таблицы, порядок чтения, ресурсы и удобство интеграции.

Ограничения, которые важно учитывать

Отдельной панели, где пользователь перетаскивает блоки и вручную редактирует страницу, нет: управление выполняется параметрами, конфигурацией и кодом, а визуализации служат для проверки. Для команды без опыта Python потребуется заранее настроенный скрипт или внутренний интерфейс. Это не недостаток алгоритма распознавания, но существенная часть внедрения: нужно продумать загрузку файлов, очередь, просмотр сомнительных областей и экспорт результатов.

Точная модель макета и дополнительные распознаватели требуют заметных ресурсов. На CPU они работают, но пакет из сложных страниц может обрабатываться медленно; GPU желателен для регулярного потока и низкой задержки. Объём весов растёт при включении таблиц, формул, печатей и особенно диаграмм. Перед развёртыванием оцените место на диске, оперативную и видеопамять, а также время холодного запуска.

Результат зависит от качества страницы и соответствия моделей документу. Сильная перспектива, смаз, тени, низкое разрешение, декоративный фон, рукописный текст и необычная верстка увеличивают ошибки. Ни один параметр не исправляет все случаи одновременно. Надёжный процесс сочетает предобработку, выбор моделей, автоматические проверки и ручную сверку критических данных.

Экспорт в Markdown или Word восстанавливает содержание и логическую структуру, но не гарантирует пиксельного совпадения с PDF. Если задача состоит в точном визуальном редактировании страниц, нужен PDF-редактор; если требуется извлечь структуру, координаты и данные для автоматизации, PP-Structure решает другой класс задач. Правильное разделение целей предотвращает ожидание функций, которых в конвейере нет.

Координаты блоков и связь с исходной страницей

Координаты — одно из главных отличий структурного разбора от обычного извлечения текста. Каждый прямоугольник задаёт положение элемента на странице и позволяет построить интерфейс сверки: пользователь нажимает на абзац в Markdown и видит соответствующий фрагмент PDF, либо выбирает рамку на изображении и получает распознанное значение. Для этого храните идентификатор документа, индекс страницы, ширину, высоту и координаты в одной системе отсчёта.

Если изображения масштабируются для показа, координаты пересчитывают пропорционально ширине и высоте. Нельзя умножать обе оси на один коэффициент, когда предпросмотр изменил соотношение сторон или добавил поля. Надёжнее вычислить отдельные коэффициенты X и Y и учитывать смещение изображения внутри контейнера. Для обрезанного фрагмента дополнительно прибавляют координаты его левого верхнего угла на исходной странице.

Пересечения рамок помогают обнаружить ошибки. Небольшое пересечение подписи с рисунком допустимо, а почти полное наложение двух текстовых блоков обычно указывает на дубликат. Для сравнения используют долю пересечения относительно площади меньшего блока, а не только абсолютное число пикселей. Правило следует применять по классам: таблица закономерно содержит ячейки, но два независимых абзаца не должны занимать одно место.

При сохранении координат в базе данных используйте числа без преждевременного округления. Для поиска и отображения удобно дополнительно хранить нормализованные значения от 0 до 1. Абсолютные пиксели нужны для точного вырезания исходника, относительные — для сравнения страниц разных размеров. Оба представления должны ссылаться на одну и ту же версию предобработанного изображения, иначе рамка после выравнивания не совпадёт с оригиналом до коррекции.

Многоязычные документы и смешанные алфавиты

В одном PDF могут встречаться русский основной текст, английские термины, китайские подписи и формулы. Выбор единственной языковой модели в таком случае является компромиссом. Сначала определите, какие языки критичны: если иностранные фрагменты редки и служат иллюстрацией, основную модель выбирают по доминирующему языку. Если каждый язык важен, страницы или блоки направляют в разные распознаватели и объединяют по координатам.

Язык можно определять на уровне страницы по нескольким уверенным строкам, но короткие фрагменты дают ненадёжный результат. Заголовок из трёх слов, артикул или имя собственное легко классифицировать неправильно. В смешанном документе полезно сначала применить универсальную модель, затем повторно распознать низкоуверенные области специализированной моделью и выбрать вариант по оценке, допустимым символам и словарю предметной области.

Смешение похожих символов особенно опасно для кодов: латинская C и кириллическая С, O и О, P и Р выглядят одинаково, но имеют разные коды Unicode. После OCR нормализуйте строки только в полях, где известен ожидаемый алфавит. Для свободного текста автоматическая замена может испортить иностранные слова. В JSON сохраняйте исходный результат, нормализованное значение и правило, которое было применено.

Направление письма также влияет на постобработку. Для языков справа налево нельзя восстанавливать строку простой сортировкой символов по X. Доверяйте языковой модели и её порядку, а геометрию используйте для блоков, а не для перестановки отдельных знаков. Вертикальный текст требует соответствующего распознавателя или ориентации строки. Проверяйте многоязычный сценарий на реальных страницах, а не на отдельных чистых фразах.

Подготовка входных файлов

Лучший способ повысить качество — передать читаемое изображение. Для скана выбирайте разрешение, при котором строчные символы и знаки препинания различимы без сильного увеличения. Слишком низкое разрешение уничтожает детали, а чрезмерное увеличивает память и время без гарантии улучшения. Контрольная страница с самым мелким шрифтом помогает определить достаточный DPI для всей коллекции.

JPEG с сильным сжатием создаёт квадраты и ореолы вокруг букв. Если оригинал доступен в TIFF или PNG, используйте его для распознавания и создавайте JPEG только для предпросмотра. Повторное сохранение JPEG ухудшает изображение на каждом шаге. Для цифрового PDF рендерьте страницу сразу в нужном масштабе, не создавая промежуточную уменьшенную картинку.

Поля и фон влияют на макет. Большая чёрная рамка от сканера может восприниматься как графическая область, а просвечивающий текст обратной стороны — как слабые строки. Обрезайте постоянные технические поля, но оставляйте реальные колонтитулы и номера страниц, если они нужны для сопоставления. Фильтр фона проверяйте на тонких символах: агрессивное удаление шума часто стирает точки, запятые и элементы формул.

Страницы разного размера не нужно насильно приводить к одной ширине, если конвейер корректно получает исходные размеры. Масштабирование полезно для ограничения максимальной стороны, но должно сохранять пропорции. После изменения размера координаты относятся к новой картинке, поэтому храните параметры преобразования. Для PDF удобнее фиксировать масштаб рендеринга и версию библиотеки, чтобы повторная обработка давала сопоставимую геометрию.

Повреждённые и защищённые PDF следует выявлять до запуска моделей. Попытка открыть каждую страницу должна вернуть ожидаемое число страниц и ненулевое изображение. Если документ требует пароль, система должна сообщить это явно, а не создавать пустой результат. Входные файлы с огромным числом страниц, нестандартным размером или вложенными объектами отправляйте в отдельную очередь с более строгими лимитами.

Постобработка текста без потери доказательности

OCR-текст часто требует нормализации пробелов, переносов и символов. Выполняйте её после сохранения исходного результата. Удаление переноса в конце строки допустимо, когда слово продолжается на следующей строке, но дефис может быть частью термина или номера. Правило должно учитывать словарь, регистр, координаты и конец абзаца. Для сомнительного случая лучше оставить исходную форму и пометить её, чем незаметно склеить два разных слова.

Повторяющиеся колонтитулы можно обнаружить сравнением текста и положения на многих страницах. Блок, который находится у верхнего края и почти одинаков на большей части документа, вероятно, является заголовком страницы. Исключайте его из Markdown через классы или постобработку, но сохраняйте в JSON. Однократная строка в той же зоне может быть настоящим заголовком раздела, поэтому правило по одной странице ненадёжно.

Номера страниц полезно отделять от содержания, однако они помогают проверять порядок и пропуски. Сравните распознанный номер с индексом PDF и зафиксируйте расхождения: документ может начинаться с обложки без номера, использовать римские цифры или содержать вставки. Автоматическое назначение имён страниц по распознанному номеру опасно без проверки, поскольку одна ошибка создаст дубликат или нарушит последовательность.

Для таблиц не исправляйте числовые значения только потому, что сумма не сходится. Ошибка может находиться в налоге, округлении или исходном документе. Система должна показать противоречие и предложить фрагмент страницы. Автоматическая коррекция допустима только для технической нормализации, например замены неразрывного пробела в числе, и обязана хранить исходную строку и правило преобразования.

Построение поиска и RAG по результатам

Markdown удобно разделять на фрагменты по заголовкам, но длина чанка должна учитывать таблицы и формулы. Нельзя разрезать таблицу посередине строки или отделять подпись от рисунка. Для каждого фрагмента сохраняйте документ, страницу, диапазон координат, путь заголовков и типы вложенных элементов. Тогда поисковый ответ можно показать вместе с точным местом в исходнике.

Таблицы индексируют двумя представлениями: компактным текстовым описанием и структурой строк и столбцов. Текст помогает семантическому поиску, структура — точному ответу по значениям. Заголовки столбцов повторяют рядом с каждой группой строк, иначе отдельный чанк теряет смысл. Слишком большая таблица разбивается по строкам с сохранением общего заголовка и идентификатора таблицы.

Формулы следует хранить как разметку и, при необходимости, как текстовое окружение. Поиск по одной строке LaTeX может быть слабым, если запрос сформулирован словами. Добавьте заголовок раздела, предложение до и после формулы и распознанный номер. При показе ответа обязательно предоставляйте изображение исходной области, потому что небольшая OCR-ошибка в формуле может существенно изменить смысл.

Качество RAG зависит от порядка чтения. Если колонки смешаны, векторный поиск получит фразы, которых не было в документе. До индексации проверяйте связность абзацев: резкие переходы языка, незавершённые предложения и повтор заголовков сигнализируют о неверном порядке. Лучше исключить одну сомнительную страницу из автоматического индекса и отправить на повторную обработку, чем распространить ошибочную последовательность по множеству чанков.

Воспроизводимость и обновление окружения

Для воспроизводимого результата фиксируют пакет Python, вычислительный фреймворк, имена и контрольные суммы моделей, движок, конфигурацию и параметры рендеринга PDF. Одного списка библиотек недостаточно, если модели загружаются автоматически и могут измениться в кэше. Создайте манифест задания и сохраняйте его рядом с JSON. Это позволяет повторить обработку и объяснить различия между двумя запусками.

Перед обновлением окружения выполните контрольную выборку и сохраните показатели: число блоков по классам, ключевой текст, таблицы, формулы, время и память. После обновления сравните существенные изменения. Улучшение средней точности не гарантирует сохранность редкого класса; например, новый макет может лучше выделять текст и хуже находить печати. Решение о переходе принимают по требованиям проекта.

Кэш моделей должен быть управляемым. Не разрешайте нескольким процессам одновременно загружать один и тот же большой файл в общий каталог без блокировки: частичный файл может быть принят за завершённый. Загрузка выполняется отдельным шагом, затем проверяется наличие ожидаемых файлов и запускается короткое предсказание. В контейнере модели разумно помещать в отдельный слой или подключаемый том, чтобы перезапуск сервиса не повторял скачивание.

Журнал запуска должен быть достаточным для диагностики и не содержать лишних данных документа. Записывайте идентификатор, страницу, активные модули, модель, устройство, длительность и технические предупреждения. Полный текст и изображения сохраняйте в защищённом хранилище результата, а не в общем журнале. Срок хранения производных файлов и временных изображений задаётся правилами проекта.

Автоматическое направление сложных страниц

Не все страницы требуют одинакового набора моделей. Титульный лист может содержать только заголовок и изображение, основная часть — две колонки и формулы, приложение — большие таблицы. Первый проход с макетом определяет тип страницы, после чего система включает нужные распознаватели. Такая маршрутизация уменьшает время, но должна иметь безопасное правило: неизвестный или неоднозначный тип направляется в более полный режим, а не в урезанный.

Признаки маршрута могут включать классы областей, долю графики, число строк, наличие крупной таблицы и уверенность макета. Не используйте распознанные слова как единственный критерий: ошибка OCR в заголовке не должна отключить формулы на всей странице. Лучше объединить несколько независимых признаков и периодически проверять выборку страниц каждого маршрута.

Повторный проход применяют только к проблемной области, когда API и конфигурация позволяют подать вырезанный фрагмент. Например, сомнительную таблицу можно распознать отдельным табличным конвейером, а низкоуверенную строку — другой языковой моделью. При объединении результата сохраняйте исходные координаты: к координатам внутри вырезки прибавляется смещение области на странице.

Маршрутизация должна быть наблюдаемой. Для каждой страницы записывайте, какие модули были включены и почему. Если оператор сообщает о пропущенной формуле, по журналу должно быть видно, что модель макета не нашла формульную область или правило ошибочно отключило модуль. Без такой информации система превращается в непрозрачный набор условий, который трудно улучшать.

Итоговый рабочий процесс

Практичная схема начинается с контрольной выборки и минимального набора модулей. Сначала исправляют ориентацию только там, где она действительно нарушена, затем проверяют макет и порядок чтения, после чего настраивают язык OCR. Таблицы, формулы, печати и диаграммы добавляют по одной функции, каждый раз сохраняя визуализации и структурированный результат. Такой порядок быстро показывает, какой этап создаёт ошибку и сколько ресурсов он добавляет.

После настройки конфигурацию фиксируют, модели размещают в предсказуемых каталогах, а обработку выполняют постранично с уникальными именами результатов. JSON используют для интеграции и контроля, Markdown — для чтения и индексации, Word — для ручной правки, HTML и XLSX — для таблиц. Исходный документ, контрольная сумма, параметры и журнал ошибок остаются связаны с каждой производной копией.

PP-Structure особенно полезен там, где простого OCR недостаточно: в двухколоночных статьях, отчётах с таблицами и диаграммами, договорах с печатями, книгах с деформированными страницами и наборах документов для поиска. Его сильная сторона — возможность видеть и настраивать отдельные этапы, а не получать один непрозрачный текст. При корректной проверке результат превращается в воспроизводимый массив структурированных данных, а сомнительные места остаются обнаруживаемыми и доступными для сверки.