はじめに
Power Automate for Desktop(以下、PAD)が、Win11に標準搭載された事で今後の市民開発者向けRPAの決定版になりそうです。なんと言ってもMicrosoft謹製かつ無料です。ライトユーザーにとっては余程の事がない限り、取り敢えずPADを使ってみようと言う事になりそうです(PADを入れるとWifiが使えなくなるという不便なところもありますが...)。
RPA初心者の方でもある程度の作法を覚えれば、気軽に業務の自動化に取り組めるようになります。ただし、RPAですのであらかじめ提供されている機能(PADでは、アクションと呼びます)には限りがあるのも事実です。PADが得意なアクションと得意ではないアクションがあります。たとえば、業務ではエクセルやPDFを扱うことが非常に多いと思います。流石にMicrosoftのRPAですので、エクセルの自動化に関するアクションは充実しています。流石にVBAのようにはいきませんが、ライトユーザーが手軽に使う分には申し分ないように思います。ところが、PDFの扱いは少しコツが必要です。PDFが単一ページであれば問題ないのですが、複数ページとなるとPADでの取り扱いが途端に難しくなります。複数ページのPDFを自動化する場合は、ページ数を取得したり、単一ページのPDFに分割したりする必要があります。PADのアクションで結合のアクションはあっても、分割のアクションが無いので自分でPDFを分割するフローを作成しなければなりません。PDFの分割にはコツが必要でフローの実行に時間もかかります。株式会社パワートレインさんがPADだけでPDFを分割するフローをYoutubeで紹介されています。PADだけで実現出来るのは素晴らしいのですが、少しだけ実行に時間がかかってしまいます。
今回の記事でやりたい事
このような時は、隣にいるPythonが得意な方に手伝ってもらってPADに機能を追加して更に便利に使い倒しましょうというのが今回の記事です。
近い将来は市民開発者とソフトウェアエンジニアが共存するようになると、どこかの書籍かガートナーの記事で目にした覚えがあります(うろ覚えで申し訳ございません)。
市民開発者は、比較的簡単な業務の自動化などを自分たちで実現し、IT部門は基幹システム開発や市民開発者の支援にまわるようというような棲み分けが出来てきそうです。
ですので、市民開発者の方は遠慮せずにIT部門やPythonが得意な人にお願いしてPADを便利に使いましょう(無理矢理な理屈ですが、遠慮がちな方には言い訳が必要ですよね)。
*Pythonが使える人が隣にいるのであれば、PAD使わずにPythonでRPAを作成すれば良いじゃないというのは言わない約束でお願いいたします。PythonのRPAにご興味があれば、Amazonで拙著を探していただけますと幸いです。
Pythonが得意な人に頼む事
Pythonは汎用的なプログラミング言語で、さまざまなアプリを開発できます。PADが不得意なPDF操作も、Pythonであれば非常に簡単に実装出来ます。
PADでもPythonスクリプトを実行出来ますが、なんと2022年12月時点でPython2です!?
Python2をサポートしているライブラリーを探すのも難しいので、Python2の標準ライブラリーで出来る範囲でしか使えないと思った方が良いでしょう。
そうしますと、PDF分割も含めてPythonをPAD内で使う意味がほとんどありません。
今回は、Pythonが得意な方にPDFを分割するpdfsplit.exeを作成して貰い、PADからそのexeファイルを実行してPDFを分割するようにします。Pythonが得意な方が隣に居ない場合は、こちらからexeファルをダウンロードする事が出来ます。Pythonが少し使えるので、自分でexe化を作成するという方は以下のコードを参考になさって下さい。
from pathlib import Path
import PyPDF2
path = Path.cwd()
for pass_obj in path.iterdir():
if pass_obj.match('*.pdf'):
reader = PyPDF2.PdfReader(pass_obj)
for i in range(len(reader.pages)):
page=reader.pages[i]
writer=PyPDF2.PdfWriter()
writer.add_page(page)
filename=str(Path(pass_obj).stem) + str(i+1) + '.pdf'
newfilepath=path/filename
with open(newfilepath,mode='wb') as f:
writer.write(f)
pass_obj.unlink()
Pythonのexe化は、pyinstallerやcx_freezeが有名です。筆者は、ファルが肥大化せずに動作も早いcx_Freezeをよく使います。
cx_Freezeで必要になるsetup.pyも参考で載せておきますので、参考になさって下さい。
cx_Freezeのドキュメントは、こちらを参照ください。https://cx-freeze.readthedocs.io/en/latest/index.html
from cx_Freeze import setup, Executable
excludes = ['PyQt4','PyQt5','tkinter']
base = None
setup(
name='pdfsplit',
version='1.0',
description='Split multi-page PDF file to single-page PDF files',
options={'build_exe':{'excludes':excludes}},
executables=[Executable('pdfsplit.py', base=base)]
)
pdfsplit.exeの使い方
cx_Freezeでexe化が完了すると、画像のようなpdfsplit.exeファイルと関連ファイルが保存されたフォルダーが作成されます。このフォルダーをご使用のPCに保存します(配布して貰います)。今回は、フォルダー名をpdffilesとしました。使い方と動作は非常にシンプルです。
- pdffilesフォルダー直下のpdfsplit.exeと同じ階層に分割対象のPDFを保存する。
- PADでpdfsplit.exeを実行する。
- pdffilesフォルダーに分割されたPDFが連番付きで保存され、元のPDFファイルは削除される。
PAD側の操作
分割対象のPDFファイルをcx_Freezeで作成したpdfsplit.exeと関連ファイルが格納されているpdffilesフォルダーに保存します。
今回の分割対象のPDFファイルは、7ページあります。
PADでこのpdfsplit.exeファイルを実行して、分割対象のPDFを連番付きで分割します。
アクションペインから「アプリケーションの実行」アクションを選択します。
アプリケーションの実行の詳細設定画面が現れますので、「アプリケーションパス」と「作業フォルダー」を指定します。アプリケーションパスには、pdfsplit.exeを指定します。作業フォルダーには、pdfsplit.exeと分割対象のPDFが格納されているフォルダーを指定します。
この1アクションだけで、PDF分割が実行出来ます。実行ボタンを押して動作を確認します。
PDF分割は重たい処理ではありませんので、処理自体は一瞬で終わります。先ほどのフォルダーを確認すると、分割対象のPDFが連番付きで1ページずつに分解され、元のファイルが削除されています。
おわりに
Power Automate Desktopは、RPAの裾野を確実に広げてくれる素晴らしいツールです。
これまで以上に、多くの方が気軽にRPAを使った業務の自動化に取り組めるようになります。
自動化が面白くなってきて、あれもこれもやりたくなってきた時にPADでは出来ない事が多いことに気づきます(もしくは、物凄く回り道しないと出来ない事)。
今回はPDF分割機能をPADに追加しましたが、Pythonではそれ以外にもさまざまな処理を比較的簡単に実現する事が出来ます。
PDF分割の機能だけではなく、ページ数の取得、PDF各ページへのスタンプの追加など他の機能も含めてexe化してしまいPAD側から呼び出して
使う事も出来ます。PADとexeファイルとのデータのやり取りも少し工夫が必要ですので、それについては次回の記事で紹介いたします(本当は、記事を分けるつもりがなかったのですが時間切れでした)
PADで見つからないアクションがあれば、Pythonが得意な人に相談してみて下さい。大抵のことはPythonとその関連ライブラリーで実現する事が出来ます。
Pythonが得意な人にお願いして、今回のようにPADに機能を追加して更に便利に使いこなしましょう。