Python實(shí)現(xiàn)PDF加密解密操作全攻略
日常工作中,我們常常需要處理加密的 PDF 文件。這些文件要求輸入密碼才能查看或編輯內(nèi)容,給自動(dòng)化處理帶來挑戰(zhàn)。同時(shí),我們有時(shí)也需要為 PDF 設(shè)置密碼保護(hù)敏感信息,或移除密碼以方便分享。 今天,我們來了解如何使用 Spire.PDF for Python 輕松實(shí)現(xiàn)以下操作:
- 為 PDF 文件設(shè)置密碼保護(hù)
- 從加密的 PDF 文件中移除密碼
- 判斷 PDF 文件是否加密
- 驗(yàn)證并確定正確的 PDF 密碼
掌握這些技能,可以讓我們有效管理 PDF 文檔的安全性,解決加密文件帶來的訪問限制問題。
準(zhǔn)備工作
本文將要使用到的 Spire.PDF for Python 是一款功能全面的 PDF 操作庫(kù),可以通過 Python 代碼對(duì) PDF 中的各種元素進(jìn)行操作,如加解密操作等,不需要任何第三方工具。
如果你沒有安裝,以下有兩種方法:
- 直接在 cmd 中使用
pip install spire.pdf命令安裝 Spire.PDF for Python: - 也可以從官網(wǎng) 下載 Spire.PDF for Python 的壓縮包,解壓縮后從“lib”文件夾中獲取 .whl 文件。 然后運(yùn)行以下命令安裝 Spire.PDF for Python 。
pip install G:\spire.pdf.python_9.8.1\lib\Spire.Pdf-9.8.1-py3-none-win_amd64.whl
注意:以上命令中的 G:\...\Spire.Pdf-9.8.1-py3-none-win_amd64.whl需要替換成你的實(shí)際路徑。
如果在安裝中遇到了問題,可以前往官方詳細(xì)的 安裝指南 獲取幫助。
Python 對(duì) PDF 文檔進(jìn)行密碼保護(hù)
當(dāng)我們需要限制對(duì) PDF 文件的訪問權(quán)限時(shí),例如保護(hù)公司機(jī)密報(bào)告或客戶合同,為 PDF 設(shè)置密碼是最直接有效的方法。
對(duì)于 PDF,有兩種用于安全目的的密碼類型可供選擇: "打開密碼" 和 "權(quán)限密碼"。
- 打開密碼,也稱為用戶密碼,用于限制未經(jīng)授權(quán)訪問 PDF 文件。
- 權(quán)限密碼,也被稱為主密碼或所有者密碼,允許你對(duì)其他人能夠在 PDF 文件中執(zhí)行的操作設(shè)置各種限制。
如果一個(gè) PDF 文件同時(shí)使用這兩種密碼進(jìn)行保護(hù),那么可以使用任意一種密碼來打開該文件。
Spire.PDF for Python 提供了一個(gè) PdfDocument.Security.Encrypt() 方法,讓我們可以使用打開密碼和(或)權(quán)限密碼來保護(hù) PDF 文件。
以下是使用 Spire.PDF for Python 實(shí)現(xiàn) PDF 密碼保護(hù)的步驟:
- 創(chuàng)建一個(gè) PdfDocument 對(duì)象。
- 使用 PdfDocument.LoadFromFile() 方法加載要加密的示例 PDF 文檔。
- 使用 PdfDocument.Security.Encrypt(String openPassword, String permissionPassword, PdfPermissionsFlags permissions, PdfEncryptionKeySize keySize) 方法來對(duì) PDF 文件進(jìn)行加密,以設(shè)置打開密碼和權(quán)限密碼。
- 使用 PdfDocument.SaveToFile() 方法將結(jié)果保存為文件。
注:PdfDocument.Security.Encrypt() 方法,其中 PdfPermissionsFlags 參數(shù)用于指定用戶對(duì)文檔的操作權(quán)限。
from spire.pdf import *
# 創(chuàng)建一個(gè) PdfDocument 對(duì)象
doc = PdfDocument()
# 從指定路徑加載示例 PDF 文件
doc.LoadFromFile("某公司數(shù)據(jù)報(bào)告.pdf")
# 使用打開密碼 ("openPsd")、權(quán)限密碼 ("permissionPsd") 和允許打印權(quán)限對(duì) PDF 文件進(jìn)行加密
doc.Security.Encrypt("openPsd", "permissionPsd", PdfPermissionsFlags.Print,
PdfEncryptionKeySize.Key128Bit)
# 將加密后的 PDF 文件保存到指定的文件路徑
doc.SaveToFile("加密文檔.pdf", FileFormat.PDF)
# 關(guān)閉文檔
doc.Close()
(加密后的文件打開的輸入界面)
Python 從加密的 PDF 文檔中移除密碼
當(dāng)你擁有加密 PDF 的密碼,但需要移除密碼以方便文件共享或批量處理時(shí)(例如解除對(duì)歸檔文檔的訪問限制),通過再次調(diào)用 PdfDocument.Security.Encrypt() 方法,并將打開密碼和權(quán)限密碼設(shè)置為空字符串,即可解除 PDF 文件的密碼保護(hù)。
以下是關(guān)鍵步驟:
- 創(chuàng)建一個(gè) PdfDocument 對(duì)象。
- 使用 PdfDocument.LoadFromFile(String fileName, String password) 方法加載加密- 的 PDF 文檔。
- 使用 PdfSecurity.Encrypt(String openPassword, String permissionPassword, PdfPermissionsFlags permissions, PdfEncryptionKeySize keySize, String originalPermissionPassword) 方法,通過將打開密碼和權(quán)限密碼設(shè)為空字符串來解密PDF文件。
- 使用 PdfDocument.SaveToFile() 方法保存結(jié)果文件。
from spire.pdf import *
# 創(chuàng)建一個(gè) PdfDocument 對(duì)象
doc = PdfDocument()
# 使用 "openPsd" 打開密碼加載加密的 PDF 文件
doc.LoadFromFile("加密文檔.pdf", "openPsd")
# 通過將打開密碼和權(quán)限密碼設(shè)為空字符串
doc.Security.Encrypt(str(), str(), PdfPermissionsFlags.Default, PdfEncryptionKeySize.Key128Bit, "permissionPsd")
# 將移除密碼后的 PDF 文件保存到指定的文件路徑
doc.SaveToFile("移除密碼.pdf", FileFormat.PDF)
# 關(guān)閉文檔
doc.Close()
(解密前后的PDF文件)
Python 判斷 PDF 是否加密
在批量處理大量 PDF 文件時(shí),你可能需要先篩選出加密的文件進(jìn)行特殊處理(例如集中解密)。手動(dòng)檢查每個(gè)文件是否加密效率低下且容易出錯(cuò)。
Spire.PDF for Python 提供了 PdfDocument.IsPasswordProtected(fileName: str) 靜態(tài)方法,只需傳入文件路徑即可快速判斷 PDF 是否加密。
關(guān)鍵步驟如下:
- 指定輸入和輸出文件路徑。
- 使用 PdfDocument.IsPasswordProtected() 方法判斷 PDF 是否加密。
- 將判斷結(jié)果用 Python 標(biāo)準(zhǔn)庫(kù) tkinter 以彈窗提示。
from spire.pdf import *
import tkinter as tk
from tkinter import messagebox
# 指定輸入和輸出文件路徑
inputFile = "加密文檔.pdf"
# 檢查 PDF 是否加密
isProtected = PdfDocument.IsPasswordProtected(inputFile)
# 初始化主窗口(隱藏)
root = tk.Tk()
# 隱藏主窗口
root.withdraw()
# 將結(jié)果以提示框形式顯示
messagebox.showinfo("結(jié)果", "該P(yáng)DF文件" + ("已加密!" if isProtected else "未加密!"))
(運(yùn)行程序彈出已加密提示)
Python 確定 PDF 的正確密碼
如果你擁有一個(gè)加密的 PDF 文件和一些可能的密碼,但不確定哪個(gè)密碼是正確的,手動(dòng)逐一測(cè)試非常耗時(shí)。 雖然 Spire.PDF 沒有提供直接驗(yàn)證密碼的方法,但可以通過嘗試使用密碼加載 PDF 文件并捕獲異常的方式間接驗(yàn)證。如果密碼正確,加載成功;否則會(huì)拋出異常。
關(guān)鍵步驟如下:
- 指定輸入和輸出文件路徑。
- 使用 PdfDocument.IsPasswordProtected() 方法判斷 PDF 是否加密。
- 創(chuàng)建一個(gè)待測(cè)試的密碼列表。
- 如果文檔已加密,遍歷密碼列表,使用 PdfDocument.LoadFromFile(filename: str, password: str) 方法加載 PDF。
- 如果未拋出異常,則表示密碼正確;否則,密碼不正確。
- 將結(jié)果用 Python 標(biāo)準(zhǔn)庫(kù) tkinter 以彈窗提示。
from spire.pdf import *
import tkinter as tk
from tkinter import messagebox
# 指定輸入和輸出文件路徑
inputFile = "加密文檔.pdf"
# 判斷 PDF 是否加密
isEncrypted = PdfDocument.IsPasswordProtected(inputFile)
# 創(chuàng)建待測(cè)試的密碼列表
passwords = ["密碼a", "密碼b", "openPsd", "密碼c"]
# 初始化主窗口(隱藏)
root = tk.Tk()
# 隱藏主窗口
root.withdraw()
# 遍歷密碼列表
if isEncrypted:
for value in passwords:
try:
# 嘗試使用當(dāng)前密碼加載 PDF
doc = PdfDocument()
doc.LoadFromFile(inputFile, value)
# 如果成功,說明密碼正確
messagebox.showinfo("正確", f"密碼 {value} 正確!")
break
except SpireException:
# 如果拋出異常,說明密碼不正確
messagebox.showerror("錯(cuò)誤", f"密碼 {value} 是錯(cuò)誤的!")
else:
messagebox.showwarning("警告", "該P(yáng)DF文檔沒有加密,無需驗(yàn)證密碼!")
(運(yùn)行程序彈出正確密碼提示)
結(jié)語
通過本文介紹的四種方法,我們可以輕松應(yīng)對(duì)各種 PDF 加密相關(guān)需求:
- 密碼保護(hù):有效控制 PDF 文件的訪問和操作權(quán)限
- 密碼移除:解除訪問限制,方便文件共享
- 加密狀態(tài)判斷:快速篩選加密文件進(jìn)行批量處理
- 密碼驗(yàn)證:自動(dòng)嘗試多個(gè)密碼,快速找到正確密碼
當(dāng)我們將這些方法集成到自動(dòng)化工作流中,加密 PDF 文件的管理效率將會(huì)大幅提升,我們也得以從繁瑣而不可控的手工操作中解放出來,專注于核心業(yè)務(wù)邏輯。
到此這篇關(guān)于Python實(shí)現(xiàn)PDF加密解密操作全攻略的文章就介紹到這了,更多相關(guān)Python PDF加密解密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)QQ郵箱發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)QQ郵箱發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
flask-SQLALchemy連接數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例
sqlalchemy是數(shù)據(jù)庫(kù)的orm框架,讓我們操作數(shù)據(jù)庫(kù)的時(shí)候不要再用sql語句了,本文就介紹了flask-SQLALchemy連接數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例,感興趣的可以了解一下2022-06-06
提升?Python?代碼運(yùn)行速度的6個(gè)技巧
本文分享了提升?Python?代碼運(yùn)行速度的6個(gè)技巧,Python?比我們想象的運(yùn)行的要快。我們之所以有先入為主的認(rèn)為Python運(yùn)行慢,可能是我們平常的誤用和缺乏使用技巧知識(shí)。接下來讓我們看看如何用一些簡(jiǎn)單的Trick來提高我們程序的運(yùn)行性能,需要的朋友可以參考一下2022-01-01
Python Flask請(qǐng)求擴(kuò)展與中間件相關(guān)知識(shí)總結(jié)
今天帶大家學(xué)習(xí)的是關(guān)于Python Flask的相關(guān)知識(shí),文章圍繞著Flask請(qǐng)求擴(kuò)展與中間件的知識(shí)展開,文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06
將tensorflow的ckpt模型存儲(chǔ)為npy的實(shí)例
今天小編就為大家分享一篇將tensorflow的ckpt模型存儲(chǔ)為npy的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Python高級(jí)特性之切片迭代列表生成式及生成器詳解
這篇文章主要為大家介紹了Python高級(jí)特性之切片迭代列表生成式及生成器詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-10-10
Python使用Virtualenv進(jìn)行虛擬環(huán)境管理的詳細(xì)步驟
Virtualenv是一個(gè)Python環(huán)境管理工具,它允許開發(fā)者在不同的項(xiàng)目之間獨(dú)立創(chuàng)建和管理各自的Python環(huán)境,通過virtualenv,你可以為每個(gè)項(xiàng)目安裝特定版本的Python解釋器以及項(xiàng)目的依賴庫(kù),本文給大家介紹了Python使用Virtualenv進(jìn)行虛擬環(huán)境管理的詳細(xì)步驟2024-09-09
python使用wxpython開發(fā)簡(jiǎn)單記事本的方法
這篇文章主要介紹了python使用wxpython開發(fā)簡(jiǎn)單記事本的方法,涉及Python使用wxPython實(shí)現(xiàn)桌面圖形應(yīng)用程序的技巧,需要的朋友可以參考下2015-05-05

