パスワード付きpdfから文字列を抽出し、編集、及び、整形する作業の自動化をpythonのpyautoguiモジュールで実現します。
尚、今回は文字列をpdfから直接取得する方法をとりません。もっと具体的に言うと、PyPDF2やpdfminerなどのpdf操作のためのモジュールを利用せずに、pdfから文字列を取得して、編集、及び、整形します。
(むしろ、PyPDF2やpdfminerなどのpdf操作のためのモジュールで実現できなかったことを無理やりGUIで対応しようというものです。)
PyPDF2、pdfminerモジュールを利用したい場合は、以下をご参照ください。

プログラム実行で出来る成果物について
任意のフォルダに存在するLifeカードの利用代金明細書(pdf)から、本人カード、家族カードそれぞれの金額明細を抽出して、表計算ソフトに貼り付けます。
それぞれの金額明細を抽出することで、本人、家族それぞれのカード負担額を明確にします。
なぜこのプログラムを作成したか
Lifeカードの本人カード、家族カードそれぞれの合計額を出すための作業を自動化したかった為です。
Lifeカードの利用代金明細書では、1明細ごとに本人カード、家族カード別の記載はあるのですが、1明細が複数行になっている為、単純な表計算ソフトへの貼り付けだけでそれぞれの合計額を出すことが出来ません。
その為、次の様な作業を毎月手動で行う必要がありました。
毎月手動で行っていた金額明細の整形作業(このプログラムでやっていること)
- ダウンロードフォルダから最新のパスワード付きファイルを開く。
- 開いたファイルを全選択してコピー。
- サクラエディタを新規に開き、コピーした内容を貼り付け。
- 貼り付けた内容から余計な改行をタブ文字列に置換。
- テキストファイルとして保存。
- サクラエディタのgrep機能を利用して、保存したテキストファイルからキーワード(‘本人’)が記載されている行を抽出。
- 抽出した結果からキーワード行のみを残して、余分な行を削除。
- キーワード行の余分な文字列を削除。
- 表計算ソフトを立ち上げて、8.を貼り付け。
- 6.~9.をキーワードを変えて(’本人’’→家1’)再作業。
- 表計算ソフトを保存。
pythonのソースコード
作成したソースコードは以下です。
(ソースコード内に、コメントを記載したため、解説は割愛します。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
# coding : utf-8 import pyautogui as pgui import time, pyperclip, ctypes, os, glob import subprocess, configparser # 「本人\r\n」を「本人\t」に、「家1\r\n」を「家\t」に置換する。 def replaceSakuraStr(pgui, searchword): maeStr = r'\r\n' atoStr = r'\t' # 置換用ダイアログを表示 pgui.hotkey('ctrl','r') time.sleep(1) # 置換前の文字列を入力 #日本語のGUI入力はできない為、クリップボードに一度コピー pyperclip.copy(searchword + maeStr) # クリップボードの内容を貼り付け pgui.hotkey('ctrl','v') # 置換後の文字入力欄に移動 pgui.press('tab') time.sleep(1) # 置換後の文字列を入力 pyperclip.copy(searchword + atoStr) pgui.hotkey('ctrl','v') # 「すべて置換」を選択 pgui.hotkey('alt','a') time.sleep(1) # 置換した旨のメッセージで「OK」押下 pgui.press('enter') # 指定したファイル名でファイルを保存 def saveFile(filename): # 保存画面を表示 pgui.hotkey('ctrl','s') time.sleep(3) # ファイル名入力 pgui.write(filename) time.sleep(1) # 保存(OK) pgui.press('enter') time.sleep(2) # grep検索した内容を整形してクリップボードにコピー def grepSearchCopy(crdir, filename, searchword): # grep画面を表示 pgui.hotkey('ctrl','g') # 「現在のフォルダ」を指定 pgui.hotkey('alt','u') # 指定文字列を検索 pyperclip.copy(searchword) pgui.hotkey('ctrl','v') time.sleep(1) # 検索するファイル名を指定 pgui.press('tab') pyperclip.copy(filename) pgui.hotkey('ctrl','v') # 検索 pgui.press('enter') time.sleep(3) # 検索後、「Shift+↓」を11回押して、「DEL」し、余計なgrep結果文字列を削除。 # numlockが掛かっていた場合、解除 VK_NUMLOCK = 0x90 if ctypes.windll.user32.GetKeyState(VK_NUMLOCK): pgui.press('numlock') pgui.keyDown('shift') for i in range(11): pgui.press('down') pgui.press('del') pgui.keyUp('shift') time.sleep(2) # 不要な情報を置換処理で削除する # 削除する不要な文字列(ファイル名+行数+文字コードなど) filepath = crdir.replace('\\','\\\\') + '\\\\' + filename.replace('.','\.') replaceStr = filepath + '\([0-9]*,[0-9]\) \[SJIS\]: 1回' print(replaceStr) # 置換ダイアログを表示 pgui.hotkey('ctrl','r') time.sleep(1) # 置換文字列を指定 pyperclip.copy(replaceStr) pgui.hotkey('ctrl','v') # 置換後の文字列を指定(空文字) pgui.press('tab') time.sleep(1) pyperclip.copy('') pgui.hotkey('ctrl','v') # 「すべて置換」を選択 pgui.hotkey('alt','a') time.sleep(1) # 置換した旨のメッセージで「OK」押下 pgui.press('enter') time.sleep(1) # 残った文字列を全選択してクリップボードに切り取り pgui.hotkey('ctrl','a') pgui.hotkey('ctrl','x') def pasteStr(pgui): # クリップボードの内容を現在表示されているファイルに貼り付け pgui.hotkey('ctrl','v') time.sleep(1) pgui.press('enter') # 環境設定ファイルの読み込み config = configparser.ConfigParser() crdir = os.path.dirname(os.path.abspath(__file__)) config.read(crdir + '//setting.ini', encoding='utf-8') # setting.iniの要素を取得 pdfpassword = config['PROGRAM_INFO']['pdfpassword'] downloadpath = config['PROGRAM_INFO']['downloadpath'] filename = config['PROGRAM_INFO']['filename'] searchword1 = config['PROGRAM_INFO']['searchword1'] searchword2 = config['PROGRAM_INFO']['searchword2'] # ダウンロードフォルダの最新のファイル(pdf)を取得 list_of_files = glob.glob(downloadpath) latest_file = max(list_of_files, key=os.path.getctime) print(latest_file) # pdfファイルの展開 pro = subprocess.Popen(['start',latest_file], shell = True) time.sleep(10) # pdfパスワードの入力 pgui.press(pdfpassword) pgui.press('enter') time.sleep(1) # コピーしたい箇所をクリックして、カーソルを合わせる pgui.moveTo(500,600) pgui.click() time.sleep(2) # pdfの指定した箇所を全選択して、コピー pgui.hotkey('ctrl','a') pgui.hotkey('ctrl','c') time.sleep(1) # サクラエディタを展開(起動まで数秒待機) pro = subprocess.Popen(r'C:\Program Files (x86)\sakura\sakura.exe') time.sleep(3) # コピーした内容を貼り付け pgui.hotkey('ctrl','v') time.sleep(1) # 「本人\r\n」を「本人\t」に置換する。 replaceSakuraStr(pgui, searchword1) # 「家1\r\n」を「家\t」に置換する。 replaceSakuraStr(pgui, searchword2) # ファイルの保存処理 saveFile(filename) # 「本人」、「家1」をgrep検索をして結果を整形し、表計算ソフトへ結果を貼り付ける # 「本人」をgrep検索して、結果を整形し、クリップボードへ grepSearchCopy(crdir, filename, searchword1) # openoffice Calc の立ち上げ pro = subprocess.Popen(r'C:\Program Files (x86)\OpenOffice 4\program\scalc.exe') time.sleep(15) # クリップボードのgrepSearchCopy内容を現在表示されているファイルに貼り付け pasteStr(pgui) # 元の画面へ pgui.hotkey('alt','tab') time.sleep(3) # 「家1」をgrep検索して、結果を整形し、クリップボードへ grepSearchCopy(crdir, filename, searchword2) # 表計算ソフトの画面へ pgui.hotkey('alt','tab') time.sleep(2) # 貼り付け箇所を変えるために右に二つ移動 pgui.press('right') pgui.press('right') # クリップボードの内容を現在表示されているファイルに貼り付け pasteStr(pgui) # 保存 saveFile(filename.replace('.txt','')) |
setting.iniの内容
プログラム内で利用しているsetting.iniの内容は以下です。
<>の部分を自身の環境に差し替えて利用します。
1 2 3 4 5 6 |
[PROGRAM_INFO] pdfpassword = <pdfファイルのパスワード> downloadpath = <pdfが配置されているフォルダのパス>/* filename = <pdfファイルの内容を保存するファイル名>.txt searchword1 = 本人 searchword2 = 家1 |
事前準備
モジュールの導入
ソースコードの動作にはpythonのインストールに加え、pyautogui,subprocess, configparserモジュールの導入が必要です。
次のコマンドを実行します。
1 2 3 |
pip install pyautogui pip install subprocess pip install configparser |
pyautogui モジュールには、キーボード入力、マウス移動、ボタンクリック、マウスのホイール操作をシミュレートする関数があります。
簡単に言うと、人間の代わりにPCを操作することができます。
subprocess, configparserモジュールに関しては別の記事で詳しく説明しているので、よろしければそちらの記事もご覧ください。


サクラエディタ、Openoffice Calcの導入
このプログラムでは、サクラエディタ、Openoffice Calcが導入されていることを前提に作成されていますが、わざわざインストールする必要は無く、同じ処理が出来れば似た様なソフトウェアをそのまま利用することが出来ます。
その為、導入方法などはあえて記載しません。
サクラエディタは文字列の置換や、grep検索を、OpenOffice Calcは表計算ソフトとして利用しています。
尚、それぞれプログラムの147行目、169行目にプログラムの展開処理が記載されています。
終わりに
pyautoguiは、この様な作業以外にも任意のプログラムを実行してそこに別のプログラムからの値を貼り付ける作業などを自動化するのにも利用できます。
その為、今回の事例を元に仕事や生活上の繰り返し作業を自動化していければと考えています。
参考)その他の自動化の事例
webサイトへのログインの自動化

英語⇔日本語翻訳の自動化(Lineボット利用)

コメント