Большинство экстракторов PDF используют неверный API

Большинство инструментов для работы с PDF используют неверный источник данных.

Когда разработчики говорят об извлечении данных из PDF, они обычно имеют в виду getTextContent(). Этот метод предоставляет текстовые элементы и их координаты. Он является стандартом де-факто почти для всех инструментов, работающих на стороне браузера.

Но getTextContent() — это обработанное представление. Это упрощенная версия того, что доступно на самом деле.

В PDF.js существует три уровня данных:

getStructTree(): этот метод говорит о смысле документа. Он содержит таблицы, заголовки и формулы. • getOperatorList(): этот метод говорит о том, что рисует документ. Он включает линии, пути и фигуры. • getTextContent(): это отфильтрованное представление того, что рисует документ.

Большинство инструментов используют третий вариант. Это подходит для 80% документов, таких как простые отчеты. Однако этот метод не справляется с научными статьями и сложными публикациями.

Использование только getTextContent() создает четыре основные проблемы:

  • Вы теряете структуру таблиц. Вам приходится угадывать расположение ячеек, основываясь на позициях текста.
  • Вы ломаете математические уравнения. Уравнения LaTeX часто отображаются как единые гигантские текстовые блоки.
  • Вы пропускаете разделительные линии колонок. Во многих макетах для разделения колонок используются реальные линии. В текстовом контенте этих линий нет.
  • Вы получаете неверный порядок чтения. Текст часто появляется в том порядке, в котором он был отрисован, а не в том, в котором его читает человек.

Правильный способ создания PDF-процессора — это трехуровневая система:

  1. Сначала проверьте getStructTree(). Если у документа есть логическая структура, используйте её, чтобы сразу найти таблицы и заголовки.
  2. Затем проверьте getOperatorList(). Используйте явные линии и пути, чтобы найти границы колонок.
  3. Используйте getTextContent() в качестве резервного варианта. Применяйте геометрические вычисления только тогда, когда первые два уровня не предоставляют данных.

Этот подход не требует больше работы. Уровни 1 и 2 работают как «быстрые выходы». Если документ хорошо структурирован, вы пропускаете сложные математические вычисления. Вы прибегаете к сложному логическому выводу только тогда, когда документ не размечен.

Такая архитектура справляется как с простыми корпоративными файлами, так и со сложными научными работами.

Источник: https://dev.to/bonzai2carn/most-pdf-extractors-use-the-wrong-api-heres-what-we-built-instead-5dgh