【UiPath】PDFからURLを抽出する【RPA】

# はじめに
UiPathのバージョン
* UiPath Studio 2023.12.0 Community Edition

RPAツールでPDFを処理する方法を
実際に作成して勉強になったのでその振り返りを記載する。

作成したRPAは以下のように動作する。
* 指定のPDF内に記載されているURLをテキストファイルへ書き出す。
* 書き出す他に、URLをブラウザで開く。（動作時に実行するか選択可能）

# 準備メッセージ
一番初めに動作内容を選択させるため「入力ダイアログ」アクティビティを使用する。
入力の種類は「複数選択」で。
* URL抽出のみ
* ブラウザでURLも開く

選択した選択肢は、「入力した値」（変数：Select_Result）に格納する。
![240111_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608279/81cfd956-4c0b-5bc3-1dc8-48e4d1792a8c.png)

その後、URLを書き出す先のテキストファイルを選択するようにメッセージを表示する。
![2401111_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608279/bbe9278f-d9bd-537d-b80b-eab363703886.png)

# ファイルを選択
準備メッセージで案内したPDF、書き出す先のテキストファイルは
「ファイルを参照」アクティビティを使用する。

PDFファイル、テキストファイル以外を選択しないようにファイルの種類は指定する。
ファイルパスはそれぞれ変数に格納する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608279/cbfa8054-3f8e-9f21-dd9d-5d960f7d6e3f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608279/073320ec-7692-928e-b09c-8cc3fbfe6382.png)

# PDFのテキストを抽出
「PDFのテキストを抽出」アクティビティを使用する。
PDFのファイルパス変数をそのまま書くとエラーになるので、以下の形式で書く必要がある。

```
LocalResource.FromPath(ファイルパス)
```
また、今回はOCRをオンにするとPDF内の文章を
上手く抽出できなかったので「OCRを適用」はオフに設定。
抽出したテキストはこの後処理したいので変数（pic_Text）に格納する。
![240111_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608279/23cfe70d-009c-5974-b9c4-6e49a3e4b1df.png)

# テキストからURLを取得
今回はURLを取得したいので、「テキストを取得」アクティビティを使用する。
先ほどテキストを格納した変数を「ソーステキスト」に設定。
抽出対象は「URL」を選択する。

また、重複OK、ベースURL以降も情報が欲しいので、
「重複を無視」、「ベースURLのみを抽出」はどちらも「オフ」に設定。
![240111_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608279/4c3e4f6d-c56b-91fc-fd0a-2bfc943c4f4c.png)

取得したすべてのURLは変数（pic_ALL_URL）に格納する。
この時の変数はString型ではなく、
IEnumerableのString型に設定する必要がある点は留意する。
![240111_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608279/27af3807-0ed1-979b-123c-7af7a64c8922.png)


### テキストを取得アクティビティについて余談
ソーステキスト内にて、URLの途中に改行や半角スペースが入っていると、
それ以降の文字列はURLの続きと見なされない。
例えばソーステキスト内で以下のように書かれている場合は
```
https://hogehoge.co
.jp/main/…

https://example. co.jp/index/…
```
 `https://hogehoge.co` や`https://example.`までしか取得できない。

その為、ここら辺、うまく取るならAIに投げたらいい感じに処理できるかもしれない。
UiPathにAI関連のアクティビティが追加されていたので。
 ~~今のところAIをほぼ触ったことないので完全に想像~~ 
 
RPAで処理して欲しい情報だけを切り取り（定型的な作業）、複雑な情報処理になりそうな箇所はAIに任せるというバランスを取ると両者ともうまく活用できそう。

両者を使い分けると、AIには余分な情報を与えずに済む、RPAにはバージョンアップ時に発生し得るアクティビティのエラーを回避できる、RPAの改修が少なく済みそうではある。

# 取得したURLをデータテーブルに格納しつつURLをブラウザで開く
 ### 取得したURLをデータテーブルに格納
IEnumerableのString型の変数に入れているURLを
テキストファイルに書き出したいのでデータテーブルにURLを格納。
データテーブルをテキストファイルに書き出すことにする。

データテーブルを用意し、1度クリアして、まっさらにしておく。

![240111_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608279/ad04abbd-a2f6-a000-2672-c5b888949056.png)

その後、変数に格納されているURL数分ループするよう
「繰り返し(コレクションの各要素)」アクティビティを使用する。

ループ内では、URLを1つずつデータテーブルに格納する為に
「メソッドを呼び出し」アクティビティを使用する。


 ### URLをブラウザで開く
ループ内で「メソッドを呼び出し」後は、
準備メッセージ時にURLをブラウザで開くを選択した場合に
URLをブラウザで開くよう「条件分岐」アクティビティを使用する。

「URLに移動」アクティビティは、
「アプリケーション/ブラウザーを使用」アクティビティ配下で
使用する必要がある。

![240111_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608279/32bb4015-e9d6-3f35-5dfd-b0b7a1c9ff08.png)

１つのウィンドウ内で、タブを追加してURLを開く形としたいので、「アプリケーション/ブラウザーを使用」アクティビティは画像のように値を設定する。
「画面上でターゲットを指定」でブラウザを指定する。
開いたブラウザを変数（active_Window_1）に格納する。

また、タブを追加するアクティビティがない事、
ブラウザのウィンドウ以外に対してキーを入力したくない事から
「キーボードショートカット」アクティビティを使用する。
開いたブラウザの変数に対して、
タブを追加するキー（Ctrl+T）を入力するよう設定する。

# データテーブルをテキストでファイルに書き込み
「データテーブルを出力」アクティビティを使用する。
変数（Table_1_Text）はString型のデータテーブルの値が格納されている。
「テキストファイルに書き込み」アクティビティで
その変数を書き込み先のテキストファイルに書き込む。

![240112_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608279/61996440-21df-9d1b-0fea-d3e70329b582.png)

 # 終了メッセージ
 案外終わっていることに気づきにくいので最後に終了メッセージを出しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608279/33c016be-d7d7-ec0c-a2e3-e2248513e68f.png)

# 振り返り
今回のRPA作成を通して、PDFの内容を処理する方法について知ることができた事と、
どのようなRPAを作成するか考える際に、複雑な処理が途中で入ってしまう場合や、
UiPathのアクティビティでは処理が難しい場合にはAIと組み合わせることで、
より色々なRPAを作成できると思った。
実際、UiPathの公式ブログを調べてみると
RPAでは複雑な部分はAIでは処理できるような事を言っていた。

https://www.uipath.com/blog/automation/ai-rpa-differences-when-to-use-them-together

次回RPAを作成する際にはAIと組み合わせたものを作ってみるのも面白いかもしれない。