デスクトップ用 Power Automateを使って、無料で簡単にPDFを分割しました。

## デスクトップ用 Power Automate（PowerAutomateDesktop）（以下PAD）を使って、PDFデータを分割しました。

### 困った電帳法
突然ですが、電帳法、ご存じでしょうか。**電子帳簿保存法**です。
聞きたくない言葉出てきましたね。最初だけなので最後まで見てください。
よくわからないんですけど、電子で受領した書類をちゃんと保存しろよ、紙で貰っても保存しとけよ、作った書類も保存しとけよ、ってやつです。

それがどうしたかっていうと、一括で貰っている**何ページものPDF書類を1つずつのPDFに分ける**必要ができてたのです（今まではそのまま印刷していた）。
PDF分割するツールくらいあるだろ、と思うかもしれませんが、会社のパソコンって結構縛りがあるのです。有料ツールを申請したら使えなくもないのですが、そのためだけに使用料払うのももったいない。フリーツールもダウンロードできないです。

会計担当している人に聞くと、印刷とか駆使して、一枚のPDFを作成して、印刷・PDF・印刷・PDFというのを数10ページやってるという非効率極まりないことをしているみたいです。
![PDF力業.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800173/545a6c99-f4a9-3bb2-986c-b2f7882f1c15.jpeg)

たとえ月1回の作業とは言え、それに30分くらい時間がかかったり、漏れがあったりなど問題点が多いです。

### PADでPDF分割ができる
調べてみたら**PADを使えばできるらしい**ということで、作ってみました。
PADはMicrosoftの無料RPAツールで、Windows10、11の環境で利用できます。
うちの会社では申請したらダウンロードしてくれます。

それではPADでのPDF分割フローについて説明していきます。
<details><summary>フローはこちらからコピーできます。◆のところは編集してください。
</summary>
＿＿＿＿＿＿＿＿＿＿

Display.SelectFileDialog.SelectFile Title: $'''分割したいPDFを選んでね''' IsTopMost: False CheckIfFileExists: False SelectedFile=> SelectedFile ButtonPressed=> ButtonPressed
LOOP LoopIndex FROM 1 TO 1000 STEP 1
    Pdf.ExtractPages PDFFile: SelectedFile PageSelection: LoopIndex ExtractedPDFPath: $'''C:\\◆Users\\じぶんの\\Desktop\\新しいフォルダー◆\\%LoopIndex%ページ.pdf''' IfFileExists: Pdf.IfFileExists.AddSequentialSuffix ExtractedPDFFile=> ExtractedPDF
    ON ERROR
        GOTO Loopout
    END
END
LABEL Loopout
＿＿＿＿＿＿＿＿＿＿
</details>

![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800173/6ec846aa-55e0-806e-3ebb-7556d88669b5.jpeg)
こちらが全体のフロー図です。

5行で終わっているので、結構サラッと作れちゃいます。
それぞれの行でやっていることは、
①分割したいPDFを選ぶ
②1～1000まで繰り返す（10000でも100000でも良いです）
③デスクトップの新しいフォルダ（場所を変えれば好きなところ）に格納
④ループする場所。②に戻る
⑤ラベルの設定（後述）

ポイントとしては、③が肝になってきます。
![スライド2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800173/3dc6b9ca-02e0-b95c-4392-f5cda524783a.jpeg)

②～④をループさせて間の③の処理を1ページから終わるまで実行します。
画像にある「nページ」というのは、ループ回数で増えていきます。
「抽出されたPDFのファイルパス」というところについては、
**保存したい場所の後ろにファイル名と拡張子（.pdf）を付けてあげると名前がついて保存されます。**
ファイル名は変数を使うことができるので、ここではページ数を付けています。
なにもつけなければ、「ファイル名(1)」「ファイル名(2)」・・・となっていくと思います。

最後のページまでループが続いた時、エラーを吐いて終わってしまう（指定されたページが無い）ので、エラー発生時の設定をしておきます。


![スライド3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800173/447b3806-64c0-3352-27ac-5437cac13aa0.jpeg)
事前に作っておいた⑤のラベルがここで登場します。
**③でエラーが発生したときに、⑤のラベルに移動**という行動をとるように設定することで、最後のページまで進んだらループから抜けるフローになりました。

出来上がったフローを動かしてみるとこんな感じ。

![スライド4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800173/c170b34b-4cbf-1a75-fdfe-5f96f1924073.jpeg)
これで、PDFを数秒で1ページずつ分割して保存することができました。
フローを実行する前に、ファイル名のところに文書名を付けると、
「文書名nページ.pdf」のようになるので、アレンジできそうです。

フローを弄るのが怖い場合は、最初に「入力ダイアログを表示」で文書名を入れるフローを組み込んて、入力した文字変数を使って、「x nページ」みたいにしてみてもいいかもしれません。

<BR>

