日常業務を省力化を図っております。
一か月前に、「月初エクセル集計処理を完全自動化し、100人日掛かっていた作業を一秒で処理した話。【完成版】を書きました。→https://qiita.com/naiveprince0507/items/3e4d322f7f1c3068487a
それの第2弾となります。
===========
1.状況説明
下記の様な、顧客別に送付するPDFファイルがあったとします。
客先にメールで送信する際に、それぞれのpdfファイルに、別個のパスワードでZIP暗号化を掛けて、客先送信すると言う事はよくあると思います。
2.普通のやり方
PW自動生成ソフトやサイトを使って、PWを作成して、それを一つずつコピペして、LhaplusみたいなZIP暗号化ファイル作成ツールを使って、一つずつ暗号化ファイルを作成していく必要があります。
パスワード作成サイト→ https://www.luft.co.jp/cgi/randam.php
3.「普通のやり方」の課題
言うまでもなく、面倒くさい。
「ABC CoにはこのPWで、OPQ Coには、あっちのPW」と整理するのも面倒。
この例では、たった3つのPDFだが、実務では、数十のPDFを処理するので、3人日位は普通に掛かった。
4.省力化
Pythonで一秒で処理する。
PWを作成するPythonモジュールのpyminizipを使います。
このサイトが一番分かり易かった。
pyminizipによりzipファイルにパスワードを設定する【Python】→ https://self-development.info/pyminizip%E3%81%AB%E3%82%88%E3%82%8Azip%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%80%90python%E3%80%91/
私はWindows10環境でやりましたが、pyminizipの環境設定(Microsoft C++ Build Toolsのインストール)で少し詰まりました。
「pyminiziはMinizipのPython用Wrapper」なので、Microsoft C++ Build Toolsのインストールが必要との事。(ここは、詳しく上記記事に書いてあります。)
5.最終コード
下記になります。
まず、pyminizipでPWをpdfの数だけ作成し、その後、作成したPWを順番にPDFにアサインしてZIPファイルを作成する。
最後に、ファイル名(顧客名)とPWを紐づけたPWリストを吐き出す。
<2021年8月6日、プログラム修正>
インデントが一部(2か所)変だったので、修正。
また、実行後、Warningがでるので、"warnings.simplefilter("ignore")"で消した。
import os
import string
import secrets
import pyminizip
import warnings
warnings.simplefilter("ignore")
def pass_gen(size=12):
chars = string.ascii_uppercase + string.ascii_lowercase + string.digits
return ''.join(secrets.choice(chars) for x in range(size))
fileExt=r".pdf"
print([_ for _ in os.listdir() if _.endswith(fileExt)])
x=[_ for _ in os.listdir() if _.endswith(fileExt)]
y=[]
for i in range(len(x)):
z=pass_gen(10)
print(z)
y.append(z)
i=i+1
print(y)
for j in range(len(x)):
pyminizip.compress(x[j], "", "zipped_"+x[j]+".zip", y[j], 0)
continue
j=j+1
f=open('pw_list.txt','w',encoding='UTF-8')
for j in range(len(x)):
f.write("Name: "+x[j]+" / "+"pw: "+y[j]+"\n")
j=j+1
f.close
6.
実行すると、フォルダは下記の様になります。
C:\Users\xyz\Desktop\xxx_june\test\testx>Tree/F
フォルダー パスの一覧
ボリューム シリアル番号は 2E48-BBB4 です
C:.
ABC_co.pdf
invoice_setup.py
OPQ_co.pdf
pw_list.txt
XYZ_co.pdf
zipped_ABC_co.pdf.zip
zipped_OPQ_co.pdf.zip
zipped_XYZ_co.pdf.zip
サブフォルダーは存在しません
Name: ABC_co.pdf / pw: w8RBAfkNHj
Name: OPQ_co.pdf / pw: 2QglGxwGPR
Name: XYZ_co.pdf / pw: emny0xWKFc