PDFファイルから表データを抽出する作業は、PDF文書の構造が複雑なため、難しい場合があります。
単純なテキスト抽出とは異なり、表を抽出する際には、行と列の関係や表形式を維持したままデータを取得する必要があります。多数のPDFから表データを手作業で取り出すのではなく、プログラムを使用して処理を自動化することで、作業を大幅に効率化できます。
本記事では、Pythonを使用してPDF内の表をテキスト、Excel、CSVに抽出する方法を紹介します。
本記事で取り上げる内容は、以下のとおりです。
- PythonでPDFの表をテキストに抽出する
- PythonでPDFの表をExcelに抽出する
- PythonでPDFの表をCSVに抽出する
- PDFの表をテキスト、Excel、CSVに抽出するためのPythonライブラリ
PDFの表を抽出するためのPythonライブラリ
PDF内の表データをテキスト、Excel、CSVファイルに抽出するには、Spire.PDF for PythonとSpire.XLS for Pythonを使用できます。
Spire.PDF for Pythonは、主にPDFから表データを抽出するために使用します。一方、Spire.XLS for Pythonは、抽出した表データをExcelファイルやCSVファイルとして保存するために使用します。
プロジェクトのターミナルで、以下のpipコマンドを実行してSpire.PDF for PythonとSpire.XLS for Pythonをインストールします。
pip install Spire.Pdf
pip install Spire.Xls
すでにSpire.PDF for PythonとSpire.XLS for Pythonをインストールしており、最新バージョンにアップグレードする場合は、以下のコマンドを実行します。
pip install --upgrade Spire.Pdf
pip install --upgrade Spire.Xls
PythonでPDFの表をテキストに抽出する
Spire.PDF for Pythonが提供するPdfTableExtractor.ExtractTable(pageIndex: int)メソッドを使用すると、PDFページ内の表を取得できます。
表を取得した後、PdfTable.GetText(rowIndex: int, columnIndex: int)メソッドを使用して、指定した行と列のセルからデータを取得できます。取得したデータは、後から利用できるようにテキストファイルとして保存できます。
以下のサンプルコードでは、PythonとSpire.PDF for Pythonを使用して、PDFファイルから表データを抽出し、テキストファイルとして保存します。
from spire.pdf import *
from spire.xls import *
# PDFから表データを抽出する関数
def extract_table_data(pdf_path):
# PdfDocumentクラスのインスタンスを作成
doc = PdfDocument()
try:
# PDF文書を読み込む
doc.LoadFromFile(pdf_path)
# 抽出した表データを保存するリストを作成
table_data = []
# PdfTableExtractorクラスのインスタンスを作成
extractor = PdfTableExtractor(doc)
# PDF文書内の各ページを順番に処理
for page_index in range(doc.Pages.Count):
# 各ページから表を取得
tables = extractor.ExtractTable(page_index)
if tables is not None and len(tables) > 0:
# 取得した各表を順番に処理
for table_index, table in enumerate(tables):
row_count = table.GetRowCount()
col_count = table.GetColumnCount()
table_data.append(
f"ページ{page_index + 1}の表{table_index + 1}:\n"
)
# 表内の各セルからデータを取得し、リストに追加
for row_index in range(row_count):
row_data = []
for column_index in range(col_count):
data = table.GetText(row_index, column_index)
row_data.append(data.strip())
table_data.append(" ".join(row_data))
table_data.append("\n")
return table_data
except Exception as e:
print(f"エラーが発生しました: {str(e)}")
return None
# 抽出した表データをテキストファイルに保存する関数
def save_table_data_to_text(table_data, output_path):
try:
with open(output_path, "w", encoding="utf-8") as file:
file.write("\n".join(table_data))
print(
f"表データを「{output_path}」に正常に保存しました。"
)
except Exception as e:
print(
f"表データの保存中にエラーが発生しました: {str(e)}"
)
# 使用例
pdf_path = "Tables.pdf"
output_path = "table_data.txt"
data = extract_table_data(pdf_path)
if data:
save_table_data_to_text(data, output_path)
PythonでPDFの表をExcelに抽出する
PDF内の表をExcelに抽出すると、表データに対して追加の分析、計算、可視化などを行う際に便利です。
Spire.PDF for PythonとSpire.XLS for Pythonを組み合わせることで、PDFから抽出した表データをExcelワークシートへ簡単に出力できます。
以下のサンプルコードでは、Spire.PDF for PythonとSpire.XLS for Pythonを使用して、PDF内の表データをExcelワークシートに出力します。
from spire.pdf import *
from spire.xls import *
# PDF内の表データをExcelに抽出する関数
def extract_table_data_to_excel(pdf_path, xls_path):
# PdfDocumentクラスのインスタンスを作成
doc = PdfDocument()
try:
# PDF文書を読み込む
doc.LoadFromFile(pdf_path)
# PdfTableExtractorクラスのインスタンスを作成
extractor = PdfTableExtractor(doc)
# Workbookクラスのインスタンスを作成
workbook = Workbook()
# デフォルトで作成される3つのワークシートを削除
workbook.Worksheets.Clear()
# PDF文書内の各ページを順番に処理
for page_index in range(doc.Pages.Count):
# 各ページから表を抽出
tables = extractor.ExtractTable(page_index)
if tables is not None and len(tables) > 0:
# 抽出した各表を順番に処理
for table_index, table in enumerate(tables):
# 表ごとに新しいワークシートを作成
worksheet = workbook.CreateEmptySheet()
# ワークシート名を設定
worksheet.Name = (
f"ページ{page_index + 1}の表{table_index + 1}"
)
row_count = table.GetRowCount()
col_count = table.GetColumnCount()
# 表データを抽出してワークシートに書き込む
for row_index in range(row_count):
for column_index in range(col_count):
data = table.GetText(
row_index,
column_index
)
worksheet.Range[
row_index + 1,
column_index + 1
].Value = data.strip()
# ワークシートの列幅を自動調整
worksheet.Range.AutoFitColumns()
# 指定したExcelファイルにワークブックを保存
workbook.SaveToFile(
xls_path,
ExcelVersion.Version2013
)
except Exception as e:
print(f"エラーが発生しました: {str(e)}")
# 使用例
pdf_path = "Tables.pdf"
xls_path = "table_data.xlsx"
extract_table_data_to_excel(pdf_path, xls_path)
PythonでPDFの表をCSVに抽出する
CSVは、表計算ソフト、データベース、プログラミング言語、データ分析ツールなど、さまざまな環境で開いて処理できる汎用性の高いファイル形式です。
PDF内の表をCSV形式に変換することで、幅広いアプリケーションやツールからデータを簡単に利用できるようになります。
以下のサンプルコードでは、Spire.PDF for PythonとSpire.XLS for Pythonを使用して、PDF内の表データをCSVファイルに出力します。
from spire.pdf import *
from spire.xls import *
# PDF内の表データをCSVに抽出する関数
def extract_table_data_to_csv(pdf_path, csv_directory):
# PdfDocumentクラスのインスタンスを作成
doc = PdfDocument()
try:
# PDF文書を読み込む
doc.LoadFromFile(pdf_path)
# PdfTableExtractorクラスのインスタンスを作成
extractor = PdfTableExtractor(doc)
# Workbookクラスのインスタンスを作成
workbook = Workbook()
# デフォルトで作成される3つのワークシートを削除
workbook.Worksheets.Clear()
# PDF文書内の各ページを順番に処理
for page_index in range(doc.Pages.Count):
# 各ページから表を抽出
tables = extractor.ExtractTable(page_index)
if tables is not None and len(tables) > 0:
# 抽出した各表を順番に処理
for table_index, table in enumerate(tables):
# 表ごとに新しいワークシートを作成
worksheet = workbook.CreateEmptySheet()
row_count = table.GetRowCount()
col_count = table.GetColumnCount()
# 表データを抽出してワークシートに書き込む
for row_index in range(row_count):
for column_index in range(col_count):
data = table.GetText(
row_index,
column_index
)
worksheet.Range[
row_index + 1,
column_index + 1
].Value = data.strip()
csv_name = (
csv_directory
+ f"ページ{page_index + 1}の表{table_index + 1}"
+ ".csv"
)
# 各ワークシートを個別のCSVファイルとして保存
worksheet.SaveToFile(
csv_name,
",",
Encoding.get_UTF8()
)
except Exception as e:
print(f"エラーが発生しました: {str(e)}")
# 使用例
pdf_path = "Tables.pdf"
csv_directory = "CSV/"
extract_table_data_to_csv(pdf_path, csv_directory)
まとめ
本記事では、Pythonを使用してPDF内の表データを抽出し、テキスト、Excel、CSVファイルとして保存する方法を紹介しました。
PDFに含まれる表データをプログラムで抽出することで、大量のPDFを扱う場合でも、手作業を減らして効率的にデータを処理できます。
本記事の内容が、PDFの表データを活用する際の参考になれば幸いです。
