4
5

More than 3 years have passed since last update.

ファイルごとに異なるPWでzip暗号化する作業の省人化。3人日掛かっていた作業を1秒で処理した話。【完成版】

Last updated at Posted at 2021-07-10

日常業務を省力化を図っております。
一か月前に、「月初エクセル集計処理を完全自動化し、100人日掛かっていた作業を一秒で処理した話。【完成版】を書きました。→https://qiita.com/naiveprince0507/items/3e4d322f7f1c3068487a
それの第2弾となります。

===========
1.状況説明
下記の様な、顧客別に送付するPDFファイルがあったとします。
0710.jpg
客先にメールで送信する際に、それぞれのpdfファイルに、別個のパスワードでZIP暗号化を掛けて、客先送信すると言う事はよくあると思います。

2.普通のやり方
PW自動生成ソフトやサイトを使って、PWを作成して、それを一つずつコピペして、LhaplusみたいなZIP暗号化ファイル作成ツールを使って、一つずつ暗号化ファイルを作成していく必要があります。

パスワード作成サイト→ https://www.luft.co.jp/cgi/randam.php
0710x.jpg

0710y.jpg

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")"で消した。

invoice_setup.py
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

サブフォルダーは存在しません
<pw_list.txt> 自動作成されたPWリストの内容は下記。
Name: ABC_co.pdf / pw: w8RBAfkNHj
Name: OPQ_co.pdf / pw: 2QglGxwGPR
Name: XYZ_co.pdf / pw: emny0xWKFc
4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5