【Blue Prism】PDFファイルを開いてテキストを読み取る

# はじめに
仕事をする上でPDFファイルを使う機会は多いのではないでしょうか。
本記事では、**PDFファイルを開き、本文をコピーし、データアイテムに出力する**までの流れを
自動化してみたいと思います。

# 前提条件
* Blue Prism ver6.8
* Adobe Acrobat Reader DC ver2022.002.20212 (**64bit**)

# PDFファイルを開く
PDFファイルを開く方法はいくつかありますが、
ここでは一番簡単な「Start Process」アクションを使った方法をご紹介します。

### Start Process

プロセスを新規作成し、以下のようなページを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780586/34ea9c51-f598-e902-6670-a891971bf2d4.png)

**データアイテム「PDFファイルパス」**
| データ型 | 初期値 |
|:-:|:-:|
| テキスト | (開きたいPDFファイルの完全パス) |

**アクションステージ「PDFファイルを開く」**
　ビジネスオブジェクト：Utility-Environment
　アクション：Start Process
| 入力 | 値 |
|:-:|:-:|
| Application | データアイテム「PDFファイルパス」 |

※Argumentsは空でOK

# PDFファイルの操作
オブジェクトを新規作成します。
開いたPDFファイルに<INS>アタッチ</INS>をしないとテキストを読みとることが**出来ない**ためです。
ここでは「アタッチ」と「テキストを読み取る」アクションを作っていきます。

### アプリケーションモデラー
アプリケーションモデラーを設定します。
下に載っていない項目は、デフォルトのまま「次へ」で進めてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780586/ba367df5-281d-2199-80e8-7b920132ebd9.png)
**＊補足1**
ウィンドウタイトルが指しているのは、以下画像の箇所です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780586/2702e50d-03b8-0d05-ec43-311629537f61.png)
対象アプリケーションを起動している時、どの画面でも必ず表示されている文字を見つけて、
その文字の前後にワイルドカード(*)を置いて、これをウィンドウタイトルとします。
`*Adobe*`

**＊補足2**
Windwosプロセス名は、タスクマネージャーの詳細タブから確認出来ます。
プロセス名は画像赤枠で囲った部分です。**拡張子は含めないでください！**
![タスクマネージャー詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780586/ff0f5cce-714d-df30-b699-8c7570015df0.png)
※PDFファイルは1つしか開いていないのですが、上記画像見ますと、タスクが2つ実行されています。
　これはAdobeの仕様で、ファイルを開くと、デフォルトで「保護モード」がオンになります。
　
簡単にまとめますと、
　1.保護モードがオンだと、Adobeのタスクが自動で2つ生成される（設定でオフにはできる）
　2.人間にはAdobeが**1つ**だけ起動しているように見えますが、Blue Prismは**2つ**起動していると認識するため、どちらでもいいので一方のタスク(プロセス)にアタッチ(紐づけ)する必要がある

ということです。

### 要素スパイ

アプリケーションモデラ―が設定出来たら、次は要素スパイです。

スパイモードはAA(Active Accessibility)モードを使います。
スパイする要素は1つのみで、以下画像の範囲(赤枠)をスパイします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780586/366f150b-b048-332f-df76-9cf3e158687b.png)
AAモードで要素をスパイした後、デフォルトで取得した属性一覧のうち、
次の条件に当てはまるものはチェックをオフにするのが推奨されています。
* 値が空白
* 親(Parent)属性のもの　※
* 可視(Visible)
* 有効(Enabled)
* 要素カウント
* URL

※親属性の中には要素一致に必要なものが含まれていることもあるので、1つずつハイライトしながらチェックしてください。

不要な属性のチェックを外すと以下のようになります(多少の差異はあるかもしれません)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780586/6b030757-3a00-9602-5755-507dac874a4a.png)


### アクション

スパイが完了したら、次の2つのアクションページを作成します。

**1.アタッチ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780586/7d6dce5b-2cf9-4599-eabf-9210f196bc47.png)


* 読み取りステージ「アタッチ読み取り」のプロパティ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780586/473cf4cb-94d8-02af-6822-86cb9335b01f.png)
* 判断ステージ「アタッチ済み？」のプロパティ
式フィールドに、データアイテム「アタッチ結果」を貼り付けるだけでOK

* 操作ステージ「アタッチ」のプロパティ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780586/37362114-932c-97d0-7540-189f07b1b9fd.png)

| 氏名 | データ型 | 値 |
|:-:|:-:|:-:|
| ウィンドウタイトル | テキスト | "\*Adobe\*"  |
| プロセス名 | テキスト | "Acrobat" |

　

**2.テキスト読み取り**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780586/19e1a584-4358-16d6-95a4-acd6379f3f61.png)

* 操作ステージ「PDFの内容をクリップボードに取得」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780586/469d34ad-8ded-1331-05b2-da37723a1514.png)
<font color="red">**①,②**</font>にはそれぞれ以下の入力プロパティを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780586/79696209-453e-256e-f6e6-30f55cfcf8ec.png)

| 氏名 | データ型 | 値① | 値② |
|:-:|:-:|:-:|:-:|
| テキスト | テキスト | "^a" | "^c" |

　
* アクションステージ「クリップボードの値を取得」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780586/c8bd4897-215c-f310-7d0a-6e52967d8810.png)


# 実行
今作ったオブジェクトを、冒頭で作成したプロセスから呼び出してみて、一連の流れを実行してみます。
冒頭作りかけのフロー図に、作ったオブジェクトのアクションをそれぞれ呼び出したものを配置しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780586/c50d3870-c502-6287-6c79-7e1a8e93a46b.png)

↓アクション「テキスト読取」からの返り値をプロセスで受け取れるようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780586/3bbbbc09-7043-da35-7844-1bbd5cf6bebf.png)

　
実行結果がこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780586/1a6d2991-f340-21df-74b4-cf4405d0af41.png)

PDF終了アクションを作り忘れたのでPDFが開きっぱなしになっていますが…
PDFの本文を全選択した名残(テキストに青色が被さっている)が残っていますね。
また、データアイテムを見ると、テキスト自体は読み取れていました。

# 終わりに
PDFファイルを読み取りたいときは、以下がポイントです。
・Start ProcessでPDFファイルを開く
・PDF操作オブジェクトを作成する

ご覧くださりありがとうございました。

# 参考記事
[【RPA】Blue PrismでPDFからデータを読み取ってみよう](https://ciprogram.jp/rpa/get_mufg_rate/)
[保護モード（Windows）](https://helpx.adobe.com/jp/reader/11/using/protected-mode-windows.html)