Power Automate Desktop: Acrobat を使ってPDFのページ数を取得

Power Automate for Desktop の機能で PDFファイルのページ数を調べるのは容易ではないという話を書きました。

Power Automate DesktopでPDFのページ数を取得するのは難しい


Acrobat で取得する

原始的ですが、Acrobat を起動してプロパティからページ数を取得する方法を書いてみます。

全体の流れは次の通りです。

1. 「フォルダー内のファイルを取得」アクションで、フォルダー内の PDF ファイルを取得します。

変数はデフォルトの Files です。


2. 「For each」アクションで、Files から一つずつファイルオブジェクトを取得し、処理します。

ファイルオブジェクトは CurrentItemに代入されます。


3. 「アプリケーションの実行」アクションで、PDFファイルを開きます。

アプリケーションパス」acrobat.exe
コマンドライン引数: %CurrentItem.FullName%

コマンドライン引数に /n %CurrentItem.FullName% を指定するとMDIインターフェイスでも別インスタンス(別ウィンドウ)で開かれます。こちらの方がベターかもしれません。

アプリケーション起動後には「アプリケーションの読み込みを待機」を指定します。効果はないかもしれません。

メインウィンドウのハンドルを取得できないことが多いので、「エラー発生時」をクリックし、「詳細」の「アプリケーションのメインウィンドウハンドルを取得できません」で、「フロー実行を続行する」を選択します。



4. 「ウィンドウの取得」アクションで「フォアグラウンドウィンドウ」の情報を取得します。

ウィンドウの情報が AutomationWindow に保存されます。

本当は「アプリケーションの実行」アクションでウィンドウハンドルを取得できるのがベストなのですが、なぜかエラーが発生するため、やむを得ずフォアグラウンドウィンドウ(手前の)の情報を取得しています。

私の環境では待機なしで取得できていますが、遅いPCなどの場合には、この前にWaitが必要かもしれません。


5. 「キーの送信」アクションで、Acrobatに対して、Ctrl+D を送信し、PDFファイルのプロパティを開きます。

キーの送信先: ウィンドウインスタンス/ハンドル
ウィンドウインスタンス: %AutomationWindow%
送信するテキスト: {Control}({D})

(ウィンドウが複数開いている時のために AutomationWindow を指定しています)


6. 「ウィンドウにある UI 要素の詳細を取得する」アクションでページ数のテキストを取得します。

UI要素にはページ数を指定します。

属性名は OwnText を取得します。

問題なければ、 AttributeValue にページ数が保存されます。


7. 「ウィンドウ内のボタンを押す」アクションで、キャンセルボタンを押します。

追加した UI 要素のウィンドウは、タイトルに表示されたファイル名に関連づいているため、そのままでは別のファイルを処理する際にウィンドウが見つからなくなります。

そのため、ウィンドウを開きます。


属性 Name のチェックを外し、セレクターからファイル名の制限を外します。

Acrobat がSDI(Single Document Interface。ウィンドウごとに一つの文書を表示するインターフェイス)で起動されていて、既に別のウィンドウで文書が開かれていると、UI要素を見つけることができずエラーになります。

そのため、ウィンドウを識別するウィンドウハンドルをウィンドウに埋め込みます。MDI(Multi Document Inteface。ウィンドウに複数の文書を開くインターフェイス。Acrobat の場合はタブで切り替え)でしか使わないという方は不要です。

(Acrobatの「環境設定」で、「一般」の「同じウィンドウで新しいタブとして文書を開く」のチェックが外れていると SDI モードになります)

通常の画面では入力できないので、テキストエディターに切り替えます。

条件追加後のセレクターは次の通りになります。

:desktop > window[Process="Acrobat"][handle="%AutomationWindow.Handle%"]

最初、ダブルクォーテーションがないため正しく動作していませんでした。

アサヒロボ研さん、ありがとうございます!

Window Handleって何?


8. 「キーの送信」アクションで、ファイルを閉じます。

ウィンドウインスタンス: %AutomationWindow%
送信するテキスト: {Control}({W})

「アプリケーションの実行」でコマンドライン引数に /n をつけている場合は MDI であっても別ウィンドウで開かれます。そうすると Ctrl-W だとウィンドウが残ってしまいます。

/n オプションを使った場合は、{Control}({Q}) でアプリケーションを終了した方が良いでしょう。


Edge版も作りました

Edgeの方がシンプルで速いです。また、Acrobatがなくても動作するのでこちらの方が良さそうです。Chromium 版です。

Power Automate Desktop: Edge を使ってPDFのページ数を取得


Acrobat Proなら簡単かも

先日、Photoshopの自動化を調べていたら、COMオブジェクトなる単語が出てきて驚きました。ってことはPhotoshopはVBAから制御できるのでは?

そして、参照設定を見ると、なんとPhotoshopだけでなく、Acrobatの文字もあるではないですか!?

下の方にIllustratorも見えてます

これを使えばVBAから操作できるのでは? VBScriptを使ってPower Automate for Desktopからもページ数を取得できるのでは!? と期待に胸を膨らませました。

ドキュメントオブジェクトのPDDocにはGetNumPagesなる、いかにもページ数を取れそうなメソッドもあります。

実際に取得方法が説明されているページがありました。

AcroExch.PDDoc: GetNumPages メソッド


だがしかし、Acrobatのインスタンスを取得するところでエラーが発生しました。調べると、どうやら、有料版の Acrobat Pro だとできるような話がありました…


コメント

アクセス数の多い投稿

セキュリティ対策ソフトのノートンが詐欺ソフトまがいになってしまってショック

ZIPファイルを開こうとすると、展開を完了できません、と言われる

Excel 2019 クエリが原因で日本語入力の一文字目が勝手に確定する

オカムラ家具のOAチェアー、コンテッサを分解清掃

突然滅茶苦茶遅くなったPCがWindows Updateのキャッシュクリアで復活

Excelのテーブルに行や列を挿入する際のエラー

ChatGPTが日本語からVBAのコードを生成できてたまげる

Windows セキュリティーのビックリマークが消えない

Power Automate Desktopでブラウザでダウンロードしたファイルを処理する

Excel VBAからODBCを使ってデータを簡単に取得する