又好一段時間沒更新了(忙,然後就2020年了...紀錄一下前陣子寫了段程式碼幫人處理批次加密PDF。
Description
事實上這需求與薪資系統有關,我只知道那系統似乎很瞎,但人工處理這種大量重複性的問題更瞎🙄 於是我們會有無數個PDF文件和一個txt文件,PDF內容是個人機密😎,而txt裡頭則是對照表,當程式讀進路徑下所有PDF文件後,會依照PDF檔名去對照每個人的ID Number,以作為PDF文件加密的密碼,然後使用PyPDF2這個模組來進行加密。需注意讀取跟寫入的檔名不能相同,因為加密完會遇到檔案已存在而無法回寫的情況,只好在讀檔之前一律先把檔名改為"tmp.pdf",讀進來加密完再另存回原檔名,然後刪除"tmp.pdf",如此完成一個PDF文件的加密。
*PDF檔名即為code,而txt檔裡頭的對照表有兩個欄位:code | id_number
Code
python
# *** coding:utf-8 ***
import os, glob
from PyPDF2 import PdfFileReader as pdfReader
from PyPDF2 import PdfFileWriter as pdfWriter
def find_id_by_code(code, table):
pswd = "123456" # default password
for i in table:
if code in i:
pswd = str(i).split()[1]
print(code, "-->", pswd)
return pswd
id = open("ID.txt")
ID_table = list(id)
id.close()
pdf_files = glob.glob(r"*.pdf")
for path in pdf_files:
code = path.replace(".pdf", "")
os.rename(path, "tmp.pdf")
in_file = open("tmp.pdf", "r+b")
in_pdf = pdfReader(in_file)
out_pdf = pdfWriter()
out_pdf.appendPagesFromReader(in_pdf)
pswd = find_id_by_code(code, ID_table)
out_pdf.encrypt(pswd)
out_file = open(path, "wb")
out_pdf.write(out_file)
in_file.close()
out_file.close()
os.remove("tmp.pdf")
del in_pdf, out_pdf
input("Encrypt Complete! Now you can close the window.")