Pythonで複数の類似の表を持ったPDFを正規化
こんにちは業務で日々発生していて今までは手作業でやっていたことを
Pythonで時短をします。
今日のお題は
似たようだが、少しづつ違うPDFで作られた表が複数あります。
それを一気にエクセルに落として正規化してしまいたい。
それではいきましょうー
おちを先にいっておくと、今回はただのOCRで終わりました。
課題
具体的にはECサイトに入稿する商品情報のフォーマットだとしましょう。
例えばあるサイトでは"重量"があるサイトでは"重さ"と言う項目になっていた場合や
あるサイトでは"商品画像"となっていて、あるサイトでは"画像"となっている、または項目の名前だけでなく並び順もまちまちだったとします。
バラバラの商品情報のフォーマットを統一された項目にして整理したい。
google colabでgoogle Driveをマウント
from google.colab import drive
drive.mount('/content/drive')
まずはpdfplumberで実行してみる
import os
folder_path = '/content/drive/My Drive/自分のドライブのフォルダのパス'
pdf_files = [f for f in os.listdir(folder_path) if f.endswith('.pdf')]
print("PDFファイル一覧:", pdf_files)
pdfのファイル名をpdf_files変数に入れます。
for ループいいですねー
import pdfplumber
# テキストを格納するリスト
all_texts = []
# 各PDFファイルからテキストを抽出
for pdf_file in pdf_files:
pdf_path = os.path.join(folder_path, pdf_file)
with pdfplumber.open(pdf_path) as pdf:
pdf_text = ""
for page in pdf.pages:
pdf_text += page.extract_text()
# テキストをリストに追加
all_texts.append(pdf_text)
# 全てのテキストを確認
for idx, text in enumerate(all_texts):
print(f"PDF {idx+1} のテキスト:\n{text[:500]}...\n") # 最初の500文字だけ表示
おなじみになってきたpandas
import pandas as pd
# PDFごとのテキストをDataFrameに変換
df = pd.DataFrame(all_texts, columns=["テキスト"])
# Excelファイルに保存
excel_path = '/content/drive/My Drive/自分のドライブのフォルダのパス/all_pdf_texts.xlsx'
df.to_excel(excel_path, index=False)
print(f"すべてのPDFテキストが {excel_path} に保存されました。")
結果:1枚はエクセルにテキストが落ちました。
11枚のPDFのうち一つしか読み取れない。
次に一つのPDFをひとつづつ読み出します。
import pdfplumber
pdf_path = '/content/drive/My Drive/自分のドライブのフォルダのパス/your_pdf_file.pdf'
with pdfplumber.open(pdf_path) as pdf:
full_text = ""
for page in pdf.pages:
full_text += page.extract_text()
print(full_text) # 抽出されたテキストを確認
ファイルの読み込みはされているがテキストはでてこない。どうやらPDFの形式がPDFがスキャンされた画像の集合であり、テキストとして認識できない場合があります。PDF内のテキストが画像として保存されている場合、通常のテキスト抽出ではうまくいきません
pdfplumberとは
pdfplumberはPythonライブラリの一つで、PDFファイルからテキスト、画像、表などのデータを抽出するために使われます。特に、PDF内部のレイアウトや構造を保持しながらデータを取り出せる点が強みです。複雑な表やフォームデータを含むPDFからも情報を抽出でき、テキスト処理以外にも活用されることが多いです。
主な機能:
テキスト抽出
画像や表の抽出
PDF内のページや要素の解析
OCRが不要なPDFには便利なツールです。
らしい
Tesserractをつかってみる
つぎはOCRでテキストを抽出して抜き出す。
!apt-get install -y poppler-utils # Popplerのインストール
!apt-get install -y tesseract-ocr-jpn # Tesseractの日本語版インストール
!pip install pytesseract # Python用Tesseractライブラリ
!pip install pdf2image # PDFを画像に変換するためのライブラリ
PopplerはPDFファイルを操作するためのツールセットで、pdf2imageがPDFを画像に変換する際に使用
TesseractはOCR(光学文字認識)エンジンで、画像内の日本語テキストを抽出
PythonからTesseractを操作するためのライブラリpytesseract
PDFファイルを画像に変換するためのライブラリpdf2imageでTesseractが画像を処理できるようにPDFを画像化
from pdf2image import convert_from_path
import pytesseract
import os
# PDFファイルが保存されているフォルダのパス
folder_path = '/content/drive/My Drive/自分のドライブのフォルダのパス'
# フォルダ内のPDFファイルをリストアップ
pdf_files = [f for f in os.listdir(folder_path) if f.endswith('.pdf')]
# すべてのPDFファイルに対して処理を行う
for pdf_file in pdf_files:
pdf_path = os.path.join(folder_path, pdf_file)
print(f"処理中のPDFファイル: {pdf_file}")
try:
# PDFを画像に変換
images = convert_from_path(pdf_path)
# 日本語OCRを使ってテキストを抽出
full_text = ""
for i, image in enumerate(images):
text = pytesseract.image_to_string(image, lang='jpn') # lang='jpn'で日本語OCRを指定
print(f"ページ {i + 1} のテキスト:\n{text}") # 各ページのテキストを表示
full_text += text
# 全体のテキストを保存
output_text_file = os.path.join(folder_path, pdf_file.replace('.pdf', '.txt'))
with open(output_text_file, 'w') as f:
f.write(full_text)
print(f"{pdf_file} のテキストが {output_text_file} に保存されました。\n")
except Exception as e:
print(f"エラーが発生しました: {e}")
結果
11枚のPDFがすべてテキスト化されました。
まとめ
pdfはpdfplumberか、tesseract(OCR)でテキスト化できました。しかしバラバラの表を正規化したい。並び順や項目名を統一して整理したい。
ここまでだったらなにかのソフトを使ったほうが早いですね。
tesseractは四次元立方体、超立方体という数学の概念から名前が由来しているそうです。
ということは今回は時間切れで諦めました。
次回チャレンジしたいと思います!