2022年2月14日時点では、PowerAutomateDesktopにおいて、PDFを開かずに最終ページ番号を取得するアクションは実装されていないはずです。
(間違ってたらゴメンナサイ・・・)
PDFを開いて、UI要素として取得すれば簡単にできるかもしれません。
しかし、「Adobe Acrobat Reader」のインストールの有無により、PDFの立ち上がり方が変わってしまい、セレクタの設定次第では、UI要素の取得でエラーになってしまう可能性があります。
例えば、私の自宅PCの環境では、「Adobe Acrobat Reader」がインストールされていないので、Webブラウザの「Microsoft Edge」で立ち上がったりしますね。
フローを作成する以上、安定して運用できるようにしたいので、PDFを開かずに最終ページ番号を取得するフローを作成した、というわけです。
目次
1.サンプルPDF
サンプルとして、以下の有価証券報告書のPDFがあったとします。
下図の左上の赤枠にある最終ページ番号「156」を、PDFを開かずに取得します。
ちなみに、有価証券報告書は、導入事例で紹介しているEDINETで検索して取得したものです。
2.最終ページを判定するロジック
使用するアクションは「PDFからテキストを抽出」になり、「ループ条件」のWhileと組み合わせて使用します。
「PDFからテキストを抽出」の設定では、「抽出するページ」で「単一」を選択し、変数PageNoを増減させながら、テキストを抽出していきます。
「PDFからテキストを抽出」の仕様として、
最終ページ番号が156のPDFに対し、157以上のページ番号を指定した場合は、156ページと同じ内容を抽出することになり、これを最終ページ番号を判定するロジックとして使用します。
4ページ分PageNo~PageNo + 3の内容を、それぞれ4つの変数ExtractedPDFTextNext~ExtractedPDFTextNext3に格納し、その変数値を比較していきます。
変数値を比較しながら以下の①~④のループを繰り返し、②、または、③を満たした時点で、最終ページ番号を取得し、ループを抜けます。
②.ただし、①のうち、「A A A A」、かつ、PageNo = 1、の場合、そのPDFの最終ページ番号は1、つまり1ページしか存在しないPDFとなり、ループを抜けます。
③.4つの変数値が一つだけ異なる「A B B B」の場合は、左から2番目の変数ExtractedPDFTextNext2、つまり、ページPageNo + 1が最終ページ番号になります。
④.①~③に該当しない場合は、PageNoをプラス10増加させて再ループします。
ここでの増加量はプラス10以外でも良いのですが、経験的に、プラス10ぐらいが処理速度としてちょうど良い感じです。
3.フローの実行
本ブログの下方にある参考フローを実行すると、ファイルの選択ダイアログが表示されるので、最終ページ番号を取得したいPDFを選択します。
対象PDFを選択したら、最終ページ番号を取得するまでループし続け、処理が終わればメッセージが表示されます。
4.参考フロー
右上のコピーボタンを押せば、フロー全体をコピーできます。
PowerAutomateDesktopのMainフローに貼り付けることで、そのまま実行することができます。
Display.SelectFileDialog.SelectFile Title: $'''ファイルの選択''' FileFilter: $'''*.pdf''' IsTopMost: False CheckIfFileExists: False SelectedFile=> SelectedFilePDF ButtonPressed=> ButtonPressed
SET PageNo TO 1
LOOP WHILE ($'''true''') = ($'''true''')
Pdf.ExtractTextFromPDF.ExtractTextFromPage PDFFile: SelectedFilePDF PageNumber: PageNo ExtractedText=> ExtractedPDFText
Pdf.ExtractTextFromPDF.ExtractTextFromPage PDFFile: SelectedFilePDF PageNumber: PageNo + 1 ExtractedText=> ExtractedPDFTextNext
Pdf.ExtractTextFromPDF.ExtractTextFromPage PDFFile: SelectedFilePDF PageNumber: PageNo + 2 ExtractedText=> ExtractedPDFTextNext2
Pdf.ExtractTextFromPDF.ExtractTextFromPage PDFFile: SelectedFilePDF PageNumber: PageNo + 3 ExtractedText=> ExtractedPDFTextNext3
IF (ExtractedPDFText = ExtractedPDFTextNext AND ExtractedPDFTextNext = ExtractedPDFTextNext2 AND ExtractedPDFTextNext2 = ExtractedPDFTextNext3) = $'''true''' THEN
IF PageNo = 1 THEN
SET LastPage TO 1
EXIT LOOP
END
Variables.DecreaseVariable Value: PageNo DecrementValue: 1 DecreasedValue=> PageNo
ELSE IF (ExtractedPDFText <> ExtractedPDFTextNext AND ExtractedPDFTextNext = ExtractedPDFTextNext2 AND ExtractedPDFTextNext2 = ExtractedPDFTextNext3) = $'''true''' THEN
SET LastPage TO PageNo + 1
EXIT LOOP
ELSE
Variables.IncreaseVariable Value: PageNo IncrementValue: 10 IncreasedValue=> PageNo
END
END
Display.ShowMessageDialog.ShowMessage Title: $'''最終ページ''' Message: LastPage Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed