python tesseract OCR するメモ3
今回は、左下の文字を読んで、それをファイル名にして、各ページごとに分割する
以下PDFで実施
- 横浜市のPDF・18区おすすめスポット
https://www.city.yokohama.lg.jp/city-info/koho-kocho/koho/insatsubutsu/lifeguide.html
この左下を読む
今回の結果
おしい。
やり方は以下。
PDFからテキストを抽出して自動でファイル名を付け、整理するPythonスクリプト
目的と背景
日々の業務や研究でPDFファイルを扱う際、特定の情報を基にファイルを自動整理したい場面があります。特に、PDFの特定領域にあるテキスト(例えば、タイトルや日付など)を読み取り、それをファイル名に反映させたいというニーズがあります。この記事では、PDFから特定の領域のテキストを抽出し、抽出したテキストを基にファイル名を生成してPDFを保存するPythonスクリプトについて説明します。
使用技術
- pdf2image: PDFファイルを画像に変換するライブラリ。
- PIL (Python Imaging Library): 画像処理を行うライブラリ。
- pytesseract: OCR(光学的文字認識)を利用して画像からテキストを読み取るライブラリ。
- os と datetime: ファイル操作と日付の取り扱いに使用。
スクリプトの説明
今回、日本語だけど、英語にしたいときは、
# 切り取った画像からテキストを読み取る、英語は、ENG
text = pytesseract.image_to_string(cropped_image, lang='ENG').strip()
では、日本語verで書きます。JPN
from pdf2image import convert_from_path
import pytesseract
from PIL import Image
import os
import re
from datetime import datetime
# Tesseract OCRの実行ファイルへのパスを設定
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
input_dir = r"C:\Users\_\Documents\Python\OCR\Input"
output_dir = r"C:\Users\_\Documents\Python\OCR\output"
# 今日の日付を取得し、日付のフォルダを作成
today = datetime.now().strftime("%Y%m%d")
today_output_dir = os.path.join(output_dir, today)
if not os.path.exists(today_output_dir):
os.makedirs(today_output_dir)
dpi = 300
mm_to_pixel = dpi / 25.4
pdf_files = [file for file in os.listdir(input_dir) if file.endswith('.pdf')]
file_counter = 1
for pdf_file in pdf_files:
pdf_path = os.path.join(input_dir, pdf_file)
images = convert_from_path(pdf_path, dpi=dpi)
for page_number, image in enumerate(images, start=1):
width, height = image.size
# 左下の領域を指定(横12cm、縦2cm)
x = 120 * mm_to_pixel
y = 20 * mm_to_pixel
area = (0, height - y, x, height) # 左下の領域を計算
# OCR用の画像を切り取る
cropped_image = image.crop(area)
# 切り取った画像からテキストを読み取る
text = pytesseract.image_to_string(cropped_image, lang='jpn').strip()
# 読み取ったテキストを基にファイル名を生成
if text:
base_filename = re.sub(r'[\\/*?:"<>|]', "", text.splitlines()[0])[:15]
else:
base_filename = "no_text"
filename = f"{file_counter}_{base_filename}_{today}"
unique_filename = f"{filename}_1.pdf"
counter = 1
while os.path.exists(os.path.join(today_output_dir, unique_filename)):
counter += 1
unique_filename = f"{filename}_{counter}.pdf"
file_path = os.path.join(today_output_dir, unique_filename)
# 元の画像全体をPDFとして保存
image.save(file_path, "PDF", resolution=dpi)
print(f"PDF saved as {file_path}")
file_counter += 1
コードの解説
-
Tesseract OCRの設定: Tesseract OCRの実行ファイルへのパスを設定します。これにより、
pytesseract
がOCR処理を実行できるようになります。 - 入出力ディレクトリの設定: 処理するPDFが置かれた入力ディレクトリと、処理結果を保存する出力ディレクトリを設定します。
- 日付フォルダの作成: 処理結果を保存する際、今日の日付のフォルダを作成し、整理された形で保存します。
-
PDFの読み込みと画像への変換:
convert_from_path
を用いてPDFを画像に変換します。DPIを設定して、変換される画像の解像度を調整します。 -
テキスト抽出領域の指定と抽出: 特定の領域(例:左下の12cm x 2cm)を指定して、そこから画像を切り取り、
pytesseract
を用いてテキストを抽出します。 - ファイル名の生成と保存: 抽出したテキストを基にファイル名を生成し、元の画像をPDFとして新しいファイル名で保存します。
応用例と注意点
このスクリプトは、特に請求書や契約書など、特定のフォーマットを持つPDFファイルの自動整理に役立ちます。ただし、Tesseract OCRの精度は画像のクオリティに依存するため、可能な限り高解像度の画像で処理を行うことが重要です。
まとめと今後の展望
この記事では、PDFから特定のテキストを抽出し、それをファイル名に反映させることでファイルの自動整理を行うPythonスクリプトを紹介しました。今後、OCRの精度向上や複数言語対応など、さらに汎用性の高いスクリプトの開発が期待されます。
です。