Большинство экстракторов PDF используют неверный API
Большинство инструментов для работы с PDF используют неверный источник данных.
Когда разработчики говорят об извлечении данных из PDF, они обычно имеют в виду getTextContent(). Этот метод предоставляет текстовые элементы и их координаты. Он является стандартом де-факто почти для всех инструментов, работающих на стороне браузера.
Но getTextContent() — это обработанное представление. Это упрощенная версия того, что доступно на самом деле.
В PDF.js существует три уровня данных:
• getStructTree(): этот метод говорит о смысле документа. Он содержит таблицы, заголовки и формулы.
• getOperatorList(): этот метод говорит о том, что рисует документ. Он включает линии, пути и фигуры.
• getTextContent(): это отфильтрованное представление того, что рисует документ.
Большинство инструментов используют третий вариант. Это подходит для 80% документов, таких как простые отчеты. Однако этот метод не справляется с научными статьями и сложными публикациями.
Использование только getTextContent() создает четыре основные проблемы:
- Вы теряете структуру таблиц. Вам приходится угадывать расположение ячеек, основываясь на позициях текста.
- Вы ломаете математические уравнения. Уравнения LaTeX часто отображаются как единые гигантские текстовые блоки.
- Вы пропускаете разделительные линии колонок. Во многих макетах для разделения колонок используются реальные линии. В текстовом контенте этих линий нет.
- Вы получаете неверный порядок чтения. Текст часто появляется в том порядке, в котором он был отрисован, а не в том, в котором его читает человек.
Правильный способ создания PDF-процессора — это трехуровневая система:
- Сначала проверьте
getStructTree(). Если у документа есть логическая структура, используйте её, чтобы сразу найти таблицы и заголовки. - Затем проверьте
getOperatorList(). Используйте явные линии и пути, чтобы найти границы колонок. - Используйте
getTextContent()в качестве резервного варианта. Применяйте геометрические вычисления только тогда, когда первые два уровня не предоставляют данных.
Этот подход не требует больше работы. Уровни 1 и 2 работают как «быстрые выходы». Если документ хорошо структурирован, вы пропускаете сложные математические вычисления. Вы прибегаете к сложному логическому выводу только тогда, когда документ не размечен.
Такая архитектура справляется как с простыми корпоративными файлами, так и со сложными научными работами.
Источник: https://dev.to/bonzai2carn/most-pdf-extractors-use-the-wrong-api-heres-what-we-built-instead-5dgh
