Практическое руководство по анализу PDF файлов средствами Python в Data Science

Раздел: Data Science -> Pandas и NumPy

Основные подходы к анализу данных PDF в Python

Какое решение оптимально для извлечения табличных данных из PDF?

Наиболее эффективным инструментом для извлечения табличных данных и текста с сохранением структуры является библиотека pdfplumber. Она позволяет точно получать координаты элементов, извлекать таблицы в виде списков словарей и легко конвертировать их в DataFrame библиотеки Pandas. PDFPlumber работает быстрее аналогов, хорошо справляется с кириллицей и не требует внешних зависимостей для базовых операций.

Пример извлечения таблицы из файла report.pdf:


import pdfplumber
import pandas as pd

with pdfplumber.open('report.pdf') as pdf:
    page = pdf.pages[0]
    table = page.extract_table()  # список строк
    if table:
        df = pd.DataFrame(table[1:], columns=table[0])
        print(df.head())

Python для анализа данных (python для анализа данных)

После получения DataFrame можно выполнять любые операции анализа с помощью Pandas и NumPy. Проблемы могут возникнуть при наличии объединённых ячеек или изображений вместо текста – в таких случаях данные могут быть потеряны или искажены. Решение: предварительная обработка PDF (например, удаление водяных знаков) или использование OCR (библиотека pytesseract) для распознавания.

Типичная ошибка: AttributeError: 'NoneType' object has no attribute 'extract_table' – означает, что на странице не обнаружена таблица. Проверьте, что PDF содержит табличные данные, и укажите правильные границы области с помощью параметра table_settings.

Как извлечь весь текст из PDF без таблиц?

Для простого извлечения текста часто используют библиотеку PyPDF2. Она легковесна, но может не поддерживать все форматы и не даёт информации о позиционировании.


import PyPDF2

with open('document.pdf', 'rb') as file:
    reader = PyPDF2.PdfReader(file)
    text = ''
    for page in reader.pages:
        text += page.extract_text()
    print(text[:500])

анализ больших данных python (анализ больших данных в python)

Проблема: текст может извлекаться с разрывами строк или отсутствием пробелов. Особенно часто это встречается при нестандартной кодировке шрифтов. Решение: использовать pdfplumber для более качественного извлечения.

При работе с многостраничными PDF возможна утечка памяти, если не закрывать файл. Рекомендуется использовать контекстный менеджер with.

Как извлечь таблицы в DataFrame с помощью tabula-py?

Библиотека tabula-py основана на Java-инструменте Tabula и отлично подходит для таблиц с чёткими границами. Она умеет обрабатывать PDF с разными локалями, включая кириллицу, если установлена соответствующая JDK.


import pandas as pd
import tabula

# Извлечение всех таблиц с первой страницы
tables = tabula.read_pdf('report.pdf', pages=1, multiple_tables=True)
if tables:
    df = tables[0]
    print(df.head())

Python анализ данных excel (анализ данных excel в python)

Важно: при отсутствии Java библиотека выдаст ошибку FileNotFoundError. Решение: установить Java Runtime Environment (JRE) версии 8 или выше.

Таблицы с нестандартными разделителями ячеек (например, без линий) могут быть обнаружены некорректно. Для таких случаев используйте camelot с режимом lattice или stream.

Как обрабатывать сложные таблицы с помощью Camelot?

Библиотека camelot специализируется на извлечении таблиц и поддерживает два режима: lattice (для таблиц с линиями) и stream (для таблиц без линий). Она возвращает объект CamelotTable, который можно преобразовать в DataFrame.


import camelot

# Извлечение таблиц в режиме stream
tables = camelot.read_pdf('complex.pdf', pages='1', flavor='stream')
if tables.n > 0:
    df = tables[0].df
    print(df.head())

анализ данных python pdf (анализ данных pdf в python)

Примечание: camelot требует установки Ghostscript и cv2 (OpenCV) для работы с изображениями. Без них распознавание может быть менее точным.

Ошибка OSError: Ghostscript is not installed. Решение: скачать и установить Ghostscript с официального сайта, а также добавить его в PATH.

Как извлечь данные с точным позиционированием (координаты)?

Библиотека pdfminer.six предоставляет низкоуровневый доступ к содержимому PDF. Она позволяет получать координаты каждого символа, что полезно для восстановления структуры сложных форм или расписаний.


from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextBoxHorizontal

for page_layout in extract_pages('form.pdf'):
    for element in page_layout:
        if isinstance(element, LTTextBoxHorizontal):
            print(f'({element.bbox[0]:.1f}, {element.bbox[1]:.1f}) - {element.get_text()}')

Python анализ данных и машинное обучение (анализ данных и машинное обучение на python)

Данный код выводит текст с координатами нижнего левого угла. Это позволяет восстанавливать таблицы, где данные расположены в фиксированных позициях.

Работа с pdfminer.six требует значительного времени при обработке больших файлов. Рекомендуется сначала выбирать только нужные страницы.

Как выполнять анализ данных из PDF с помощью Pandas и NumPy?

После извлечения данных в DataFrame их можно обработать стандартными методами: очистка, фильтрация, агрегация, визуализация. Пример – вычисление среднего значения числового столбца:


import pandas as pd
import numpy as np

df = pd.read_csv('extracted_data.csv')  # предположим, данные сохранены в CSV
df['value'] = pd.to_numeric(df['value'], errors='coerce')
mean_val = np.mean(df['value'].dropna())
print(f'Среднее значение: {mean_val:.2f}')

Важно: числовые данные из PDF часто имеют неверный тип (строка). Необходимо выполнить преобразование с pd.to_numeric, обрабатывая пропуски.

