247 ①PDFがデジタルテキストの場合でPyPDF2を用いた文字抽出 #AIエンジニアを目指して勉強 #MENTA
MENTAで教わった情報をシェアします。
①PDFがデジタルテキストの場合でPyPDF2を用いた文字抽出方法をシェアします!
▼メリット
環境構築に時間をかけず日本語抽出可能
レイアウトを保持が比較的できる
レッスンコード
import PyPDF2
import pandas as pd
import re
# PDFファイルを読み込む
file_path = '/content/nenpyo.pdf' # ここを対象のPDFファイルのパスに変更してください
with open(file_path, 'rb') as file:
reader = PyPDF2.PdfReader(file)
# 全ページのテキストを格納するリスト
text_data = []
# 各ページのテキストを抽出
for page_num in range(len(reader.pages)):
page = reader.pages[page_num]
text = page.extract_text()
if text:
text_data.append(text)
# # 各ページからテキストを抽出
# text_data = []
# for page in reader.pages:
# text_data.append(page.extract_text())
# テキストを結合して保存
with open('output_text.txt', 'w', encoding='utf-8') as f:
f.write('\n'.join(text_data))
text_data
# DataFrameに変換
# df = pd.DataFrame(text_data, columns=['Year', 'Event'])
# # DataFrameの表示
# df
実際に私がテストしたもの
インプット画像:pdf形式でパスを指定
アウトプット画像:メモでパスを指定
import PyPDF2
import pandas as pd
import re
import os
#12/1outputファイルのパスを指定する。レイアウト保持して文字抽出できた。
# PDFファイルのパスを絶対パスで指定
file_path = "C://purinpdf.pdf" # PDFファイルのフルパスを指定
# 出力先フォルダのパス
output_folder = "C://1201OUTPUT"
# 出力先ファイルのパス(テキストファイル)
output_file_path = os.path.join(output_folder, "output_text.txt")
# フォルダが存在しない場合は作成
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# PDFファイルを読み込む
with open(file_path, "rb") as file:
reader = PyPDF2.PdfReader(file)
# 全ページのテキストを格納するリスト
text_data = []
# 各ページのテキストを抽出
for page_num in range(len(reader.pages)):
page = reader.pages[page_num]
text = page.extract_text()
if text: # テキストが抽出できた場合
text_data.append(text)
# テキストを結合して保存
with open(output_file_path, "w", encoding="utf-8") as f:
f.write("\n".join(text_data))
# 結果を表示
print(f"テキストファイルが保存されました: {output_file_path}")
解説
閲覧用コラボ
PDFファイル(デジタルテキストが含まれている場合)からテキストを抽出し、保存する流れをシェアします!
1. PDFファイルを扱う準備
import PyPDF2
import pandas as pd
import re
PyPDF2: PythonでPDFを操作するためのライブラリ。ここではPDFからテキストを抽出するために使います。
pandas: データ分析用のライブラリ。今回は使っていませんが、抽出したテキストを整理・表示する準備としてインポートされています。
re: 正規表現を扱うライブラリ。今回は使われていませんが、データ整形が必要な場合に便利です。
2. PDFファイルを読み込む
file_path = '/content/nenpyo.pdf' # PDFファイルのパスを指定
with open(file_path, 'rb') as file: # 'rb'はバイナリ読み込みモード
reader = PyPDF2.PdfReader(file) # PyPDF2でPDFを読み込み
file_path: PDFファイルの場所を指定します。ここではサンプルとしてnenpyo.pdfを指定していますが、対象ファイルに置き換えてください。
with open: ファイルを開き、fileという変数に格納します。処理が終わると自動で閉じられるので安心です。
PyPDF2.PdfReader(file): PDFファイルを読み込み、操作可能なオブジェクトreaderを生成します。
3. 全ページのテキストを抽出
text_data = [] # 抽出したテキストを保存するリスト
for page_num in range(len(reader.pages)): # 各ページをループ
page = reader.pages[page_num] # ページごとの情報を取得
text = page.extract_text() # ページからテキストを抽出
if text: # 抽出したテキストが空でなければ
text_data.append(text) # リストに追加
reader.pages: PDFの全ページがリストのように扱えます。
page.extract_text(): ページからテキストを抽出するメソッド。
text_data.append(text): 各ページから抽出したテキストをリストに追加。
4. テキストをファイルに保存
with open('output_text.txt', 'w', encoding='utf-8') as f: # テキストファイルを作成
f.write('\n'.join(text_data)) # 抽出したテキストを結合して書き込み
'output_text.txt': 抽出したテキストを保存するファイル名。
'\n'.join(text_data): 各ページのテキストを改行で結合します。
encoding='utf-8': 文字コードをUTF-8に設定。日本語対応のために重要です。
5. text_dataの内容確認
text_data
PDFから抽出したテキストのリスト(ページごとのテキスト)が表示されます。
コメントアウト部分の説明
# DataFrameに変換
# df = pd.DataFrame(text_data, columns=['Year', 'Event'])
# # DataFrameの表示
# df
この部分は、テキストを整理するための追加処理です。例えば、PDFの内容が「年」と「イベント」ごとに構造化されている場合、pandasのDataFrame(表形式)に変換することで、データ分析や操作が容易になります。
改善点や注意点
PDFがスキャン画像の場合
このコードはデジタルテキストがあるPDF用です。スキャンされたPDF(画像データのみ)ではテキストを抽出できません。その場合、OCRライブラリ(例:PyTesseract)が必要です。抽出結果の確認
一部のPDFではテキスト抽出がうまくいかない場合があります。原因としてPDFのフォーマットや文字コードが挙げられるので、その場合は異なるライブラリ(例:pdfplumber)を試すと良いです。
おわり