Краткое руководство по извлечению таблиц из PDF с помощью Python
В работе с анализом данных мы часто сталкиваемся с необходимостью извлечения табличных данных из PDF-файлов. Однако прямое копирование таблиц из PDF часто приводит к хаосу в форматировании и смещению данных. Эта статья шаг за шагом покажет вам, как использовать библиотеку Free Spire.PDF for Python для быстрого и точного распознавания и извлечения таблиц из PDF, а также сохранения данных в распространённых форматах, таких как CSV и Excel.
1. Подготовка: Установка необходимых библиотек
Сначала вам нужно установить библиотеку Spire.PDF. Откройте терминал или командную строку и выполните следующую команду:
pip install spire.pdf.free
Если вы планируете экспортировать извлечённые данные в формат Excel, рекомендуется также установить pandas и openpyxl:
pip install pandas openpyxl
2. Основной код: Извлечение таблиц из PDF
Следующий код демонстрирует, как извлечь таблицы с первой страницы PDF и вывести содержимое ячеек построчно:
from spire.pdf import PdfDocument, PdfTableExtractor
# 1. Загрузить PDF-файл
pdf = PdfDocument()
pdf.LoadFromFile("sample.pdf")
# 2. Создать экстрактор таблиц
table_extractor = PdfTableExtractor(pdf)
# 3. Извлечь все таблицы с первой страницы
tables = table_extractor.ExtractTable(0)
# 4. Пройтись по каждой таблице
for table in tables:
row_count = table.GetRowCount()
column_count = table.GetColumnCount()
# Извлечь содержимое ячеек построчно
for i in range(row_count):
row_data = []
for j in range(column_count):
cell_text = table.GetText(i, j)
row_data.append(cell_text)
print(row_data)
Пояснение к коду
LoadFromFile(): Загружает PDF-файл из указанного пути
PdfTableExtractor(): Создаёт экземпляр экстрактора таблиц
ExtractTable(номер страницы): Извлекает все таблицы с указанной страницы, нумерация страниц начинается с 0
GetRowCount() / GetColumnCount(): Получает количество строк и столбцов таблицы
GetText(строка, столбец): Получает текстовое содержимое указанной ячейки
3. Расширенная обработка: Пакетное извлечение из многостраничного PDF
Если PDF содержит несколько страниц, вы можете использовать цикл для пакетного извлечения всех таблиц:
from spire.pdf import PdfDocument, PdfTableExtractor
pdf = PdfDocument()
pdf.LoadFromFile("multi_page_report.pdf")
# Пройтись по всем страницам
for page_index in range(pdf.Pages.Count):
extractor = PdfTableExtractor(pdf)
tables = extractor.ExtractTable(page_index)
print(f"\n=== Страница {page_index + 1} найдено {len(tables)} таблиц ===")
for t, table in enumerate(tables):
print(f"--- Таблица {t+1} ---")
rows = table.GetRowCount()
cols = table.GetColumnCount()
for i in range(rows):
row = [table.GetText(i, j) for j in range(cols)]
print(row)
4. Экспорт данных: Сохранение в файлы CSV или Excel
Извлечённые табличные данные можно легко преобразовать в другие форматы. Следующий пример сохраняет данные в CSV-файл:
import csv
from spire.pdf import PdfDocument, PdfTableExtractor
pdf = PdfDocument()
pdf.LoadFromFile("sample.pdf")
extractor = PdfTableExtractor(pdf)
tables = extractor.ExtractTable(0)
if tables:
table = tables[0]
rows = table.GetRowCount()
cols = table.GetColumnCount()
# Собрать все данные
data = []
for i in range(rows):
row_data = [table.GetText(i, j) for j in range(cols)]
data.append(row_data)
# Записать в CSV-файл
with open("output.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerows(data)
print(f"Успешно экспортировано {rows} строк × {cols} столбцов данных в output.csv")
Чтобы экспортировать данные в Excel-файл, вы можете использовать pandas:
import pandas as pd
# Предположим, что data — это извлечённый выше двумерный список
df = pd.DataFrame(data[1:], columns=data[0]) # Первая строка как заголовки столбцов
df.to_excel("output.xlsx", index=False)
print("Данные сохранены как output.xlsx")
5. Часто возникающие проблемы и советы
Неполное распознавание таблицы? Проверьте, имеет ли таблица в PDF чёткие границы. Для отсканированных документов или PDF на основе изображений требуется технология OCR; Spire.PDF в основном подходит для текстовых PDF.
Обработка объединённых ячеек: Spire.PDF автоматически обрабатывает объединённые ячейки. GetText() возвращает содержимое ячейки в верхнем левом углу объединённой области, а для остальных позиций возвращает пустую строку.
Оптимизация производительности: При обработке больших PDF-файлов рекомендуется извлекать и сохранять данные постранично, чтобы избежать загрузки всех таблиц в память одновременно.
Выполнив описанные выше шаги, вы освоили полный процесс извлечения таблиц из PDF с помощью Python. Это решение можно легко интегрировать в автоматизированные конвейеры обработки данных, что значительно повышает эффективность работы.







