CoderCastrov logo
CoderCastrov
Парсер

Парсинг PDF с использованием Python

Парсинг PDF с использованием Python
просмотров
3 мин чтение
#Парсер

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

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

Краткое объяснение парсинга данных в PDF: точное извлечение с использованием координат текстовых блоков

Сначала импортируем необходимую библиотеку для выполнения парсинга данных в PDF и нашего любимого pandas.

# импорт необходимых библиотек
import pandas as pd
import pdfplumber

После импорта необходимой библиотеки создаем пустой словарь с именем данные. Этот словарь будет использоваться для хранения извлеченных данных из PDF. Затем мы выбираем первую страницу файла PDF и присваиваем ее переменной страница_pdf.

# чтение PDF
pdf = pdfplumber.open("путь к файлу PDF")

# создание пустого словаря
данные = {}

# выбор первой страницы файла и присвоение ее переменной страница_pdf
страница_pdf = pdf.pages[0]

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

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

Координаты (x0, y0, x, y) используются в библиотеке pdfplumber совместно с методом within_bbox для определения прямоугольной области на странице PDF. Эта область определяется координатами (x0, y0) в качестве верхнего левого угла прямоугольника и (x, y) в качестве нижнего правого угла. На рисунке ниже приведена иллюстрация.

Используя метод within_bbox с этими координатами, мы можем извлечь текстовое содержимое, находящееся внутри этой конкретной области PDF. Это позволяет нам выделять точные интересующие нас области и извлекать нужные данные с большей точностью.

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

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

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

# извлечение номера налоговой накладной
текст_pdf = страница_pdf.within_bbox((500, 50, 550, 80)).extract_text()
данные['NUM_NF'] = текст_pdf

# извлечение данных поставщика
текст_pdf = страница_pdf.within_bbox((200, 110, 550, 140)).extract_text()
данные['NOME_FORNECEDOR'] = текст_pdf

# извлечение ИНН поставщика
текст_pdf = страница_pdf.within_bbox((160, 150, 270, 170)).extract_text()
данные['CNPJ_FORNECEDOR'] = текст_pdf

# извлечение адреса поставщика
текст_pdf = страница_pdf.within_bbox((180, 160, 520, 190)).extract_text()
данные['ENDERECO_FORNECEDOR'] = текст_pdf

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

df = pd.DataFrame(данные, index = [0])

Это моя первая статья на Medium! Если вы дочитали до этого места, значит, вам был интересен предоставленный мной контент. Благодарю вас за вашу поддержку и за то, что уделили время чтению. Надеюсь, что статья была полезной и познавательной.