Практическое руководство по анализу PDF файлов средствами Python в Data Science
Основные подходы к анализу данных 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().
Расширенные примеры извлечения и анализа данных из 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 для простых матричных операций.