LoginSignup
15
23

More than 3 years have passed since last update.

PythonでPDFからOCR

Posted at

1.はじめに

素晴らしい先人達の真似をしてPythonでPDFからOCRするコードを書いてみた。
とを使います。
やってることは、PDFをpopplerでjpg化してからTesseract OCRでtxtファイルに文字起こし

初心者なので、コードに変なところあればコメに指摘もらえると嬉しいです。
引用していないサイトも、たくさん参考にさせていただきました。ありがとうございます。

2.概要

こちらのサイトを参考に、フォルダ構成を以下の通りにしました。
PythonでPDFを画像ファイル(JPEG、PNG)に変換する方法

親フォルダ 子フォルダ
¥カレント ¥image_file
¥pdf_file
¥poppler
¥txt_file

※まずはフォルダにある古いファイルを削除

import os
import pathlib
from pathlib import Path
from pdf2image import convert_from_path
from PIL import Image
import sys
import pyocr
import pyocr.builders
import pathlib
import glob


def cleanup():
    # 削除対象のimgファイルがあるディレクトリ
    image_dir = pathlib.Path('./image_file')
    # globでディレクトリ内のjpegファイルをリストで取得
    jpg_path = list(image_dir.glob('**/*.jpeg'))

    # 削除対象のtxtファイルがあるディレクトリ
    txt_dir = pathlib.Path('./txt_file')
    # globでディレクトリ内のtxtファイルをリストで取得
    txt_path = list(txt_dir.glob('**/*.txt'))

    if jpg_path == []:  # リストが空ならbreak
        pass
    else:
        for i in jpg_path:
            os.remove(i)

    if txt_path == []:  # リストが空ならbreak
        pass
    else:
        for i in txt_path:
            os.remove(i)

※次はpdfをjpgに変換

def pdf_to_image():
    # poppler/binを環境変数Pathに追加する(一時的に)
    # Path("__file__").parent.resolve()で.pyファイルの親フォルダ絶対パスを返す
    poppler_dir = pathlib.Path("__file__").parent.resolve() / "poppler/bin"
    # pathsepは環境変数に追加するときの区切り;
    os.environ["PATH"] += os.pathsep + str(poppler_dir)

    # PDFファイルのパス
    pdf_dir = pathlib.Path('./pdf_file')
    # globでディレクトリ内のpdfファイルをリストで取得
    pdf_path = list(pdf_dir.glob('**/*.pdf'))

    # PDF -> Imageに変換(200dpi)
    pages = convert_from_path(str(pdf_path[0]))

    # 画像ファイルを1ページづつ保存
    image_dir = pathlib.Path("./image_file")
    for i, page in enumerate(pages):  # enumerate関数でpagesのpage数を取得
        # .stemでpathの末尾を表示(pathlib)
        file_name = pdf_path[0].stem + "_{:02d}".format(i + 1) + ".jpeg"
        image_path = image_dir / file_name
        # JPEGで保存
        page.save(str(image_path), "JPEG")

※最後にocr

def image_ocr():

    # tesseract-OCRのパスを通す
    tessera_path = "C:\***\Tesseract-OCR"
    # pathsepは環境変数に追加するときの区切り;
    os.environ["PATH"] += os.pathsep + str(tessera_path)

    tools = pyocr.get_available_tools()
    if len(tools) == 0:
        print("No OCR tool found")
        sys.exit(1)  # 引数1は終了ステータスで1を返す

    tool = tools[0]

    # ocr対象のファイルがあるディレクトリ
    image_dir = pathlib.Path('./image_file')
    # globでディレクトリ内のjpegファイルをリストで取得
    jpg_path = list(image_dir.glob('**/*.jpeg'))

    for i in jpg_path:
        # ocrした内容を変数txtにする
        txt = tool.image_to_string(
        Image.open(str(i)),
        lang="jpn",
        builder=pyocr.builders.TextBuilder(tesseract_layout=6)
        )
        # 変数txtをtxt_fileディレクトリにtxtファイルで保存
        with open('./txt_file/' + str(i.stem) + '.txt', mode='wt') as t:
            t.write(txt)
15
23
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
15
23