Power Automate DesktopでPDFのページ数を取得して特定のページ以降を別ファイルに出力（ループなし・Edge不使用）

# 1.やりたいこと
* 総ページ数が可変のPDFファイルから、特定のページ以降を別ファイルとして出力したい
（例：PDFから2ページ目以降を別ファイルとして出力したいが、PDFによって総ページ数が15ページの場合や20ページの場合がある）
* 1ページ1ファイルではなく、特定ページ以降を1つのファイルとして出力したい

# 2.問題点
* Power Automate Desktop（以下、PAD）のアクション「新しい PDF ファイルへの PDF ファイル ページの抽出」を使用する場合、「ページ選択」パラメーターにページインデックスを指定しなければならない
* 特定のページ以降～最終ページまでを指定したい場合、事前に総ページ数を取得しておく必要がある
* PADにはページ数を取得するためのアクションは存在しない
~~用意してくれればいいのにね~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/ed643074-60cd-928f-e010-11fe6fb23699.png)

https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/actions-reference/pdf#extractpages

# 3.調べたこと
「Power Automate Desktop PDF ページ数 取得」などで検索しました。

https://qiita.com/MiyakeMito/items/a233326b51d889356e68

↑ 今回出力したいファイルは1つのみでループ処理がないため、この方法では実現が困難・・・

https://www.travel-and-mylife.com/2022/02/extracted-pdf-tables.html

↑ 費用面で制限があり、Acrobat導入は断念しました。
またなるべく他のアプリケーションを介したくなかったので、Edgeを使用しない方法がないか模索しました。


# 4.試したこと
「新しい PDF ファイルへの PDF ファイル ページの抽出」アクションの「ページ選択」パラメーターで以下を設定し実行してみます。

* **最終ページインデックスを未指定**
本来は「2-15」のように指定すべきところを、「2-」と最終ページ未指定で実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/392c919f-b4c0-0042-2a40-8a1da19a15e7.png)
**[結果] 怒られた**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/5b3e0c72-49dd-555f-3578-fd750f6e7030.png)

* **最終ページインデックスをありえない数値に指定**
とりあえず1000ページにしてみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/56b040d7-0e8d-86e7-7f35-340cf0dba755.png)
**[結果] やっぱり怒られた**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/cdfb697b-ffef-8d2a-b954-919ba2155585.png)
しかしエラー詳細を見ると、律儀にも存在しないページの番号が全て記述されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/a67cd566-3a02-cf14-3b91-ed08825b5d00.png)
ちなみにエラーメッセージ全文をメモ帳にコピペするとこんな感じ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/8c8b2f71-9621-f090-a7d1-f70b2fa6ecbb.png)

「ページ番号16~1000は存在しません」ということは、15ページまでは存在するってことですね・・・？
ということで、このエラーメッセージを利用して強行突破してみます。


# 4.実装方法
全体のフローは以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/d3159ebf-e012-0100-b0c0-f450cb6e61a1.png)


以下、使用したアクションの詳細
★ここでは便宜上PDFファイルのパスなどを各アクションに直接入力してるけど、よいこのみんなはちゃんと変数に格納してね★
★変数名もちゃんと分かりやすいものに変えてね★

**①新しい PDF ファイルへの PDF ファイル ページの抽出**
PDFパスなどは任意のものを設定
ページ選択：任意のページ番号-ありえない数値
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/d38f6017-c766-d56f-dfb0-bd2a9925ca98.png)
→このアクションはわざとエラーを発生させる用なので、ページ選択の最終ページインデックスには絶対にありえない数値を指定する必要がある

「エラー発生時」の設定に移り、「フロー実行を続行する」「次のアクションに移動」と設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/c5524cf2-fd69-2972-b21e-f47d4e636411.png)


**②最後のエラーを取得**
パラメーターはそのままでOK
→ここまで実行すると、「4.試したこと」で確認したようにずらーっと存在しないページ番号情報が取得できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/2362a54d-8db9-6eac-7654-71776209829c.png)


**③テキストのトリミング**
元のテキスト：②で取得したエラー情報
モード：指定されたフラグの**前**にあるテキストを取得
終了フラグ：,
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/d033292c-fd26-dcad-65b6-f49a9813184e.png)
→ここまでで実行すると変数「CroppedText」（元々はエラー情報）が以下のように少しスッキリする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/f489f121-6088-564a-64aa-99e416743a80.png)

**④テキストのトリミング**
元のテキスト：②で取得したエラー情報
モード：指定されたフラグの**後**にあるテキストを取得
終了フラグ：'
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/ffa11f57-8c26-3e35-572f-16b2a267dc1b.png)
→ここまでで実行すると変数「CroppedText2」に存在しないページ番号の1番目の数字のみが残る
もう一息です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/9bb264f1-4fa8-fa65-f0bb-c3f8311e7146.png)

**⑤テキストを数値に変換**
変換するテキスト：④でトリミングした変数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/7cd7f8cf-89f0-54a7-639a-3b5488625d57.png)

**⑥変数を小さくする**
変数：⑤で数値に変換した変数
小さくする値：1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/0a21acdb-4950-8e30-54b0-af12ca622452.png)
→⑤までで取得した値は、「存在しないページ番号の1番目」だったので、その1つ前（存在する最後のページ番号）を取得するために値を小さくする
→ここまで実行すると変数「TextAsNumber」にPDFの総ページ数が入る

**⑦新しい PDF ファイルへの PDF ファイル ページの抽出**
ページ選択：任意のページ番号-⑥で値を小さくした変数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/be6e00f9-c64d-5474-aa36-03c4a2e80689.png)

完成です。
まずは総ページ数が15ページのPDFファイルを指定して実行してみます。
実行後、変数「TextAsNumber」に総ページ数「15」がきちんと入っていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/740967c8-bbda-f3e2-13ad-09fb8e5289ed.png)
出力されたPDFも意図した通りでした。

続いて総ページ数が18ページのPDFファイルを指定して実行してみます。
こちらも実行後、変数「TextAsNumber」に総ページ数「18」が入っていました。
PDFも意図した通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780252/afea8bdd-5221-f4ae-d16f-8ee24a82cf4e.png)


# 5.注意点
力業なので正直推奨される方法ではないと思います。
でも要望があってどうしても実現したい場合には使えるかな、と！
一見何をしてるのか分かりにくいので、コメントアクションなどを活用した方が良いですね。
未来の自分の首を絞めないためにも！