[RPA]UiPathのOCR機能を利用してPDFの内容をExcelに転記してみた

## [0]はじめに
Zitanです。
OCR（Optical Character Recognition）の需要は高いと思いますが、
UiPathでOCR機能が使えることを知りました。
実際に動いた感動をシェアしたく、記事にしてみました。作り方も説明しているので長いです。

## [1]全体の流れ
### [1-1]タクソノミーを読み込む
タクソノミーとは、UiPathの公式サイトによると、
様々な種類の文書 (請求書、契約書、医療カルテなど) の集合体や、それに関するデータフィールドのことです。
実作業としては、OCRで抽出したい項目名を定義します。
たとえば請求書であれば、「請求書番号」「会社名」「明細金額」など、抽出したい情報がありますね。
事前に、そういった情報を登録します。
ドキュメント全体を読み込むのではなく、事前に設定した項目だけをOCR処理します。
項目と内容の紐づけは、[1-3]のデータ抽出で説明しています。

### [1-2]ドキュメントをデジタル化
ドキュメントがあるフルパスを指定します。
UiPathに搭載されているいくつかの種類のOCRエンジンの中から一つ選びます。
選んだOCRエンジンがドキュメントをデジタル化（解析）してくれます。

### [1-3]データ抽出
抽出子というものを使って、先ほど[1]で最初に定義した項目名と、ドキュメント（PDFとか）内の内容の位置合わせを行います。
ドキュメント内で抽出したい文字の周りをマウスでドラッグして四角形で囲って、その中の文字列を抽出するように定義します。

[抽出子の種類・特徴についての説明はこちら](https://docs.uipath.com/document-understanding/docs/data-extraction-overview)

### [1-4]抽出したデータの検証(本運用では不要？)
抽出された内容が合っているか人間の目でチェックします。
毎回、検証ステーションというものが起動して、全然自動ではないので、
抽出結果の精度が信頼できるのであれば、本運用では「検証ステーションを提示」というアクティビティは削除するかもしれません。

### [1-5]抽出結果を出力
Excelなどに書き込みます。

## [2]結果
こんな請求書があったとします。請求書のフォーマットに変更はなく、1枚で完結するとします。(複数枚に渡らない)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/d405734d-ffdc-6747-5d8f-9ce02328379b.png)

赤枠で囲ったテキストを抽出して、Excelに書き込まれるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/e7c0cf63-f5fb-d8af-2c1c-8b92725a0655.png)


ちなみにテンプレートは、ここで入手しました。
※利用規定に商用・非商用問わず無料で利用できると記載されています。便利なので使用させていただきました。

https://template.the-board.jp/tags/1/%E3%82%BF%E3%83%86%E5%9E%8B

## [3]作り方
今回は、元がExcelファイルでできた請求書をPDFで保存しました。
手書きのデータを読み込む場合もこれから説明する手順で対応できるらしいです。
これから説明する手順は、色んなサイトを見ても同じ流れだったので、お作法として何も考えずに配置して大丈夫だと思います。
私は最初さっぱり分からず真似して作りましたが、動いたものを見て、あとから理解しました。

### [3-1]タクソノミーマネージャーで抽出したい項目内容の名称を定義する
パッケージを管理->すべてのパッケージで<b><font color="Blue">「UiPath.IntelligentOCR.Activities」</font></b>を検索してインストールします。
<b>バージョンは「<font color="Blue">v4.10.0</font>」</b>にします。最新が「v4.13.1」だったのですが、使いたいアクティビティが見つからず。。。
[![Image from Gyazo](https://i.gyazo.com/19207d8e79191828226ef5a9a7ebf4ae.gif)]((https://gyazo.com/19207d8e79191828226ef5a9a7ebf4ae))

インストールが終わったら、
タクソノミーマネージャーを開いて、今回OCRで読み込みたい項目名を定義します。
※インストール完了後に出現します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/6c7ff2ee-20ad-2443-abfc-3fbb7ff730c7.png)

ドキュメントの種類は、いくつか分類分けして登録することができます。
初めての場合は、赤枠で囲った「＋」記号をクリックして、グループ名の大区分名を入力します。
その後、カテゴリ名（中区分名）を入力します。

たとえば、あなたが会社の経理部に所属しているならば、
[大区分]経理部
[中区分]A社請求書
といった名称でもいいでしょう。大区分も中区分もそれぞれプルダウン形式で選択できるので複数のドキュメントのパターンが定義できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/af4b12c9-ac5f-00ef-ba52-4fa5f5ca630f.png)

筆者がすでに作成したものはこちらです。あとで抽出したい項目名（フィールド）を「新しいフィールド」から追加します。
[![Image from Gyazo](https://i.gyazo.com/1e77b87c32fb5ef9cad62e4521d70877.gif)](https://gyazo.com/1e77b87c32fb5ef9cad62e4521d70877)

保存して、閉じたらデザイナーパネル内（プロセスを作成する場所）にシーケンスを配置し、
その中にアクティビティ「タクソノミーを読み込み」を配置します。
※今回は条件分岐なしの処理なのでフローチャートは使わず、シーケンスのみの構造です。

### [3-2]ドキュメントをデジタル化(OCRエンジンでドキュメントを解析)
その下に読み込みたいドキュメントのフルパスを用意します。アクティビティ「代入」を配置しましょう。

それぞれ入出力の変数は分かりやすいように日本語名にしています。
<font color="Blue"><b>変数を作成するときは、テキストボックスの中で、「Ctrl+K」を入力してから変数名を入力すると自動的に適切な型を宣言してくれます。
自動的に型を設定してくれます。アクティビティを配置していく過程で、初めて見る変数は、「Ctrl+K」で作りましょう。</b></font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/0213386a-2299-ac6c-dd4a-a1d8e36e4c1f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/de5744bb-598a-2fb4-cdb5-b61bc49bdb01.png)


その下に、これです。ドキュメントを「Microsoft OCR」というエンジンで解析します。（ドキュメントをでデジタル化）
アクティビティパネルで「OCR」と検索すれば色んなエンジンが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/29c09b40-5575-4ae2-1e19-f80e2c32b522.png)

