デスクワークを超絶快適にするおすすめギアたち詳しく見る

【初心者向け】PADでPDFのすべての表をExcelに出力する方法!

じょじお

Win11に標準搭載されたMicrosoft の無料ツールPADでPDFの表を簡単に抽出できるようになりました。

この記事でわかること!

  • Power Automate for desktopを使ってPDFの中の表(テーブル)を抽出する方法がわかる。
  • Power Automate for desktopを使って抽出したPDFの表データをExcelに書き出す方法がわかる。
目次

PDFから表を抽出してExcelに書き込みたい。

▲PDFの表をExcelにコピペすると、図のようにレイアウトが崩れてしまいます。Windowsユーザなら無料で使用できるMicrosoftのPower Automate for desktop(PAD)ならレイアウトを保持したままExcelに出力できるようになりました。

PADでPDFから表を抽出する方法は?

PDFから表を抽出するには「PDFからテーブルを抽出する」アクションを使います。このアクションは2022年2月に追加された新しいアクションです。

PDFから表を抽出するには「PDFからテーブルを抽出する」アクションを使う!

PADの「PDFからテーブルを抽出する」アクションを使ってみた。

じょじお

実際にPDFからテーブルを使ってみました。

フローの作成手順

STEP
Power Automate for desktopを起動して新規フローを作成します。
STEP
ターゲットPDFを用意します。
PADでPDFからテーブル(表)を抽出
member-list.pdf

▲今回使用するPDFです。ちょうど、新年度になり関連会社様からチーム体制変更のPDFを頂いたのでそれを模して作りました。中身はプログラムによって自動生成されたダミーデータです。社内ではOutlookの連絡帳やSharepointリストに落とし込みたいのですが、PDFのままではデータ化できないので一旦エクセルにしたいという動機です。

STEP
「PDFからテーブルを抽出する」アクションを追加します。
PADでPDFからテーブル(表)を抽出

▲「PDFからテーブルを抽出する」アクションはPDFグループにあります。最初にこのアクションを追加します。

PADでPDFからテーブル(表)を抽出

▲パラメータを入力します。一番上の「PDFファイル」にPDFファイルのパスを入力します。

  • 抽出するページ:すべて
  • (オプショナル)パスワード:空白
  • ページの余白を超えるテーブルをマージする:オン
  • 最初の行に列名を含める:オン

生成された変数:ExtractedPDFTables

STEP
ここで一回フローをテスト実行します。
じょじお

一回フローを実行してみましょう。フローデザイナー上部の実行ボタンをクリックしてフローを実行します。

PADでPDFからテーブル(表)を抽出

▲フローを実行したら「ExtractedPDFTables」変数を確認してみると2つの表を抽出できていることがわかります。これは元PDFデータに表が2つあるからです。PDFによって取得できる表の数は変わります。表のひとつの「詳細表示」をクリックしてみます。

PADでPDFからテーブル(表)を抽出

▲Datatableを含むいくつかのプロパティが確認できます。実際の表データはDatatableプロパティに入ってますのでDatatableプロパティの「詳細表示」をクリックして確認してみます。

▲Datatableプロパティに表データを確認できました。

じょじお

データを取得できていることがわかりましたら次のステップに進みExcelに書き出す処理を作成していきます。

ぽこがみさま

PDFに表が2つあるためDatatableも2つ作成されました。書き込み処理を2回行う必要があるので、ループの中に書き込み処理を作るとよさそうですね。

STEP
Excelの起動アクションを追加します。
PADでPDFからテーブル(表)を抽出
STEP
Excelへの出力方法を確認します。
じょじお

今回は新しいExcelファイルを開いて、1つの表につき1つのExcelシートに書き込もうと思います。

ぽこがみさま

なのでまず、表の数だけExcelファイルにシートを用意する処理を作ります。

PADでPDFからテーブル(表)を抽出
Excelの出力結果のイメージ

▲出力結果のイメージです。2つ表があるのでシートを2つ追加しています。シートの追加アクションを2回追加してもいいのですが、それだとこのほかのPDFファイルで使えません。他のPDFにも対応できるように、PDFの表の数を自動で読み取って、表の数に合わせてシートを追加するように処理を作っていきます。

STEP
「if」アクションを追加します。
じょじお

Excelファイルは新しく開くと1枚シートがあります。なのでPDFの表が2個以上の時だけExcelシートを追加するように「IFアクション」を使って表の数を判定します。

PADでPDFからテーブル(表)を抽出

