#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)