本部落格已搬遷, 3秒後跳轉...

Python:批次加密PDF文件 | Laplace's Lab

Python:批次加密PDF文件

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

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
# *** 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.")
0%