Как извлечь данные из PDF в Excel (или в CSV) с помощью Python

PDF - не самый удобный формат для передачи данных, но иногда возникает необходимость извлекать таблицы (или текст). Данный скрипт Python будет особенно полезен в случае, если вам необходимо периодически извлекать данные из однотипных PDF файлов.

Начнём с импорта библиотек, которые мы будем использовать - Pandas (для записи таблиц в CSV/Excel). Непосредственно работать с PDF файлами мы будем с помощью библиотеки tabula. (установка - cmd -> "pip install tabula-py" ; также для работы необходимо установить Java (https://www.java.com/en/download/)) 

import tabula
import pandas as pd

Задаём путь к файлу в формате PDF, из которого необходимо извлечь табличные данные:

pdf_in = "D:/Folder/File.pdf"

Извлекаем все таблицы из файла в переменную PDF в виде вложенных списков.

PDF = tabula.read_pdf(pdf_in, pages='all', multiple_tables=True)

pages='all' и multiple_tables=True - необязательные параметры

Далее прописываем пути к Excel/CSV файлам, которые мы хотим получить на выходе:

pdf_out_xlsx = "D:\Temp\From_PDF.xlsx"
pdf_out_csv = "D:\Temp\From_PDF.csv"

Для сохранения в .xlsx мы создаем датафрейм pandas из нашего вложенного списка и используем pandas.DataFrame.to_excel :

PDF = pd.DataFrame(PDF)
PDF.to_excel(pdf_out_xlsx,index=False) 

Для сохранения в CSV  мы можем использовать convert_into из tabula.

tabula.convert_into (input_PDF, pdf_out_csv, pages='all',multiple_tables=True)
print("Done")

Скрипт целиком:

# Script to export tables from PDF files
# Requirements:
# Pandas (cmd --> pip install pandas)
# Java   (https://www.java.com/en/download/)
# Tabula (cmd --> pip install tabula-py)
# openpyxl (cmd --> pip install openpyxl) to export to Excel from pandas dataframe

import tabula
import pandas as pd

# Path to input PDF file
pdf_in = "D:/Folder/File.pdf" #Path to PDF

# pages and multiple_tables are optional attributes
# outputs df as list
PDF = tabula.read_pdf(pdf_in, pages='all', multiple_tables=True)

#View result
print ('\nTables from PDF file\n'+str(PDF))

#CSV and Excel save paths
pdf_out_xlsx = "D:\Temp\From_PDF.xlsx"
pdf_out_csv = "D:\Temp\From_PDF.csv"

# to Excel
PDF = pd.DataFrame(PDF)
PDF.to_excel(pdf_out_xlsx,index=False) 

# to CSV
tabula.convert_into (input_PDF, pdf_out_csv, pages='all',multiple_tables=True)
print("Done")