【VBA機能拡張】Tesseract OCRを使ってExcel VBAで文字認識(OCR)

Excelはデータ管理や計算処理において非常に便利なツールですが、時には印刷物やスクリーンショットなどの画像に含まれるテキスト情報をExcelで利用したい場合があります。このような場合に役立つのが、文字認識(OCR)です。

このページではGoogle社が開発しているオープンソースの文字認識エンジン『Tesseract OCR』をそのまま利用してExcelマクロ上で文字認識を行うための機能を実装していきます。オープンソースなので内部で何しているかは調べれば出てきますしカスタマイズしてもOK、使用料もなくオフラインでも利用できるのでいろいろと融通が利くマクロを作成することができます。

icon-warning 注意 

本ページではTesseract OCRの内部処理については解説していないので、しっかりと中身を確認しておきたい方は予め調べておくことをオススメします。また文字認識は入力画像の解像度や文字以外の情報(表の罫線やイラストなど)によって期待とは違う結果を出力する場合があります
より高みを目指す場合は、Tesseract OCRを改造してより精度がでるよう挑戦してみて下さい。

 

Tesseract OCR 

Tesseract OCRはGoogle社が開発しているオープンソースの光学式文字認識エンジンです。画像データといくつかのパラメータを入力することで、その画像データに記載されてる文字をテキストファイルにして出力してくれます。

TesseractOCRは高い精度と多言語サポートしているとともに、オープンソースであるため自由にカスタマイズや拡張が可能であり、個々のニーズに合わせてカスタム設定や追加の言語パックを使用することができます。

 
 icon-download  Tesseract OCRをインストールする

まずはTesseract OCRをインストールします。
Tessearact OCR の公式ドキュメント(github)よりインストーラのダウンロードができます。
画像付きの詳細なインストール手順が必要な場合は下記をクリックしてください。

1. リンク先ページの「Windows – Tesseract at UB Mannheim」をクリック

2.「tesseract-ocr-w64-setup-5.3.1.20230401.exe (64bit)」をクリック
  (※バージョンによって文字列は異なるが最新版を選択すればOK)

 
インストーラがダウンロード出来たらexeファイルを実行してTesseract OCRをインストールします。exeファイルを実行するとインストーラの言語設定ができるので好きな言語を選択して[OK]をクリックします。(日本語はないです)

3.指示に従って進める。(ライセンス条項は要確認のこと)

