Prog::手書きメモをテキスト化したい
#2025/6/11
【課題】手書きメモが膨大
A6ノートに書き溜めた手書きメモが数十冊ある.
これをスキャニングしたデータもある.
なので,これをなるべく楽してテキスト化したい.
◆手順
やり方は以下の通り.
1. GUIでスキャンデータを保存したフォルダを選択
2. その中の画像ファイルを順次読み込んで
3. OCR処理してテキスト化
4. 対象画像ファイル名を元にした名のテキストファイルで保存
◆いろいろやった事
試行錯誤メモ.
1. GPTくんに聞いてみた. ⇒ 答:Google Cloud Vision API を使いなさい
→ アカウント登録とか面倒 → ほかにないか?
2. GPTくんに聞いた. ⇒ 答:Tesseract OCRというフリーのツールを使いなさい
→ tesseractをインストールしてやってみた
https://github.com/tesseract-ocr/tesseract/releases
→ 実行できたが,文字がデタラメ……
3. GPTくん手書き認識できないよ ⇒ 答:Tesseractは手書き苦手です.手書き対応できるのはGCVです
→ そうだったのか.しようがないんでGCPアカウント登録してJSONファイルをgetするか……
4. GCPはGoogleなんでGeminiちゃんに聞いてみた ⇒ 答:ちゃんと教えてれた.
参照:「Prog::Google Cloud Vision API導入してみた」
必要なツール: poppler
https://github.com/oschwartz10612/poppler-windows/releases/
◆GPTくんによるソース
以下の通り.
/icons/hr.icon
✅ 対応内容
1. GUIでフォルダを選択
2. 画像ファイル(.jpg, .jpeg, .png, .bmp, .tiff)とPDFファイル(.pdf)に対応
3. Google Cloud Vision OCRを使って、日本語のみでテキスト抽出
4. 画像ファイル名(拡張子なし)と同じ名前で .txt ファイルとして保存
✅ 必要なライブラリインストール
code: (bash)
pip install google-cloud-vision pillow pdf2image
※ pdf2image を使うためには、Poppler のインストールが必要です。Windowsの場合は実行ファイルをダウンロードして、poppler/bin のパスを指定する必要があります(後述)。
✅ Pythonコード(日本語限定・画像+PDF対応)
code: (python)
import os
import io
from tkinter import Tk, filedialog
from google.cloud import vision
from PIL import Image
from pdf2image import convert_from_path
# ← ここを自分のサービスアカウントJSONに変更
os.environ"GOOGLE_APPLICATION_CREDENTIALS" = "your-service-account.json"
# 必要ならここにpopplerのパス(Windows用)
POPPLER_PATH = r"C:\path\to\poppler\bin" # Windowsユーザーのみ必要
# 対象ファイルの拡張子
IMAGE_EXTENSIONS = ".jpg", ".jpeg", ".png", ".bmp", ".tiff"
PDF_EXTENSION = ".pdf"
# フォルダ選択
def select_folder():
root = Tk()
root.withdraw()
return filedialog.askdirectory(title="OCR処理するフォルダを選択")
# OCR実行(画像用、日本語指定)
def perform_ocr_image(image_data):
client = vision.ImageAnnotatorClient()
image = vision.Image(content=image_data)
response = client.text_detection(image=image, image_context={"language_hints": "ja"})
if response.error.message:
raise Exception(response.error.message)
texts = response.text_annotations
return texts0.description if texts else ""
# メイン処理
def main():
folder = select_folder()
if not folder:
print("フォルダが選択されませんでした。")
return
files = os.listdir(folder)
for file_name in files:
ext = os.path.splitext(file_name)1.lower()
file_path = os.path.join(folder, file_name)
base_name = os.path.splitext(file_name)0
output_txt_path = os.path.join(folder, base_name + ".txt")
try:
if ext in IMAGE_EXTENSIONS:
with io.open(file_path, "rb") as img_file:
content = img_file.read()
print(f"OCR: {file_name}(画像)")
text = perform_ocr_image(content)
elif ext == PDF_EXTENSION:
print(f"OCR: {file_name}(PDF)")
images = convert_from_path(file_path, poppler_path=POPPLER_PATH if os.name == 'nt' else None)
text = ""
for i, image in enumerate(images):
with io.BytesIO() as output:
image.save(output, format="JPEG")
content = output.getvalue()
page_text = perform_ocr_image(content)
text += f"\n--- ページ {i+1} ---\n{page_text}"
else:
continue
# 保存
with open(output_txt_path, "w", encoding="utf-8") as f:
f.write(text)
print(f"→ 保存完了: {output_txt_path}")
except Exception as e:
print(f"エラー({file_name}): {e}")
if __name__ == "__main__":
main()
✅ PDF処理の注意点(Windowsユーザー向け)
pdf2image は内部的に poppler を使います。
Poppler for Windows を以下からダウンロード:
https://github.com/oschwartz10612/poppler-windows/releases/
bin フォルダのパスを POPPLER_PATH に指定してください。
✅ 出力例
invoice01.jpg → invoice01.txt
report.pdf → report.txt(各ページに「--- ページ N ---」をつけて連結)
/icons/hr.icon