PDFドキュメントには通常、公式レポート、学術論文、財務報告書などの文書に多くのデータが含まれています。これらの文書には、構造化されたテーブルデータがしばしば含まれています。テーブルは、重要な情報を保持するためのキャリアとして機能し、データ分析、研究論証、ビジネスの意思決定において重要な意味を持ちます。しかし、PDF形式は文書のクロスプラットフォームの一貫性を保証している一方で、データの直接的な抽出と利用には障壁があります。Pythonを使用してPDFドキュメントから効率的にテーブルを抽出する方法を習得することで、データ処理能力や情報フローの加速能力を向上させることができます。本記事では、Pythonを使用してPDFドキュメントからテーブルデータを迅速に抽出し、Excelファイルに保存する方法について説明します。
この記事で使用する方法には、Spire.PDF for Pythonが必要です。PyPIを介してインストールすることができます:pip install Spire.PDF
。
PDFドキュメントからテーブルデータを抽出する
PdfTableExtractor(PdfDocument)
クラスは、PDFドキュメントのテーブル抽出作業に使用できます。このクラスのインスタンスを作成した後、PdfTableExtractor.ExtractTable(int: page index)
メソッドを使用して指定されたページのすべてのテーブルを抽出することができます。テーブルを取得した後、PdfTable.GetText(int: row index, int column index)
メソッドを使用してテーブルデータを他の場所に保存することができます。
以下は、PDFのテーブルを抽出してテキストに保存する手順です:
- 必要なモジュールをインポートします。
-
PdfDocument
のインスタンスを作成し、PdfDocument.LoadFromFile()
メソッドを使用してPDFドキュメントをロードします。 - テーブルデータを保存するためのリストを作成し、ドキュメントから
PdfTableExtractor
のインスタンスを作成します。 - ドキュメントのページを反復処理し、
PdfTableExtractor.ExtractTable(int: page index)
メソッドを使用してページ上のテーブルを抽出します。 - 抽出された各テーブルを反復処理し、各テーブルに対して文字列オブジェクトを作成し、
PdfTable.GetText(int: row index, int column index)
メソッドを使用してテーブルデータを取得し、文字列に追加します。 - 各テーブルをテキストファイルとして保存します。
- リソースを解放します。
コード例
from spire.pdf import *
from spire.pdf.common import *
# PdfDocumentクラスのインスタンスを作成します
pdf = PdfDocument()
# PDFファイルを読み込みます
pdf.LoadFromFile("サンプル.pdf")
# リストを作成します
table_data_list = []
# PdfTableExtractorオブジェクトを作成します
extractor = PdfTableExtractor(pdf)
# ドキュメントの各ページを処理します
for pageIndex in range(pdf.Pages.Count):
# ページからテーブルを抽出します
table_list = extractor.ExtractTable(pageIndex)
# テーブルリストが空でないか確認します
if table_list is not None and len(table_list) > 0:
# リスト内の各テーブルに対して処理を行います
for table in table_list:
table_data = ''
# 行数と列数を取得します
row = table.GetRowCount()
column = table.GetColumnCount()
# テーブルの行と列を処理します
for i in range(row):
for j in range(column):
# セルからテキストを取得します
text = table.GetText(i, j)
# テキストをリストに追加します
table_data += text + " "
table_data += "\n"
table_data_list.append(table_data)
# 各テーブルをtxtファイルとして保存します
for i in range(len(table_data_list)):
file_name = "output/Tables/ExtractedPDFTables{0}.txt".format(i)
with open(file_name, "w") as f:
f.writelines(table_data_list[i])
# リソースを解放します
pdf.Close()
PDFドキュメントからテーブルを抽出し、CSVファイルに保存する
テーブルデータを抽出する際に、Spire.XLS for Pythonライブラリ(pip install Spire.XLS
)を組み合わせて、テーブルデータを直接Excelファイルに書き込むことができます。以下は手順です:
- 必要なモジュールをインポートします。
-
PdfDocument
クラスのインスタンスを作成します。 -
PdfDocument.LoadFromFile()
メソッドを使用してサンプルPDFドキュメントをロードします。 -
Workbook
クラスのインスタンスを作成し、デフォルトのワークシートをクリアします。 - PDFドキュメントのページを反復処理します。
-
PdfTableExtractor.ExtractTable()
メソッドを使用してテーブルをページから抽出します。 - 抽出したテーブルを反復処理します。
- 各テーブルに対して、
Workbook.Worksheets.Add()
メソッドを使用してワークブックにワークシートを追加します。 -
PdfTable.GetText()
メソッドを使用してセルのテキストを取得します。 -
Worksheet.Range[rowIndex, columnIndex].Value
プロパティを使用してテキストを特定のセルに書き込みます。 -
Workbook.SaveToFile()
メソッドを使用して結果のワークブックをExcelファイルとして保存します。 - リソースを解放します。
コード例
from spire.pdf import *
from spire.xls import *
# PdfDocumentオブジェクトを作成します
doc = PdfDocument()
# サンプルPDFファイルを読み込みます
doc.LoadFromFile("サンプル.pdf")
# Workbookオブジェクトを作成します
workbook = Workbook()
# デフォルトのワークシートをクリアします
workbook.Worksheets.Clear()
# PdfTableExtractorオブジェクトを作成します
extractor = PdfTableExtractor(doc)
sheetNumber = 1
# ページをループします
for pageIndex in range(doc.Pages.Count):
# 特定のページからテーブルを抽出します
tableList = extractor.ExtractTable(pageIndex)
# テーブルリストが空でないか確認します
if tableList is not None and len(tableList) > 0:
# リスト内の各テーブルに対して処理を行います
for table in tableList:
# ワークシートを追加します
sheet = workbook.Worksheets.Add(f"sheet{sheetNumber}")
# テーブルの行数と列数を取得します
row = table.GetRowCount()
column = table.GetColumnCount()
# 行と列を処理します
for i in range(row):
for j in range(column):
# 特定のセルからテキストを取得します
text = table.GetText(i, j)
# テキストを指定のセルに書き込みます
sheet.Range[i + 1, j + 1].Value = text
# 列幅を自動調整します
sheet.AllocatedRange.AutoFitColumns()
sheetNumber += 1
# ファイルに保存します
workbook.SaveToFile("output/Tables/PDFテーブルをExcelファイルに保存.xlsx", ExcelVersion.Version2013)
doc.Dispose()
workbook.Dispose()
本記事では、Pythonを使用してPDFドキュメントからテーブルデータを抽出し、テキストファイルまたはExcelファイルに保存する方法を示しました。
より詳しいPDFドキュメントの操作技術については、Spire.PDF for Pythonチュートリアルをご覧ください。