名刺や紙の文献などに書かれた文字をテキストデータをとして取り込みたいことがあると思います。
そんなときにOCRを使うと便利です。
ここでは無料で使えるFreeOnlineOCRというwebサイトを使って、自動的に画像ファイルから文字を読み取ってテキストデータに保存するプログラムを紹介します。
使用するプログラム
使用するプログラム言語はPython(パイソン)です。
事前にPythonをインストールする必要があります。
詳しくは本の178ページの「Pythonの導入」をご覧ください。
プログラムのダウンロード
プログラムファイルをダウンロードしてください。
ダウンロードしたファイルを実行してください。メモ帳などでテキストが表示されます。
解説はこれを見ながら行います。
この時点でプログラムは起動しないので大丈夫です。
プログラムを実行したい場合は拡張子をtxtからpyに変えからダブルクリックしてください。
例) 78-python-ocr-1.txt → 78-python-ocr-1.py
プログラムの流れ
今回のプログラムではOCRにかけたい画像が一つでも複数でも取り込めるようにしています。
プログラムの解説
ここからは先ほどダウンロードしたプログラムを、1行ずつ解説していきます。
モジュールのimport
importするモジュール(プログラム)です。
import pyautogui
import pyperclip
import sys
import webbrowser
pyautoguiはキーを押したりマウスを動かしたりする関数が詰まったモジュールです。
pyperclipはコピーしたテキストデータを取り込むモジュールです。
sysはプログラムを終了したいときなどに使うモジュールです。
webbrowserはWebサイトを表示したいときに使うモジュールです。
処理速度の設定
pyautoguiの処理速度を1秒に設定します。
pyautogui.PAUSE = 1
これで1秒ごとに1つのプログラムが動作します。
例えば、1秒経ったらwindowsキーを押し、その1秒後に上方向を押す、という感じです。
動きが遅い、0.5秒ごとにしたいのであれば秒数を1から0.5に変更すればできます。
ただし、早すぎるとキーが処理速度についてこれなくなるので、せいぜい0.5から1の間で行うとよいでしょう。
以下はプログラムの作りです。
PAUSEはすべて大文字ですので注意してください。
メッセージボックスの関数
関数とは何度も使いまわせるプログラムととらえてください。
予め関数を作っておき、あとでその関数を使いたいときに呼び出して使う流れです。
これによって何度も同じプログラムを書く必要がなくなり、呼び出すだけでプログラムを使いまわすことができるので非常に便利です。
今回はプログラム実行中に何度もメッセージボックスを表示させるようにするので、関数を使います。
以下プログラムです。
def kakunin_kansuu(bunsyou):
kaitou = pyautogui.confirm(bunsyou)
if kaitou == 'Cancel':
pyautogui.alert('プログラムを中断します。')
sys.exit()
以下プログラムの作りです。
最初の行で関数の名前を書き、その下に関数の中身のプログラムを書きます。
関数は呼び出されないと機能しません。
それぞれ解説をしていきます。
(1)関数の名前
関数の名前を付けるのですが、以下のように書きます。
defは最初に必ず書きます。これでここから関数が始まることを示しています。
kakunin_kansuuは関数名です。名前は好きにつけてよく、アンダースコア「_」をつかわなくても大丈夫です。
( )は関数名の後に必ず付けます。ここでは( )内にbunsyouといれていますがこれは変数です。これはあとで解説します。
最後はコロン「:」で閉じます。これがないと機能しません。
(2)関数の中身
次に関数の中身を作ります。
ここではメッセージボックスを表示して、そこでキャンセルが押されたらプログラムを中断して終了するプログラムを書きます。
以下プログラムの作りです。
詳細を解説します。
1.メッセージボックスの表示と回答
ここではメッセージボックスを表示して、そのあとOKボタンが押されたかキャンセルボタンが押されたかの結果を得るようにします。
kaitouは結果を保管するための変数です。ここではOKかCancelが入るようになります。
pyautogui.confirm( )はメッセージボックスを表示する関数です。
このメッセージボックス表示後にOKボタンかキャンセルのボタンが押されますが、OKボタンならOKの文字列が、キャンセルボタンならCancelの文字列が返ってきます。
つまりその返ってきた文字列が変数のkaitouの中に入る仕組みです。
( )内には表示したいメッセージを入れます。ここでは変数のbunsyouとしており、bunsyouの中に入っているメッセージが表示されます。
メッセージは関数を呼び出す時に入れますので、その時にまた解説します。
以下pyautogui.confirm()のプログラムの作りです。
2.回答がキャンセルかどうかチェック
ここでは変数のkaitouがCancelかどうかをチェックしています。
以下プログラムの作りです。
最初にifを書きます。
条件式にはkaitou == ‘Cancel’ と書き、変数のkaitouの中身がCancelかどうかをチェックします。
注意として、=は2つ繋げて==と書きます。
最後にコロンを書きます。これがないと機能しません。
変数のkaitouの中身がCancelだった場合はその下にある字下げされたプログラムを処理します(次で説明します)。違ってれば字下げされたプログラムを無視して飛ばします。
3.キャンセルならプログラム中断
キャンセルボタンが押されたときはプログラムの中断メッセージボックスを表示して終了します。
以下プログラムの作りです。
最初に字下げをします。
ifで条件に合った場合はこの字下げされたプログラムを実行します。
条件に合わなかった場合は字下げされていないプログラムのところまでジャンプします。
字下げは半角スペース4回分、もしくはTabを1回押して字下げします。
pyautogui.alert( )はメッセージボックスを表示する関数です。
先ほどのconfirm( )の関数とほとんど同じですが、ボタンがOKしかありません。
sys.exit()はプログラムを終了する関数です。終了する際はこのまま書けばOKです。
プログラム開始の確認
プログラムを開始したら、まずは開始していいかどうかの確認用メッセージボックスを表示させます。
間違えて起動した場合にすぐに終了できるようにするためです。必須のプログラムではないのですが便利なので付けています。
プログラムは以下のとおりです。
kakunin_kansuu('画像ファイルをOCRで読むプログラムです。起動しますか?')
ここでは前述の関数のkakunin_kansuu( )を呼び出しています。
プログラムの作りは以下のとおりです。
( )の中には表示したいメッセージが入ります。
ここで関数の式のおさらいです。
def kakunin_kansuu(bunsyou):
変数のbunsyouに注目です。この変数bunsyouに表示したいメッセージが入ることになります。
このように関数を呼び出すときには関数名と表示したいメッセージを入れて呼び出せばOKで、1行で済むので簡単になります。
コピーしたパスをtekisutoへ代入
OCRに取り込むための画像ファイルが必要ですが、ここでは画像ファイルのパスをコピーしておきます。
パスとはフォルダーの場所とファイル名が書かれた文字列です。
パスのコピーは下図のように、ファイルの上でShiftを押しながら右クリックをし、メニューの中からパスのコピーを選ぶとできます。
複数のファイルをOCRに取り込みたいときはファイルを複数選択してからパスをコピーすればOKです。
プログラムの話に戻りますが、ここではコピーしたパスをプログラムに取り込みます。
tekisuto = pyperclip.paste()
tekisutoは変数で、コピーした内容を取り込みます。
pyperclip.paste()はコピーした内容を出力する関数です。
つまりここではコピーしたパスの文字列を出力し、それを変数のtekisutoに入力しているということです。
tekisutoでパスを一つ一つ分解してrisutoに代入
変数のtekisutoには複数の画像ファイルのパスがはいることもあるので、これを一つ一つのパスに分解します。
今回使うFreeOnlineOCRは画像ファイルを一つずつ扱うので、それに合わせて分解するということです。
risuto = tekisuto.splitlines()
risutoはパスのリストが入る変数です。
tekisuto.splitlines()は文字列を行ごとに分割する関数です。
つまり先ほどの変数のtekisutoの中身をsplitlines()という関数で行ごとに分解してリスト化し、それを変数のrisutoに入れています。
イメージでいうと、変数のtekisutoの中身は1つの枠の中に複数のパスが入っているイメージです。
そして変数のrisutoは関数のsplitlines()によって複数の枠が作られて、それぞれ一つずつパスが入るようになり、それを一つの変数でまとめているイメージです。
こうすることによってパスを一つずつ取得しやすくなったということです。その理由は後述します。
risutosuu = len(risuto)
risutosuuはリストの数が入る変数です。
len(risuto)は変数のrisutoのリスト数を数える関数です。
つまり画像ファイルのパスが1つなら1が、3つなら3がrisutosuuに入ります。
パスの確認メッセージ
ここでもメッセージボックスを表示する関数kakunin_kansuu()が登場しますが、この中で3つほど解説します。
kakunin_kansuu('このパスでいいですか?\n' + str(risutosuu) +'件\n' + tekisuto)
¥nは改行を意味する文字列です。
+は文字列と文字列をつなげる記号です。ここではただの文字列と、関数でできた文字列と変数の中の文字列を組み合わせるために使っています。
str(risutosuu)は数値を文字列に変換する関数です。数値をメッセージとしてあらわすためには必ずstr()関数を使います。
これで実際のメッセージボックスは以下のように表示されます。
このメッセージは以下のようにプログラムで表示しています。
OnlineOCRを起動
次にブラウザーでOnlineOCRのサイトを起動します。
webbrowser.open('https://www.onlineocr.net/ja/')
pyautogui.sleep(5)
webbrowser.open()はブラウザーを起動して()内のサイトに移動する関数です。
ブラウザーはデフォルトのものが起動します。
pyautogui.sleep()はプログラムを停止する関数で、()内の秒数だけ停止させます。
webサイトを起動するには時間がかかるので、ここでは5秒停止するとして()内を5としています。
ルーチン作業
あとは繰り返し、画像ファイルのアップロード、OCR変換、テキストファイルのダウンロードの作業を繰り返します。
for pasu in risuto:
pyautogui.press('f3')
pyperclip.copy('ファイル...')
pyautogui.hotkey('ctrl','v')
…
forは繰り返し処理をするための制御文です。作りは以下のとおりです。
順次解説をします。
for文について
for文の作りは以下のとおりです。
forは最初に必ず書きます。
pasuはfor文の中で使われる変数です。
inは先ほどの変数の後に必ず書きます。こういうものと覚えてください。
risutoは前述の変数risutoのことで、繰り返しの対象となります。
「:」コロンは最後に必ず書きます。これがないと機能しません。
どうやって繰り返し処理をするのかというと、変数risutoからパスを一つ取り出して処理をし、処理が終わったら次のパスを取り出して処理をし、それをずっと繰り返して最後のパスが処理されるまで繰り返すということです。
パスが1つなら1回、3つなら3回繰り返すといった感じです。
取り出されたパスは変数pasuに入り、処理の中で使われます。
F3キーを押して検索機能を出す
forの繰り返し処理の中で、Webサイトにファイルをアップロードしたりするためのキーボード操作をします。
まずはF3キーを押してブラウザーの検索機能を表示させます。
キーを押すのは以下のプログラムでできます。
pyautogui.press('f3')
プログラムの作りは以下のとおりです。
pyautoguiはモジュール名です。最初に必ず書きます。
ドット「.」でつなげます。
press( )はキーを押す関数で、( )内は押されるキーの文字列が入ります。
これを実際に押すとこうなります。
どう使うかは後述します。
クリップボードにコピー
次にクリップボードに「ファイル…」という文字列をコピーします。
コピーはpyperclipモジュールのcopy関数を使って行います。
pyperclip.copy('ファイル...')
プログラムの作りは以下のとおりです。
pyperclipはモジュール名で最初に書きます。
「.」ドットでつなげます。
copy( )はコピーする関数で、( )内はコピーされる文字列を書きます。
詳細は後述します。
貼り付けのショートカットキー操作
貼り付けのショートカットキーといえばCtrlキーを押しながらVキーですが、こういうのをホットキーといいます(狭い意味で)。
ホットキーをpyautoguiモジュールのhotkey関数で行います。
pyautogui.hotkey('ctrl','v')
プログラムの作りは以下のとおりです。
pyautoguiはモジュール名で最初に必ず書きます。
「.」ドットをモジュール名のあとにつけます。
hotokey( )はホットキーを押す関数で、( )内は押されるキーが2つと、間にカンマ「,」が1つ入ります。
これで貼り付けのショートカットキーが機能します。
さてここまでで、F3キーを押して検索機能を表示し、「ファイル…」をコピーし、それを貼り付ける、ということをしました。
何がやりたかったかというと、まずは以下のように検索機能に「ファイル…」を貼り付けます。
そうするとWebサイトの画面下のほうで「ファイル…」と書かれたボタンがオレンジ色になります。
このボタンを選択したかったのです。
このボタンを押すと画像ファイルをアップロードすることができますので、押し方を後述します。
ボタンを押す処理
検索機能でボタンの位置を特定した後、検索機能を閉じてボタンを押します。
プログラムは以下のとおりです。
pyautogui.press('enter')
pyautogui.press('esc')
pyautogui.press('\t')
pyautogui.press('enter')
pyautogui.sleep(5)
プログラムの作りは以下のとおりです。
順に説明します。
pyautogui.press(‘enter’)は検索機能でちゃんと「ファイル…」が選択されるようにEnterを押して選択を移動します。なくても大丈夫ですが念のためです。
pyautogui.press(‘esc’)は検索機能を閉じるためにEscキーを押します。
pyautogui.press(‘\t’)はボタンを選択するためにTabキーで選択を移動します。「\t」はTabキーのことです。
検索機能で「ファイル…」を選択しましたが、このときは「ファイル…」という文字列を選択していてボタンは選択してませんでした。
そこでTabキーを押してボタンを選択するように移動するということです。
pyautogui.press(‘enter’)をまた押しますが、ここでボタンを押し、ファイルのアップロード用のダイアログボックスを開きます。
pyautogui.sleep(5)でダイアログボックスが表示されるのに時間を要するので5秒待つようにします。
ダイアログボックスは以下のような画面です。
ここに画像ファイルをアップロードします。
画像ファイルをアップロード
ダイアログボックスにアップロードしたい画像ファイルを選択しますが、ここでファイルのパスが役に立ちます。
プログラムは以下のとおりです。
pyperclip.copy(pasu)
pyautogui.hotkey('ctrl','v')
pyautogui.sleep(1)
pyautogui.press('enter')
pyautogui.sleep(5)
以下解説です。
pyperclip.copy(pasu)は変数pasuの中身をコピーします。変数pasuの中には変数risutoから一つとりだしたパスが入っています。つまりここではパスを一つコピーしているというわけです。
pyautogui.hotkey(‘ctrl’,’v’)でコピーした内容を貼り付けます。
この時点でダイアログボックスは実際にはこのようになります。
ファイル名の欄にパスを貼り付けてます。これでこの画像ファイルをアップロードできます。
pyautogui.sleep(1)でパスの貼り付けを確認するため1秒停止時間を取ります。
pyautogui.press(‘enter’)で「開く」ボタンを押してダイアログボックスを閉じ、Webサイト画面に戻ります。
pyautogui.sleep(5)でWebサイトに戻るまでに少し時間がかかることがあるので5秒待ちます。
言語を日本語に変更
OCRで読み取る言語を日本語にします。
プログラムは以下のとおりです。
pyautogui.press('\t')
pyautogui.press('\t')
pyautogui.press('j')
pyautogui.press(‘\t’)を2回使ってますが、これは「ファイル…」ボタンから「ENGLISH」と書かれたセレクトボックスにTabキーで移動するためです。なぜ1回でないのかは不明ですが。
pyautogui.press(‘j’)でセレクトボックスの「JAPANESE」を選択します。
セレクトボックス上で「J」を押すと「JAPANESE」が選択される仕様になっているのでそれを利用しています。
フォーマットをテキストに変更
画像ファイルからOCR後のファイルのフォーマットをテキストに選択します。
初期設定はWordになっているのでそれでもいいのですが、テキストの方がデータが軽いので変えます。
プログラムは特に説明するものはないので省略します。
コンバートボタンを押す
コンバートボタンを押してOCR処理をし、テキストファイルを作成します。
ここもプログラムは特に説明するものはないので省略します。
コンバートには10秒ほどかかるので10秒待つようにします。
ダウンロードする
コンバート後はWebサイトの下の方に「出力ファイルをダウンロード」というリンクが作成されるので、そこからダウンロードすることができます。
ここもプログラムは特に説明するものはないので省略します。
リンクのところにTabキーで移動してEnterをすればダウンロードが始まります。
5秒もあればダウンロードされるので5秒待ちます。
ここまでで繰り返し処理の1回目が終わりましたので、またforの位置まで戻ってプログラムが進みます。
プログラムの終了
forの繰り返し処理がすべて終わったらプログラムが終わったことを知らせて終わらせます。
ここもプログラムは特に説明するものはないので省略します。
サンプル動画
まとめ
画像ファイルを自動的にOCRにアップロードしてダウンロードするプログラムを紹介しました。
また、プログラムの作りやその機能についての説明をしました。
動画を見ながらイメージがつかめるとやりやすいと思います。
わからないことなどありましたらお問い合わせからご連絡ください。