▲パラメータを入力します。表の数は%ExtractedPDFTables.Count%プロパティで確認できます。

  • 最初のオペランド:%ExtractedPDFTables.Count%
  • 演算子:以上である(>=)
  • 2番目のオペランド:2

変数をかんたんに入力する方法!

PADでPDFからテーブル(表)を抽出

▲パラメータの入力ボックステキストボックスところにある{x}をクリックすると

PADでPDFからテーブル(表)を抽出

▲変数の一覧が展開するので「ExtractedPDFTables」をクリックし「.count」を選択します。「選択」ボタンをおすと変数を入力できます。

じょじお

手入力はタイプミスによるエラーの原因になります。なるべく上記のようにマウス操作で入力しましょう!

ぽこがみさま

配列のプロパティなど、手入力でないと入力できないケースもあるのでその場合は手入力します。

STEP
ifアクションの内側に「Loop」アクションを追加します。
じょじお

ifアクションの中に「Excelにシートを追加する処理」を作っていきます。

PADでPDFからテーブル(表)を抽出

▲パラメータを入力します。

  • 開始値:1
  • 修了:%ExtractedPDFTables.Count – 1%
  • 増分:1
ぽこがみさま

「表の数より1少ない回数(%ExtractedPDFTables.Count – 1%)だけ、ループしてくださいねー」という意味です。

STEP
Loopの内側に「新しいワークシートの追加アクションを追加します。
PADでPDFからテーブル(表)を抽出

▲パラメータを入力します。

  • Excelインスタンス:%ExcelInstance%
  • 新しいワークシートの名前:%LoopIndex%
  • 名前をつけてワークシートを追加:最初のワークシート
STEP
「For each」アクションを追加します。
じょじお

ここからは書き込みの処理を作っています。ExtractedPDFTables変数に格納された表の数だけループしたいので「For each」を使います。

▲パラメータを入力します。

  • %ExtractedPDFTables%
STEP
(For eachの内側)「変数の設定」アクションを追加します。
PADでPDFからテーブル(表)を抽出

▲パラメータを入力します。この変数は、ループ実行のたびに1ずつ増やすことによって操作シートをコントロールするために使います。(イテレーター)

  • 変数:NewVar
  • 値:%NewVar + 1%
STEP
(For eachの内側)「アクティブなExcelワークシートの設定」アクションを追加します。
PADでPDFからテーブル(表)を抽出

▲パラメータを入力します。

このアクションは、Excelの複数シートの中で今からどのシートを操作するかを設定するためのアクションです。Excelを操作するフローを作るときで、シートが2枚以上あるときは必ず使うかなーと思います。

先程追加した変数NewVarをワークシートインデックスに設定しています。これによって1回目のループ実行時はシート1をターゲットとし、2回目のループ実行時はシート2をターゲットとすることができます。

  • Excelインスタンス:%ExcelInstance%
  • 次と共にワークシートをアクティブ化:インデックス
  • ワークシートインデックス:%NewVar%
STEP
(For eachの内側)「Excelワークシートに書き込み」アクションを追加します。①ヘッダーの書き込み

PDFの表データはDatatable型変数として格納される。

PDFデータは、%ExtractedPDFTables%の中にDatatable型変数として格納されます。Datatable型変数はヘッダー行(列見出し)はデータとヘッダーを別々に保持します。

PADでPDFからテーブル(表)を抽出
  • ヘッダー:.DataTable.ColumnHeadersRow
  • データ:.DataTable
じょじお

上記の両方ともExcelに出力したいので、ここから書き込みアクションを2つ作っていきます。

PADでPDFからテーブル(表)を抽出

▲パラメータを入力します。1行1列目を基準にヘッダーを書き込みます。

  • Excelインスタンス:%ExcelInstance%
  • 書き込む値:%CurrentItem.DataTable.ColumnHeadersRow%
  • 書き込むモード:指定したセル上
  • 列:1
  • 行:1
STEP
(For eachの内側)「Excelワークシートに書き込み」アクションを追加します。②データの書き込み
PADでPDFからテーブル(表)を抽出

▲パラメータを入力します。表のデータ部分を書き込みます。

  • Excelインスタンス:%ExcelInstance%
  • 書き込む値:%CurrentItem.DataTable%
  • 書き込むモード:指定したセル上
  • 列:1
  • 行:2

▲A2セル(行2列1)からデータを書き込みます。

STEP
フロー完成図
フロー完成図
じょじお

以上でフローが完成しました。次のステップでフローを実行してみましょう。

フローの実行結果

フローを実行すると上の図のようなExcelファイルを出力することができました。