### [3-3]データ抽出スコープ（抽出子を選択・抽出内容の位置合わせなど行う）
そして、その下にこれです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/bce1de7b-27bd-3235-3c7e-08bad21b31fd.png)

<font color="Blue"><b>他のWebサイト様だと、「抽出子を設定」のところに「インテリジェントフォーム抽出子」を配置していました。
手書きの文字を抽出したい時に活躍するそうですが、今回は手書きではないので、適当にフォーム抽出子を選んでみました。</b></font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/e13e2838-56b0-e247-b2ba-1934eac46cbb.png)

ここで、APIキーを発行して、テキストボックスに入力します。
APIキーはテキストなのでフォルダパス同様、ダブルクォーテーションで囲います。
####[APIキーの取得_CloudPlatform](https://cloud.uipath.com/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/f6cc8db8-2ed7-4565-94b4-cd7781ae3109.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/2c2c7695-48ed-680d-08b1-dec1768708d9.png)

「ドキュメントの種類のID」は、タクソノミーマネージャーを開いてコピペします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/4675322b-38c0-3e20-8b77-f0d0f235974b.png)
タクソノミーマネージャーで先ほど定義したページを開くと、ウインドウの右上にドキュメント種類IDが見つかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/ea2e37d6-839e-ba39-ef03-e5c9c2eba35b.png)


### [3-4]抽出子の「テンプレートを管理」で抽出内容の位置合わせを行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/fc67a363-2482-b33a-d352-7d47592642bf.png)

こんな感じで設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/7bff3acb-229f-dace-5f69-5be25fc2a84e.png)

設定ボタンをクリックすると、
テンプレートマネージャーが起動します。
※後で編集することもできます。

よくわからないので、とりあえず、OKボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/2fcd0220-8357-8c90-90e6-1f4553f116a4.png)

左側をご覧下さい。最初にタクソノミーマネージャーで定義した項目名称が並んでいます。
これから、右側にある請求書と紐づける作業を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/2eb55882-3906-3ec7-3c7d-ff6ba36eb39c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/edba0da0-c28a-1ca6-6caa-8d893edee296.png)

こんな感じです。

<b>＜1：トークンで選択＞</b>

最初に、ドキュメント内で一致情報を5か所くらい選択するらしいです。
間違った情報を抽出しないように、正しいドキュメントを読み込んでいるのかロボットがチェックしてくれるイメージでしょうか。
複数選択なので、点線の赤枠が出てきたら、「Ctrl＋左クリック」で5か所選択した後、「＋」記号をクリックします。
[![Image from Gyazo](https://i.gyazo.com/227f456c598166873a14bc7cd09d5b23.gif)](https://gyazo.com/227f456c598166873a14bc7cd09d5b23)

<b>＜2～5：カスタム選択＞</b>
[![Image from Gyazo](https://i.gyazo.com/a3a7874a1d20773b22aeffaecd801717.gif)](https://gyazo.com/a3a7874a1d20773b22aeffaecd801717)

保存した後、この画面になるのだが、今回使わなかったのでスルーしました。「閉じる」ボタンをクリックすると設定が完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/276fc35a-d2ef-b6dc-1d30-706c6252f523.png)

### [3-5]検証ステーションで人間が目視で精度を確認する
別の媒体に出力する前に人間が目視確認するためのプロセスです。
OCRの精度の答え合わせを人間がするイメージでしょうか。
実行すると毎回、検証画面が開くので本運用では配置しない方がいいかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/d482d8a6-0725-86f9-5904-7b224e3b66d7.png)

### 抽出子を設定
「抽出子を設定」のウインドウを開いて「フォーム抽出子」で抽出する項目にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/2ea9da51-983b-0a83-2057-74723b21a752.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/aaabe901-642b-a108-95d2-509fbfc4d688.png)


### [3-6]検証結果のエクスポート（Excelファイルに書き込み）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/662a093e-ff6d-f27d-75e8-df1fbbc4f8f9.png)
書き込み先ですが、Excelの1行目に項目名を入力したので2行目から書き込まれるよう、「A2セル」をセットしました。

抽出されたデータは、行単位で書き込まれます。
<b>＜実行前＞</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/d81a1fdf-1780-065c-e2cf-11b5b7544fa0.png)

<b>＜実行中：検証ステーションの起動＞</b>
合ってればチェックを入れてあげて、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/fcde9c4e-cf43-2364-7a99-751a429b3e0d.png)

<b>＜実行後＞</b>
期待していた通りの内容で書き込まれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/0b50bb1e-569b-3863-52f2-f68435b74476.png)



## [4]まとめ
いかがでしょうか。
OCR処理の精度が信頼できるようになったら、
検証ステーションのアクティビティを外して自動化が達成できそうですね。
手書きのアンケートをOCR処理するなど、応用例も時間があるときに挑戦したいと思います。
また、今回はデータ1件分の処理ですが、実務では大量の繰り返し処理が発生します。
今後ループ処理を実装したパターンも記事にしていきます。