Document Information ExtractionのAPIを外部から呼び出す

# はじめに
この記事は[SAP Advent Calendar 2024](https://adventar.org/calendars/10423)の12月15日分の記事として執筆しています。

# Document Information Extractionとは
画像からデジタルデータを抽出するためのBTPソリューションです。
PDFやJPEGの帳票等から金額、品目、伝票番号等を読み取ることが主要な用途です。
後述するBuild Process Automationと相性が良いサービスで、Build Process Automationにも組み込まれています。
長ったらしいのでアルファベット3文字で言いたいところですが頭文字をとってしまうと"〇ね"になってしまうのでどう略すのかと調べたところ["DOX"](https://community.sap.com/t5/technology-q-a/sap-btp-document-information-extraction-service-ca-ml-bdp/qaq-p/12780743)だそうです。

チュートリアルはこちら↓
[Use Generative AI to Process Business Documents](https://developers.sap.com/mission.gen-ai-process-business-documents.html)

## Schemaとは
DOXを使って情報抽出処理を共通化したデータの型のこと。
例えば'DeliveryNote'というSchemaには、ヘッダに'伝票番号、'得意先名、明細には'品目コード'、'数量'といった項目を定義すれば、それらに対応する値を抽出できます。

## Templateとは
スキーマの情報を帳票の画像データのどこから読み取るのかを定義したものです。スキーマの項目と画像上の文字を紐づけたものです。

## SAP Build Process Automationとは
主にワークフローをTriggerとし、様々な処理を自動化するローコードツールです。
略称はBPAです。
下記のチュートリアルでは、フォームでローカルのPDFのInvoiceを読み取って、'金額'や'伝票番号'といった情報を読み取っています。
[Invoice Processing and Approval Using SAP Build Process Automation](https://developers.sap.com/mission.invoice-processing-approval-spa.html)

# やりたいこと：DOXを外部からCallしたい
上記の２つのチュートリアルを実際にやってみてわからなかったのが、BPAで作成したスキーマやTemplateがDOXに表示されなかった事です。(逆も同様でした)

* BPA
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/c6c44fca-adb8-db1b-6331-58c858a81d61.png)

* DOX
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/9ae45421-e906-6ee7-b9d8-c8f1b0f5beb2.png)

DOXは単体で運用するツールではなく、Build Process Automation等の外部のサービスからCallして使うものだと思います。
この記事では**DOXで作ったTemplateを外部からAPIで呼び出す手順**を解説したいと思います。

# 手順1:Boosterを実行してService Instanceを作成・起動する
手順はこちら↓
[Use Free Tier to Set Up Account for Document Information Extraction and Get Service Key](https://developers.sap.com/tutorials/cp-aibus-dox-free-booster-key.html)

チュートリアルのStep2:Run boosterの4-7はやらずに済みましたが理由わかりません。
出来上がるとこのようにインスタンスのサービスキーが入手できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/4b7aaf06-6666-16b1-ad39-63b2a1a43a13.png)

# 手順2:AccessTokenを入手する
手順はこちら↓
[Get OAuth Access Token for Document Information Extraction via Web Browser](https://developers.sap.com/tutorials/cp-aibus-dox-web-oauth-token.html)

Step1:Get OAuth access token detailsについては記事のとおりでしたが、Step2:Get OAuth access tokenは記事の通りだとうまくいきませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/7c58c7dc-48dd-36ba-fc76-6772f4911566.png)

なのでこちらの[APIの定義](https://help.sap.com/docs/document-information-extraction/document-information-extraction/get-access-token?locale=en-US&q=template)を参考にPOSTMANからリクエストを送ってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/f01bc6e8-afc3-b9fd-64b8-544a991d84c1.png)

IDをPWで認証していることから、Basic認証だということがわかるので、`client_id`と`client_secret`はUserNameとPasswordに入れてあげます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/83cb9476-13de-a9ca-6338-0a45262cd0a0.png)

うまくいけばStatusCode200とAccessTokenが返されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/c7f8282b-7777-d60a-4d50-5d92f832a543.png)

# Step3:SwaggerでAPI動作テストを行う
手順はこちら↓
[Use Machine Learning to Extract Information from Documents with Swagger UI](https://developers.sap.com/tutorials/cp-aibus-dox-swagger-ui.html)

Step4:Delete clientを実行し、Clientを削除したらDOX側でも何もアクセスできなくなるので注意。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/afc1ea1a-cce9-6d44-a0f9-d4eca9f28b85.png)

# Step4: PostmanからAPIをキックしてみよう

以下の通りURLを連結させることで、一般のRestClientからAPIをキックすることが可能です。
* URL
[service keyのuaaセクションの外部の方の`url`] [service keyの`swagger`] [各APIのパス(/hoge)]

* Authorization
Auth Type: OAuth2.0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/4ffff964-0762-f094-78c2-cfacf182fe2e.png)

* Bodyタグ
以下のように、SwagerのAPI仕様と同じようにパラメータを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/f6cf6cb6-5527-16e2-1f82-30448b0b4254.png)

* 結果
下記の通りきちんと動作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/78c23e3d-baf1-6653-433d-1b6b51f8fe38.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/e1a256a7-4930-65d5-765a-3c0a49e5c3b7.png)

# おわりに
これでDOXをHTTPリクエストで使うことができるようになったので、BPAをはじめスクラッチで作ったアプリや3rdPartyツールからも利用できるようになります。
ただいちいちインスタンスを立てたりRESTで呼び出す設定をするのも面倒なので、BPAから直接DOXを呼び出せるようになったらよいのになと思うのですが、何かやり方あるんですかね。
ご存じのかたコメント頂けると嬉しいです。