PowerAutomateでPDFを1ページごとに1Excelシートに読み込む

まとめ

PowerAutomateで、PDFを1ページごとに1Excelシートに読み込みたい。一発で1ページずつ全ページを抽出できるような「アクション」は見当たらなかった。このため、ページ数をカウントアップさせながら1ページずつ抽出するようにした。

やりたいこと

PowerAutomateで、PDFを1ページごとに1Excelシートに読み込みたい。
でも、一発で1ページずつ全ページを抽出できるような「アクション」は見当たらなかった。このため、工夫して何とか取り込みたい。

環境

  • OS: Windows Pro 11  24H2
  • RPA: Power Automate for Desktop 2.58.000134.25188
  • Excel: Microsoft Excel for Microsoft 365 MSO (バージョン 2506 ビルド 16.0.18925.20076) 64 ビット

やったこと

概要

従来のRobin言語の方(Power FX ではない方)で作成してみた。
フローは、”Main” のみを使用。
取り込んだテキストを適当に分割する動作も入れてみた。
あとは、コード内の「コメント」として色々と記入した。

事前準備

アクション「新しい PDF ファイルへの PDF ファイル ページの抽出」で指定してある読み込みファイルや一時保存パスは、PCの中などに実際に用意しておく。

コード

以下に、一連のアクションをコピペする。

Excel.LaunchExcel.LaunchUnderExistingProcess Visible: True UseMachineLocale: False Instance=> ExcelInstance
/# PDFファイルの総ページ数を抽出する簡単な方法がないため、とりあえず1~50ページ目までをループさせることとする。#/
LOOP LoopIndex FROM 1 TO 50 STEP 1
/# アクション「PDFからテキストを抽出」すると、そのPDFファイルの中に存在しないページ数を指定するとなぜか最後のページのテキストが抽出されてしまうというバグのようなものがある。これは、ページを範囲指定した場合でも同様だった。
このため、そのアクションの代わりに別のアクション「新しい PDF ファイルへのPDF ファイル ページの抽出」を使い、PDFファイルの内容を1ページずつ新たなPDFファイルにいったん切り出してからそれを都度Excelの新シートに挿入するという方法をとることとした。
回りくどい方法だが、現状ではやむを得ない。#/
Pdf.ExtractPages PDFFile: $'''C:\\temp\\PDFテスト\\PDFテスト.pdf''' PageSelection: LoopIndex ExtractedPDFPath: $'''C:\\temp\\PDFテスト\\%LoopIndex%.pdf''' IfFileExists: Pdf.IfFileExists.Overwrite ExtractedPDFFile=> ExtractedPDF
ON ERROR
GOTO LoopEnd
END
Excel.AddWorksheet Instance: ExcelInstance Name: LoopIndex WorksheetPosition: Excel.WorksheetPosition.Last
Excel.SetActiveWorksheet.ActivateWorksheetByName Instance: ExcelInstance Name: LoopIndex
Pdf.ExtractTextFromPDF.ExtractText PDFFile: ExtractedPDF DetectLayout: False ExtractedText=> ExtractedPDFText
/# 必要に応じて、取り込んだテキストを複数セルに分割する。
これでうまくいかなければ、この前のPDFのテキストを読み込む動作にて、構造化のやつをONにしつつ読み込まないとだめかも。#/
Text.SplitText.Split Text: ExtractedPDFText StandardDelimiter: Text.StandardDelimiter.Space DelimiterTimes: 1 Result=> TextList
Excel.WriteToExcel.Write Instance: ExcelInstance Value: TextList
ON ERROR

END
END
LABEL LoopEnd
Excel.DeleteWorksheet.DeleteWorksheetByName Instance: ExcelInstance Name: $'''Sheet1'''

結果

とりあえず、1ページずつ1シートに取り出すことはできた。
でも上記だと、最大50ページまでのPDFしか対応できないので、状況に応じて数字を変えたりする必要はあるかも。
少し変更すれば、PDF内のテーブルを取り出したりすることもできそう。

タイトルとURLをコピーしました