PDF アクション

【PowerAutomateDesktop】PDFを開かずに最終ページ番号を取得する

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を開かずに取得します。
pdf_pageno

ちなみに、有価証券報告書は、導入事例で紹介しているEDINETで検索して取得したものです。

 

2.最終ページを判定するロジック

使用するアクションは「PDFからテキストを抽出」になり、「ループ条件」のWhileと組み合わせて使用します。
extract_text

 

「PDFからテキストを抽出」の設定では、「抽出するページ」で「単一」を選択し、変数PageNoを増減させながら、テキストを抽出していきます。
extract_a_page

 

「PDFからテキストを抽出」の仕様として、
最終ページ番号が156のPDFに対し、157以上のページ番号を指定した場合は、156ページと同じ内容を抽出することになり、これを最終ページ番号を判定するロジックとして使用します。

4ページ分PageNo~PageNo + 3の内容を、それぞれ4つの変数ExtractedPDFTextNext~ExtractedPDFTextNext3に格納し、その変数値を比較していきます。

変数値を比較しながら以下の①~④のループを繰り返し、②、または、③を満たした時点で、最終ページ番号を取得し、ループを抜けます。

①.4つの変数値がすべて同じ「A A A A」の場合は、すでに最終ページを超えていると判断し、PageNoをマイナス1して再ループします。

②.ただし、①のうち、「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を選択します。
select_pdf

 

対象PDFを選択したら、最終ページ番号を取得するまでループし続け、処理が終わればメッセージが表示されます。
extract_result

 

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

-PDF, アクション
-