【コピペで使える】今回作成したフローのRobinソースコード

Pdf.ExtractTablesFromPDF.ExtractTables PDFFile: $'''C:\\Users\\user\\Downloads\\member-list.pdf''' MultiPageTables: True SetFirstRowAsHeader: True ExtractedPDFTables=> ExtractedPDFTables
Excel.LaunchExcel.LaunchUnderExistingProcess Visible: True Instance=> ExcelInstance
IF ExtractedPDFTables.Count >= 2 THEN
    LOOP LoopIndex FROM 1 TO ExtractedPDFTables.Count - 1 STEP 1
        Excel.AddWorksheet Instance: ExcelInstance Name: LoopIndex WorksheetPosition: Excel.WorksheetPosition.Last
    END
END
LOOP FOREACH CurrentItem IN ExtractedPDFTables
    SET NewVar TO NewVar + 1
    Excel.SetActiveWorksheet.ActivateWorksheetByIndex Instance: ExcelInstance Index: NewVar
    Excel.WriteToExcel.WriteCell Instance: ExcelInstance Value: CurrentItem.DataTable.ColumnHeadersRow Column: 1 Row: 1
    Excel.WriteToExcel.WriteCell Instance: ExcelInstance Value: CurrentItem.DataTable Column: 1 Row: 2
END

# [ControlRepository][PowerAutomateDesktop]

{
  "ControlRepositorySymbols": [],
  "ImageRepositorySymbol": {
    "Name": "imgrepo",
    "ImportMetadata": {},
    "Repository": "{\r\n  \"Folders\": [],\r\n  \"Images\": [],\r\n  \"Version\": 1\r\n}"
  }
}

▲このコードをフローデザイナーにコピペすると今回作成したフローをご自身のPADで再現することができます。

PDFのファイルパスだけをご自身の環境に変更すれば動作します。PDFに表が1個もない場合の例外処理や、Excelを保存して閉じる処理を適宜追加すれば実用的になるかなと思います。

特定の表だけを抽出するには?

今回作成したフローでは、ループを使ってすべての表をExcelに書き出しました。

▲そうではなく特定の表を指定して操作するには下図のようにインデックス番号を指定します。1個目の表はExtractedPDFTables[0]、2個目の表はExtractedPDFTables[1]に格納されます。インデックスは0から開始するので注意してください。

▲1個目の表のデータテーブルはExtractedPDFTables[0].Datatableです。

「PDFからテーブルを抽出する」アクションの仕様・エラー

「PDFからテーブルを抽出する」アクションの仕様や起こりうる例外(エラー)については下記の公式ドキュメントをご確認ください。

https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/actions-reference/pdf#extracttablesfrompdfaction

PDF操作の関連記事

Power Automate for desktopには、これ以外にもPDFを扱う便利なアクションがあります。

まとめ

じょじお

以上、Power Automate for desktopで新しく追加された「PDFからテーブルを抽出する」アクションを試してみました!

ぽこがみさま

このブログではRPA・ノーコードツール・VBA/GAS/Pythonを使った業務効率化などについて発信しています。
参考になりましたらブックマーク登録お願いします!

Power Automate学習教材

Power AutomateをKindleで学びたい方はコチラ

▲Kindleと紙媒体両方提供されています。デスクトップフロー、クラウドフロー両方の解説がある書籍です。解説の割合としてはデスクトップフロー7割・クラウドフロー3割程度の比率となっています。両者の概要をざっくり理解するのにオススメです。

Power Automate for Desktopの基本をしっかり学習するのにオススメです。RPA界隈では有名なRPAエンジニア集団である『ロボ研』さんが監修されている解説書です。テスト用の業務Webシステム/デスクトップ業務アプリを使いながら実践形式で学習できる点が一番のメリットかなぁと思います。

Power Automate クラウドフローの入門書です。日本語の解説書は数少ないのでレアかと思います。変数の解説から代表的なアクションの解説がされているので初心者におすすめの本です。

Microsoft 365/ Power Automate / Power Platform / Google Apps Script…

Power Automateを動画で学びたい方はコチラ

▲Udemyで数少ないPower Automateクラウドフローを主題にした講座です。セール時は90%OFF(1200円~2000円弱)の価格になります頻繁にセールを実施しているので絶対にセール時に購入してくださいね。満足がいかなければ返金保証制度がありますので安心してご購入いただけます。

この記事が気に入ったら
フォローしてね!

シェアしてくれたらウレシイ(·:゚д゚:·)
  • URLをコピーしました!
  • URLをコピーしました!
目次
閉じる