0
2

PDFにまとめた古い図面さん、各ページを分割、図番でファイル名とする (Tesseract OCR)

Posted at

Tesseract OCR メモの続きです。

Tesseract OCR メモ
https://hide.ac/articles/MAg5H2KlK


古い図面データをまとめてスキャナーでPDFにしたいときなど

例えば、右下の図面番号を拾って、各ページを分割、ファイル名にすることを想定しています。


Pythonを使用したPDFからのテキスト抽出とページ別PDFの保存

導入

この記事では、Pythonを用いてPDFファイルから特定の領域のテキストを抽出し、そのテキストを基に新しいPDFファイルの名前を生成する方法を紹介します。この技術は、文書管理システムにおける自動ファイリングや、大量のPDFファイルを扱う際の作業効率化に役立ちます。

必要なツール

  • Python: プログラミング言語
  • Tesseract OCR: テキスト抽出のためのオープンソースOCRエンジン
  • PikePDF & PDF2Image: PDFファイルの処理と画像変換に使用
  • Pillow (PIL): 画像処理ライブラリ

ステップバイステップのガイド

  1. 環境設定: 必要なライブラリのインストールとTesseract OCRのセットアップ。
  2. PDFから画像への変換: pdf2imageを使用してPDFファイルを画像に変換します。
  3. テキスト抽出: Tesseract OCRPillowを使用して、変換された画像から特定領域のテキストを抽出します。
  4. 新しいPDFの生成と保存: 抽出したテキストをファイル名に使用し、PikePDFで元のPDFのページを新しいPDFとして保存します。

コードの詳細解説

このスクリプトは、Pythonを使用してPDFファイルから特定の領域のテキストを抽出し、そのテキストをもとにして各ページを個別のPDFファイルとして保存するプロセスを自動化します。以下、コードの主要部分を順に説明します。

必要なライブラリのインポート

from pdf2image import convert_from_path
import pytesseract
from PIL import Image
import os
import re
import pikepdf
  • pdf2image: PDFを画像に変換するためのライブラリ。
  • pytesseract: Tesseract OCRをPythonから利用するためのラッパー。
  • Pillow (PIL): 画像処理ライブラリ。ここでは、画像の特定の領域をクロップするために使用します。
  • os: ファイルパスの操作やディレクトリの作成に使用します。
  • re: 正規表現を使ってファイル名から不適切な文字を除去します。
  • pikepdf: PDFファイルの操作に使用します。

Tesseract OCRのパス設定

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

Tesseract OCRがインストールされているパスを指定します。これにより、pytesseractがTesseract OCRを呼び出す際に正しい場所を参照できるようになります。

PDFから画像への変換

pdf_path = r"C:\Users\******\Desktop\OCRtest\your_pdf_file.pdf"
output_dir = r"C:\Users\******\Desktop\OCRtest\output"
images = convert_from_path(pdf_path)
  • pdf_path: 処理するPDFファイルのパス。
  • output_dir: 生成されるPDFファイルを保存するディレクトリのパス。
  • images: convert_from_path関数を使用して、PDFファイルを画像のリストに変換します。

テキストの抽出とPDFファイルの保存

area = (width * 0.82, height * 0.93, width, height)

右下の図面番号を拾って、ファイル名にすることを想定しています。

with pikepdf.open(pdf_path) as pdf:
    for i, image in enumerate(images):
        width, height = image.size
        area = (width * 0.82, height * 0.93, width, height)
        cropped_image = image.crop(area)
        text = pytesseract.image_to_string(cropped_image, lang='eng').strip()

        if text:
            filename = re.sub(r'[\\/*?:"<>|]', "", text.splitlines()[0])[:15]
        else:
            filename = "no_text"

        unique_filename = f"{i + 1}_{filename}.pdf"
        file_path = os.path.join(output_dir, unique_filename)

        new_pdf = pikepdf.new()
        new_pdf.pages.append(pdf.pages[i])
        new_pdf.save(file_path)
        print(f"PDF saved as {file_path}")
  • 各ページをループ処理し、画像の特定領域からテキストを抽出します。
  • 抽出したテキストをファイル名に使用し、それぞれのページを新しいPDFファイルとして保存します。テキストが抽出されなかった場合は、デフォルトのファイル名を使用します。
  • pikepdf.new()で新しいPDFを作成し、pdf.pages[i]で元のPDFから特定のページを新しいPDFに追加します。そして、指定されたパスにPDFを保存します。

使用例と応用

古い図面を複数枚まとめてスキャナーでPDFにしたとき、それぞれのページを図番を振って保存したいときなど

今回は、右下の図面番号を拾って、ファイル名にすることを想定しています。

まとめ

この方法を使えば、大量のPDFファイルを効率的に管理し、必要な情報に迅速にアクセスするための作業を自動化できます。


という感じ

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2