Ошибка при преобразовании: ValueError: Unable to parse string может быть вызвана наличием нечисловых символов (пробелы, точки вместо запятых). Перед конвертацией очистите строки: df['value'] = df['value'].str.replace(',', '.').str.strip().

- аналитик данных python sql (аналитик данных python sql)
- Python библиотеки numpy и pandas (библиотеки numpy и pandas в python)
- библиотеки python для обработки данных (библиотеки python для обработки данных (pandas, numpy и др.))

Расширенные примеры извлечения и анализа данных из PDF

Пакетная обработка нескольких PDF файлов с сохранением в единый DataFrame

Допустим, в папке invoices находятся счета в формате PDF, каждый содержит таблицу с номерами и суммами. Следующий код извлекает все таблицы, объединяет их и добавляет имя файла как источник:

Пример

import pdfplumber
import pandas as pd
import glob

data_frames = []
for filepath in glob.glob('invoices/*.pdf'):
    with pdfplumber.open(filepath) as pdf:
        for page in pdf.pages:
            tbl = page.extract_table()
            if tbl:
                df = pd.DataFrame(tbl[1:], columns=tbl[0])
                df['source'] = filepath
                data_frames.append(df)
full_df = pd.concat(data_frames, ignore_index=True)
print(f'Общее количество строк: {len(full_df)}')
Общее количество строк: 245

Данный подход позволяет быстро собрать данные из тысячи файлов. При большом количестве стоит учитывать потребление памяти – обрабатывайте файлы порциями.

Если в некоторых PDF пустые страницы, extract_table() вернёт None – проверка if tbl предотвращает ошибку.

Извлечение данных из отсканированных PDF с помощью OCR (pytesseract)

Когда PDF содержит изображения страниц (скан), сначала конвертируйте страницу в изображение с помощью pdf2image, затем распознайте текст через Tesseract:

Пример

from pdf2image import convert_from_path
import pytesseract
import pandas as pd

images = convert_from_path('scan.pdf', dpi=300)
text_data = []
for img in images:
    text = pytesseract.image_to_string(img, lang='rus+eng')
    text_data.append(text)
full_text = '\n'.join(text_data)
print(full_text[:500])

Для таблиц можно использовать pytesseract.image_to_data с детализацией по ячейкам, но это требует дополнительной обработки.

Ошибка TesseractNotFoundError – Tesseract не установлен или не прописан в PATH. Установите Tesseract с официального сайта, для русского языка скачайте файл rus.traineddata в папку tessdata.

Извлечение данных из защищённых паролем PDF

Библиотеки pdfplumber и PyPDF2 могут открывать зашифрованные файлы, если известен пароль. Пример с pdfplumber:

Пример

with pdfplumber.open('protected.pdf', password='secret123') as pdf:
    text = pdf.pages[0].extract_text()
    print(text[:200])

Если пароль неверен, возникнет исключение PdfReadError.

Некоторые PDF используют шифрование, не поддерживаемое Python-библиотеками. Альтернатива: использовать утилиту qpdf для удаления пароля.

Извлечение изображений из PDF для анализа

Иногда требуется извлечь встроенные изображения (диаграммы, фотографии) для последующей обработки OpenCV или NumPy. Библиотека PyMuPDF (fitz) позволяет извлекать изображения:

Пример

import fitz  # PyMuPDF

doc = fitz.open('chart.pdf')
for page_num in range(len(doc)):
    page = doc.load_page(page_num)
    images = page.get_images(full=True)
    for img_index, img in enumerate(images):
        xref = img[0]
        pix = fitz.Pixmap(doc, xref)
        if pix.width > 100:  # фильтр маленьких иконок
            pix.save(f'image_{page_num}_{img_index}.png')

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

Обработка таблиц с многоуровневыми заголовками

Некоторые PDF содержат объединённые ячейки заголовков. Для правильного парсинга нужно знать структуру. Пример использования camelot с постобработкой:

Пример

import camelot
import pandas as pd

tables = camelot.read_pdf('multi_header.pdf', flavor='lattice')
table = tables[0]
df = table.df  # DataFrame из сырых строк
print('Исходная таблица:')
print(df.head())
Исходная таблица:
       0      1      2
0  Header
1  SubA   SubB   SubC
2     10     20     30

Преобразование в плоский заголовок: объединить строки 0 и 1, например так:

Пример

new_columns = []
for col_idx in range(len(df.columns)):
    top = df.iloc[0, col_idx] if df.iloc[0, col_idx] else ''
    bottom = df.iloc[1, col_idx] if df.iloc[1, col_idx] else ''
    new_columns.append(f'{top}_{bottom}'.strip('_'))
df_clean = df.iloc[2:].reset_index(drop=True)
df_clean.columns = new_columns
print(df_clean)
  Header_SubA Header_SubB Header_SubC
0          10          20          30

Использование NumPy для анализа числовых данных из PDF

Когда извлечены большие числовые массивы (например, временные ряды из отчёта), можно сразу преобразовать их в массив NumPy и выполнить быстрые вычисления:

Пример

import numpy as np
import pdfplumber

with pdfplumber.open('timeseries.pdf') as pdf:
    page = pdf.pages[0]
    table = page.extract_table()
    data = np.array(table[1:], dtype=float)  # пропуская заголовок
    mean = np.mean(data[:, 1])  # среднее второго столбца
    std = np.std(data[:, 1])
    print(f'Среднее: {mean:.3f}, Стандартное отклонение: {std:.3f}')

Этот подход значительно быстрее, чем использование Pandas для простых матричных операций.

Анализ данных PDF в Python - comments

En
анализ данных python pdf (python)