4.文字認識をする対象の言語として日本語を追加でインストール
   [Additional script data (download)] で [Japanese script][Japanese vertical script]、
 [Additional language data (download)] で [Japanese][Japanese (vertical)」を選択

5.インストールするフォルダを選択する
 スタートメニューフォルダは特に変更せずに[Install]ボタンをクリック

6.インストールが完了したら[Next]ボタン、[Finish]ボタンの順にクリック

以上でTesseract OCRのインストールは完了です。

 
 icon-play Tesseract OCRを利用する

Tesseract OCRのインストールが完了したら実際に使って入力出力のイメージをつかんでみましょう。
「Tesseract-OCR」フォルダ内に「tesseract.exe」というTesseract OCRの実行ファイル(exeファイル)があります。このexeファイルはコマンドプロンプトより実行します。

 icon-code Tesseract OCR実行方法 

 
Tesseract OCRはコマンドプロンプト上で下記のコマンドを打ち込むことで実行が可能です。

 
<exeファイルパス>
部分には「tesseract.exe」のフルパスを入力します。
 

<画像ファイルパス>部分には文字認識を行う画像ファイルのフルパスを入力します。
入力可能な画像形式は「JPEG/png/tiff/webp/jepg2000/bmp/pnm/gif」です。
 

<出力パス>部分には文字認識の結果を出力するテキストファイルのフルパスを入力します。
ただし、このフルパスには拡張子(.txt)を除いたものを入力します。
 

-l jpn 部分では言語の設定を行っています。
l は言語(language)の設定を行うパラメータを表しており、英語の場合は「-l eng」、日本語横書きの場合は「-l jpn」、日本語縦書きの場合は「-l jpn_vert」と入力します。
  
※それぞれの入力値の間は半角スペース[ ]で区切ります。
 -l 以外にも入力可能なパラメータが存在しますがここでは説明を省略します。
 

たとえば下記のようにパスを入力するとデスクトップの「test.jpg」ファイルに書かれている文字を認識して、デスクトップに「output.txt」というファイルで結果を出力することができます。

<exeファイルパス>   “C:\Program Files\Tesseract-OCR\tesseract.exe”
<画像ファイルパス>  “C:\Users\liclog\Desktop\test.jpg” 
<出力パス>        “C:\Users\liclog\Desktop\output”

 
本来、パス部分はカレントのディレクトリを考慮することでフルパスを入力する必要はありませんが、ここではVBAで利用することを考えてフルパスを入力することにします。

 

Excel VBAでTesseractOCRを起動

VBAはWshShellオブジェクトを利用することでコマンドプロンプト経由でexeファイルを実行することができます。Tesseract OCRはtesseract.exeを実行することで指定のディレクトリに文字認識の結果が書き出されたテキストファイルを出力することができます。そしてVBAは指定のテキストファイル内に書かれている文字列を読み取ることができます。

つまり、下記のような手順を行えばTesseract OCRを経由してVBAで文字認識を行うことが出来ます。

1. VBAのWshShellオブジェクトで「tesseract.exe」を実行 
 (コマンドプロンプトで[<exeファイルパス> <画像ファイルパス> <出力パス> -l jpn]を実行と同義)
2. <画像ファイルパス>の文字認識の結果が<出力パス>.txtとして出力される
3. VBAで<出力パス>.txtにアクセスしてファイルに書かれている文字列を取得する

 

 icon-code  サンプルコード

以降では実際にVBAのコードを見ながら詳しく処理の流れを解説していきます。新規Excelブック(.xlsm)の標準モジュールに下記コードをコピペして、インストールした「Tesseract-OCR」フォルダをExcelブックと同階層にそのまま配置することですぐに利用可能な状態になっています。

mainを実行すると画像ファイル選択ダイアログが表示されるので、文字認識したい画像を選びます。画像を選ぶと処理がTesseract OCRに渡り、文字認識とその結果のテキストファイル出力が行われます。そして再び処理がVBAに戻ってきてそのテキストファイルの文字列を取得しアクティブシートに出力するという流れになっています。

 
 icon-edit コード解説

サンプルコードの肝となる部分は「コマンドの作成」です。Tesseract OCRは、下記のような”コマンド”をコマンドプロンプトに入力して実行することで文字認識の処理を行うことが出来ました。

VBAではWshShellオブジェクトのRunメソッドを使うことで、これと同じようにコマンドプロンプトの操作を行うことができます。Runメソッドは下記のように書いて使用します。

 icon-code Runメソッド 

Set oWSH = CreateObject(“WScript.Shell”)         ‘WshShellオブジェクトを生成
Call oWSH.Run(sCmd, 0, True)        ‘コマンド実行
Set oWSH = Nothing                                         ‘WshShellオブジェクト解放

第一引数にはコマンドプロンプトに入力したいコマンドの文字列を入力します。
今回の場合は”<exeファイルパス> <画像ファイルパス> <出力パス> -l jpn”という文字列を入力します。

第二引数にはコマンドプロンプトの表示状態を入力します。0にするとコマンドプロンプトを表示せずに実行可能です。表示させたい場合は1を入力します。

第三引数にはTrueをいれます。これは同期の設定となっており、Trueにすることで入力したコマンドの実行が終わるまでVBAは処理を待機してくれます。これにより文字認識の結果が出力されるまではVBAが処理を待機してくれるので、確実に結果のテキストファイルを取得することが可能になります。

 
サンプルコードでは処理の7, 8割がこのコマンド(sCmd)の作成処理となっています。
<exeファイルパス><出力パス>はExcelブックのパスから辿って作成し、<画像ファイルパス>はファイル選択ダイアログを使ってユーザ選択させるというような動的なコードになっていて、Tesseract OCRのパラメータである「-l」もコード内の引数の数字で簡単に切り替えられるようになっています。基本的にサンプルコードのコメントを読めば何をしているのかは理解できるはずです。

文字認識の精度は100%ではないですが大半の文字の認識は可能です。(英語はより精度が高いです)

 

関連情報

icon-share-square 参考

AI, DLL, Excel, VBA

Posted by Lic