### 使わせてみた
さて、PDF分割するフローができましたよ、と実際業務をしている会計担当に使ってもらいました。

:::note info
「おお、さすが！めっちゃ便利ですね！！」
:::
:::note alert
「でもページ数では**中身がわかりません**」
:::

ですよね、わかってはいました。
今回作り始めたきっかけが、「業務完了確認書」という書類で、ページ毎にそれぞれの業務の内容が異なります。
たとえ「1ページ」が「業務完了報告書1ページ」となったところで、結局名前を付け直さないといけません。
PDFを分割できることが分かったのは良いけれど、これじゃ今一つ。

### PDFからテキストを抽出して名前を付ける
なにか良い策がないかと調べてみたら、**PDFのテキストを抽出する機能**があるらしい。
**「PDFからテキストを抽出」** という完全にソレじゃん！というアクションがありました。
早速使ってしてみました。


![スライド5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800173/9a4d1a6e-d4aa-9e07-9458-19e49c27bec8.jpeg)
「PDFからテキストを抽出」というアクションを使うと、そのPDFのテキスト情報が全部でてきました。
実際いろいろなPDFで試してみると、なかなか癖があります。
見たままの文字がそのまま出てくるとは限りません。
欲しいところだけ取るにはワンステップ必要です。

この出てきたテキストから、今回は「業務名称」というところをさらに抽出して、名前に入れたいです。

![スライド6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800173/ba9422bc-fae6-3dd7-376b-f98cfccd4cfc.jpeg)
これが完成後のフローになります。

テキストの抽出は「テキストのトリミング」というアクションを使いました。
先ほどの「業務名称」と「改行」の間をトリミングすることで、うまく業務名称を切り抜くことができました。
改行ですが、「テキストのトリミング」アクションのなかで、
「　
」
（改行）でトリミングしようとすると、空白ではできませんのようにエラーが出てきます。

 そこで、**「改行」という変数を作る**ことによって、認識させることができます。
どうするかというと、**右側にある、「入出力変数」** のところで、「改行」を作ることができます。
この「入出力変数」ですが、フローを共有する際には反映されませんので、**各自で作成してください。**「改行」だけでなく、「半角スペース」「全角スペース」なども作っておくと、テキストのトリミングの際に役立ちます。
※ちなみに、通常のフロー内でも改行やスペースの変数を作ることもできます。が、いろいろ試したところ、入出力変数でやった方が綺麗に切り取れる印象です。
<details><summary>フローはこちらからコピーできます。◆のところは編集してください。
</summary>
＿＿＿＿＿＿＿＿＿＿

Display.SelectFileDialog.SelectFile Title: $'''分割したいPDFを選んでね''' InitialDirectory: $'''C:\\Users\\matsumuraj\\Desktop''' IsTopMost: False CheckIfFileExists: False SelectedFile=> SelectedFile ButtonPressed=> ButtonPressed
LOOP LoopIndex FROM 1 TO 1000 STEP 1
    Pdf.ExtractTextFromPDF.ExtractTextFromPage PDFFile: SelectedFile PageNumber: LoopIndex DetectLayout: False ExtractedText=> ExtractedPDFText
    ON ERROR
        GOTO Loopout
    END
    Text.CropText.CropTextBetweenFlags Text: ExtractedPDFText FromFlag: $'''業務名称 ''' ToFlag: 改行 IgnoreCase: False CroppedText=> CroppedText
    Pdf.ExtractPages PDFFile: SelectedFile PageSelection: LoopIndex ExtractedPDFPath: $'''◆C:\\Users\\じぶんの\\Desktop\\新しいフォルダー◆\\業務完了確認書%CroppedText%.pdf''' IfFileExists: Pdf.IfFileExists.AddSequentialSuffix ExtractedPDFFile=> ExtractedPDF
    ON ERROR
        GOTO Loopout
    END
END
LABEL Loopout
＿＿＿＿＿＿＿＿＿＿
</details>
また、トリミングの場所はPDFや目的によって異なりますので、それぞれに合わせて作成してください。

<BR>

実行したら、こんな感じです。

![スライド7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800173/a2ddb4d0-5f7e-1c5b-261e-009109719b16.jpeg)

これにはさすがの会計担当もニッコリ。
「使います！またなにか作ってくださいね」と言って去っていきました。忙しそうです。
<BR><BR>
## まとめ
そんなこんなで今回は**PADでPDFを分割して、おまけに内容を抽出してそれぞれ名前を付けて保存するフロー**を作成しました。
いろいろ応用が効きそうなので、学びにもなりました。
また、**前半のPDF分割だけならすぐ作成できたのと、そこからさらにこうしたい、というのが出てきて、ちょっとしたことから手を出してみるというのも結構効果的だと感じました。**

PAD、サクッと作れる部分は作れて、手の込んだものも時間をかければ作れるので、なかなか便利です。**おすすめ**です。

それでは