Время прочтения: 2 мин.

Такие задачи отлично решает инструмент tabulajava, который специально разработан для решения таких проблем. Для работы с данным инструментом на Python написана библиотека-оболочка tabulapy, которая позволяет извлекать данные в любой удобный для вас вид: pandas DataFrame, JSON.

Давайте рассмотрим основные режимы чтения табличных данных в представленном инструменте. Основным методом библиотеки является read_pdf(). По умолчания этот основной метод читает таблицу и возвращает ее представление в виде pandas DataFrame, но через параметр output данное поведение можно изменить.

Пример чтения данных и их вывод представлены ниже.

По умолчанию метод read_pdf читает данные в режиме Lattice Mode. Этот режим распознает значения ячеек на основе отображаемых линий или границ таблицы. При использовании этого режима tabula заменяет аномально большой интервал между текстами и новой строкой в ячейке на \r. Это можно исправить с помощью простых манипуляций с регулярными выражениями.

Stream Mode используется, когда границы ячеек скрыты при форматировании таблицы. Для того чтобы извлечь данные в таком случае этот режим использует промежутки между столбцами, чтобы распознать каждое значение в таблице. Пример работы со Stream Mode:

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

В определенных ситуациях требуется проанализировать не всю страницу, а только часть. В данном случае можно установить параметр area=(top, left, bottom, right), где размеры указываются в пикселях от  верхнего левого угла. В качестве альтернативы, можно установить область с процентным масштабом, установив relative_area=True.

Таким образом, мы рассмотрели наиболее частые ситуации применения данного инструмента и убедились в его незаменимости при решении такого рода задач.