Google Document AIでPDFの請求書を構造化データにしてみた

# はじめに
zacksanです。株式会社じげん沖縄支店で、リフォームマッチングサイト　リショップナビをはじめとした、リフォーム関連のサービス開発を担当しているエンジニアです。

今回は、営業担当者より「請求処理を楽にしたい」という要望があったので、[Google Document AI](https://cloud.google.com/document-ai)という請求書のデータ抽出に特化していそうなサービスを見つけたので試してみました。

[Google Vision API](https://cloud.google.com/vision)単体だとどこに何が書かれてるとか、ラベルとか取れないのですが、Google Document AIは、この読み取った項目をラベル付けして範囲情報(boundingPoly)と一緒に返却してくれるサービスのようです

# 準備手順
こちらの[手順](https://cloud.google.com/document-ai/docs/how-to)の通りに進めていきます。
※リンク先を見るとわかるかと思いますので、詳細は割愛いたします汗
####1. Document AI APIを有効化する
####2. サービスアカウントを作成し、アカウントキーを発行する
####3. プロセッサの作成
請求書の他にも、銀行明細書、領収書、アメリカの運転免許証、webの入力フォーム！などさまざまなタイプのプロセッサが用意されているようです。また自分でラベルを作成、ドキュメントを分類するようにモデルをトレーニングし独自のプロセッサを構築することもできるようです。
![プロセッサ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554264/4df37833-f68e-ded8-1e84-65c2beb8e454.png)

今回はInvoice Parserを使用してみました。ここで気付いたのですが、**まだUSリージョン、EUリージョンしか利用できない模様です。**
[Invoice Parserの仕様](https://cloud.google.com/document-ai/docs/processors-list#processor_invoice-processor)
**サポート言語に「Languages supported: Dutch, English, French, German, Spanish.」の記載がありました。**

# 試してみる
まずコンソール上でプロセッサのテストができそうだったので、私個人のGCPアカウントの請求書(¥0)で試してみました。
![名称未設定6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554264/dd953556-6b74-1efd-2b83-a1f4343aa8c4.png)

¥0の請求書で項目がラベル付けされてデータが取れているようです。
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554264/890f5094-33c2-db5f-d076-a980af0903a3.png)

APIでも試してみました。[APIの利用方法](https://cloud.google.com/document-ai/docs/send-request)
今回はmacからcurlで試しました。　
まずは前準備として、認証キーを環境変数に設定し請求書PDFをbase64エンコードします。

```sh
# 認証キーのパスを環境変数
$ export GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"
# 請求書PDFをbase64エンコード
$ base64 -i seikyu.pdf -o seikyu.txt
```

下記のJSONデータにbase64エンコードした請求書を設定して、seikyu.jsonとしてファイルに保存します。

```json:seikyu.json
{
  "skipHumanReview": true,
  "inlineDocument": {
    "mimeType": "application/pdf",
    "content": "前の手順で、base64エンコードした請求書データ"
  }
}
```

保存したjsonファイルを送信します。

```sh
# リクエストを送信 (エンドポイントは作成したプロセッサのものに置き換える)
$ curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @seikyu.json \
"https://LOCATION-documentai.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/processors/PROCESSOR_ID:process"
```

実行した結果は長すぎてこちらに載せる事ができないのですが、コンソール上で試したテスト結果のように項目と値、そして範囲情報データが返却されていました。
10ページを超えるものですと、バッチ実行により、非同期で結果を取得することになります。それより小さいものですと、APIのレスポンスで同期的に結果を返却してくれるようです。


# 気になった機能
プロセッサに人間による審査をトリガー設定することも可能のようです。検出の信頼性に不安なドキュメントがある場合もリスクを軽減できそうです。
![名称未設定7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554264/e3505711-bc60-b23e-f3a6-3dbe1916bfd8.png)

# 料金
[Document AI の料金](https://cloud.google.com/document-ai/pricing)
Invoice Parserは10ページごとに$0.1との記載がありました。（英語ページのみでしか確認できませんでした）
今回の検証では5回で¥58の請求でした。

# 感想
1からトレーニングした独自のモデルでラベル付けを行うとなると大変な作業になりますよね。
このサービスはGoogleが事前にトレーニングしたプロセッサをすぐに利用でき、文書から構造化されたデータを取得できるのでとても便利だと感じました。
手書きのものでも、料金部分に関しては比較的いい結果が返ってきました。

注意点としては英語だと企業住所などもラベルされていたのですが、日本語のものだとやはり認識されません。日本語サポートのプロセッサも拡充されてくるといいですね。

まだ検証は必要ですが、現状でも金額だけ抜き取るという用途であれば、ある程度はカバーできるのかなと思います。

GCPのドキュメントは手順書もわかりやすく、チュートリアルも豊富なので個人的に重宝しています。
今後もGCPサービス色々試してみたいと思います。以上です