Dmitry Mikhailov

Все статьи
Дмитрий Михайлов6 мин чтения

PDF перемешал колонки: как извлечь текст и сохранить смысл

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

Раскрытая книга с серебристыми страницами и чёрной лаковой обложкой

Проверьте связи до пересказа

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

На экране документ может выглядеть безупречно. Слева один проект, справа другой; отступы и заголовки показывают границы. После извлечения эти подсказки могут исчезнуть. Фраза «Проект А Проект Б» ещё содержит оба названия, но уже не задаёт последовательность дальнейшего чтения.

Поэтому полезный критерий — сохранить связи: к какому проекту относится дата, к какой строке относится сумма, какое условие продолжает предложение. Простая проверка «все слова нашлись» этого не доказывает. Ошибка особенно неприятна, когда итоговый текст грамматически правильный: читать его удобно, а основание для решения уже изменилось.

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

Учебная страница показывает конкретную ошибку

В приложении к статье находится страница размером 600 × 420 пунктов с двумя независимыми колонками. Проект А расположен слева: черновик 20 октября, проверка 21 октября, сдача 22 октября. Справа проект Б со сроками 23, 24 и 25 октября. Одинаковая высота строк специально делает горизонтальное объединение заметным.

В сохранённом файле pdf-whole.txt начало выглядит так: «Проект А Проект Б». Следующая строка объединяет оба срока черновика. В pdf-columns.txt сначала идут название и все три даты проекта А, затем полный блок проекта Б. Это приложенные результаты учебного извлечения, а не сравнительный тест AI-сервисов.

В README показаны два способа через pdfplumber: page.extract_text() для всей страницы и отдельное чтение областей (0, 0, 300, 420) и (300, 0, 600, 420). Здесь координата 300 соответствует известной границе между колонками. Полный текст каждого блока можно сверить с исходной страницей: должны сохраниться шесть дат и их назначения.

Таблица ниже сопоставляет именно эти два результата. Из неё нельзя вывести правило «любой PDF нужно делить пополам». В другом документе колонок может быть три, одна окажется шире другой, а общий заголовок или таблица пересекут предполагаемую границу. Рабочий способ должен учитывать устройство конкретных страниц.

Как изменился порядок на учебной странице
2 / 2
СпособНачало результатаЧто проверить
Вся страницаПроект А Проект БСоседние колонки соединены
Левая область, затем праваяПроект А → его три даты → Проект БВсе даты остались у своего проекта

Почему выделение текста зависит от структуры PDF

Инструменту нужно определить порядок символов и слов. В документации pdfplumber описаны координаты элементов, выделение области crop и настройки extract_text. Расстояния между символами участвуют в формировании пробелов и строк; доступ к геометрии помогает управлять извлечением, но не заменяет понимание документа.

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

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

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

Как проверить страницу вручную

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

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

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

Отмечайте сомнительные места прямо в рабочей выписке. Лучше оставить «связь примечания со строкой неясна, страница 4», чем выбрать правдоподобный вариант молча. Такая пометка даёт следующему человеку точное место проверки. Уверенное предложение без ссылки на страницу заставит его заново искать источник ошибки во всём файле.

Сначала определите формат результата

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

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

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

После получения ответа откройте исходник и сверьте каждое поле контрольной страницы. В учебном примере проект А должен сохранить даты 20, 21 и 22 октября, проект Б — 23, 24 и 25 октября. Извлечение считается пригодным, когда совпали и значения, и их назначения. Красивое оформление ответа дополнительного доказательства не даёт.

Когда можно обрабатывать весь документ

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

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

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

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

Прочитать с ИИ

Разберите главную мысль и примените её к своей задаче.

ChatGPTClaude
Посмотреть промпт
Прочитай статью «PDF перемешал колонки: как извлечь текст и сохранить смысл»: https://dmitrymikhailov.com/insights/pdf-reading-order Объясни её основную мысль и назови конкретные примеры, на которых держатся выводы. Отдели факты статьи от своих предположений. Затем спроси, какую задачу я решаю, и помоги применить подход из статьи: предложи первый шаг и способ проверить результат. Если страница недоступна, попроси меня вставить текст. Не придумывай её содержание.