1.やりたいこと
- 総ページ数が可変のPDFファイルから、特定のページ以降を別ファイルとして出力したい
(例:PDFから2ページ目以降を別ファイルとして出力したいが、PDFによって総ページ数が15ページの場合や20ページの場合がある) - 1ページ1ファイルではなく、特定ページ以降を1つのファイルとして出力したい
2.問題点
- Power Automate Desktop(以下、PAD)のアクション「新しい PDF ファイルへの PDF ファイル ページの抽出」を使用する場合、「ページ選択」パラメーターにページインデックスを指定しなければならない
- 特定のページ以降~最終ページまでを指定したい場合、事前に総ページ数を取得しておく必要がある
- PADにはページ数を取得するためのアクションは存在しない
用意してくれればいいのにね
3.調べたこと
「Power Automate Desktop PDF ページ数 取得」などで検索しました。
↑ 今回出力したいファイルは1つのみでループ処理がないため、この方法では実現が困難・・・
↑ 費用面で制限があり、Acrobat導入は断念しました。
またなるべく他のアプリケーションを介したくなかったので、Edgeを使用しない方法がないか模索しました。
4.試したこと
「新しい PDF ファイルへの PDF ファイル ページの抽出」アクションの「ページ選択」パラメーターで以下を設定し実行してみます。
-
最終ページインデックスを未指定
本来は「2-15」のように指定すべきところを、「2-」と最終ページ未指定で実行
[結果] 怒られた
-
最終ページインデックスをありえない数値に指定
とりあえず1000ページにしてみた
[結果] やっぱり怒られた
しかしエラー詳細を見ると、律儀にも存在しないページの番号が全て記述されています。
ちなみにエラーメッセージ全文をメモ帳にコピペするとこんな感じ↓
「ページ番号16~1000は存在しません」ということは、15ページまでは存在するってことですね・・・?
ということで、このエラーメッセージを利用して強行突破してみます。
4.実装方法
以下、使用したアクションの詳細
★ここでは便宜上PDFファイルのパスなどを各アクションに直接入力してるけど、よいこのみんなはちゃんと変数に格納してね★
★変数名もちゃんと分かりやすいものに変えてね★
①新しい PDF ファイルへの PDF ファイル ページの抽出
PDFパスなどは任意のものを設定
ページ選択:任意のページ番号-ありえない数値
→このアクションはわざとエラーを発生させる用なので、ページ選択の最終ページインデックスには絶対にありえない数値を指定する必要がある
「エラー発生時」の設定に移り、「フロー実行を続行する」「次のアクションに移動」と設定
②最後のエラーを取得
パラメーターはそのままでOK
→ここまで実行すると、「4.試したこと」で確認したようにずらーっと存在しないページ番号情報が取得できる
③テキストのトリミング
元のテキスト:②で取得したエラー情報
モード:指定されたフラグの前にあるテキストを取得
終了フラグ:,
→ここまでで実行すると変数「CroppedText」(元々はエラー情報)が以下のように少しスッキリする
④テキストのトリミング
元のテキスト:②で取得したエラー情報
モード:指定されたフラグの後にあるテキストを取得
終了フラグ:'
→ここまでで実行すると変数「CroppedText2」に存在しないページ番号の1番目の数字のみが残る
もう一息です。
⑤テキストを数値に変換
変換するテキスト:④でトリミングした変数
⑥変数を小さくする
変数:⑤で数値に変換した変数
小さくする値:1
→⑤までで取得した値は、「存在しないページ番号の1番目」だったので、その1つ前(存在する最後のページ番号)を取得するために値を小さくする
→ここまで実行すると変数「TextAsNumber」にPDFの総ページ数が入る
⑦新しい PDF ファイルへの PDF ファイル ページの抽出
ページ選択:任意のページ番号-⑥で値を小さくした変数
完成です。
まずは総ページ数が15ページのPDFファイルを指定して実行してみます。
実行後、変数「TextAsNumber」に総ページ数「15」がきちんと入っていますね。
出力されたPDFも意図した通りでした。
続いて総ページ数が18ページのPDFファイルを指定して実行してみます。
こちらも実行後、変数「TextAsNumber」に総ページ数「18」が入っていました。
PDFも意図した通りです。
5.注意点
力業なので正直推奨される方法ではないと思います。
でも要望があってどうしても実現したい場合には使えるかな、と!
一見何をしてるのか分かりにくいので、コメントアクションなどを活用した方が良いですね。
未来の自分の首を絞めないためにも!