Skip to content
Python:批次加密PDF文件
📆2020-02-17 | 📂Python

又好一段時間沒更新了(忙,然後就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.")

Last updated: