使用Python實(shí)現(xiàn)為PDF文檔設(shè)置和移除密碼
在數(shù)字化時(shí)代,文檔的安全性變得越來越重要。特別是對(duì)于包含敏感信息的PDF文件,確保其不被未經(jīng)授權(quán)的人員訪問或修改是至關(guān)重要的。本文將介紹如何使用Python在PDF文檔中設(shè)置密碼,以及如何移除已經(jīng)設(shè)置的密碼。
首先,我們需要安裝第三方庫 Spire.PDF for Python??梢韵螺d后手動(dòng)安裝或者使用以下pip命令安裝:
pip install Spire.PDF
PDF加密基礎(chǔ)知識(shí)
我們可以給PDF文件設(shè)置密碼或禁止某些功能來保護(hù)PDF。加密PDF時(shí)有以下兩種類型的密碼:
打開密碼或稱用戶密碼(open password):這是訪問PDF文件所需的密碼。設(shè)置了用戶密碼后,每次打開文件時(shí)都需要輸入正確的密碼。
權(quán)限密碼(permissions password):控制對(duì)PDF文件的操作權(quán)限,例如是否允許打印、復(fù)制或編輯文檔等。
兩種密碼結(jié)合使用可以為PDF文件提供多層次的安全保護(hù)。
在Python中,我們也可以使用Spire.PDF for Python提供的 PdfDocument.Security.Encrypt(openPassword: string, permissionPassword: string, permissions: PdfPermissionsFlags, keySize: PdfEncryptionKeySize) 方法為PDF文檔設(shè)置這兩種密碼。
代碼示例如下:
Python 為PDF文檔設(shè)置密碼
from spire.pdf.common import *
from spire.pdf import *
# 加載PDF文件
pdf = PdfDocument()
pdf.LoadFromFile("示例文檔.pdf")
# 用指定密碼加密 PDF 文件, 并設(shè)置操作權(quán)限和密鑰大小
pdf.Security.Encrypt("123", "abc", PdfPermissionsFlags.Print, PdfEncryptionKeySize.Key128Bit)
# 保存加密的PDF文件
pdf.SaveToFile("加密PDF文檔.pdf", FileFormat.PDF)
以上代碼為PDF文檔設(shè)置了打開密碼和權(quán)限密碼,并允許打印操作和指定了一個(gè) 128 位的加密密鑰大小。Spire.PDF for Python還支持40位(Key40Bit)和256位(Key256Bit)密鑰大小。加密的PDF文檔:

使用密碼打開后其權(quán)限限制如圖:

Python移除PDF文檔中的密碼
from spire.pdf.common import *
from spire.pdf import *
# 加載已加密的PDF文檔
pdf = PdfDocument()
pdf.LoadFromFile("加密PDF文檔.pdf", "123")
# 將打開密碼和權(quán)限密碼設(shè)置為空
pdf.Security.Encrypt(str(), str(), PdfPermissionsFlags.Default, PdfEncryptionKeySize.Key128Bit, "abc")
# 保存PDF文檔
pdf.SaveToFile("解除PDF密碼.pdf", FileFormat.PDF)
在這個(gè)示例中,我們先使用設(shè)置的密碼打開PDF文檔后,然后再次調(diào)用Encrypt()方法并將PDF用戶密碼和權(quán)限密碼這兩個(gè)參數(shù)設(shè)置為空,即可刪除PDF文件中的密碼。知識(shí)補(bǔ)充
除了上文的內(nèi)容,小編還為大家整理了一些Python實(shí)現(xiàn)PDF加密解密的方法,希望對(duì)大家有所幫助
Python實(shí)現(xiàn)PDF解密
實(shí)現(xiàn)代碼
from PyPDF2 import PdfReader #pdf的讀取方法
from PyPDF2 import PdfWriter #pdf的寫入方法
from Crypto.Cipher import AES #高加密的方法,要引入不然會(huì)報(bào)錯(cuò)
def get_reader(filename, password): #讀取pdf的方法(自定義函數(shù))
try:
old_file = open(filename, 'rb')
print('解密開始...')
except Exception as err:
return print('文件打開失??!' + str(err))
#如果是python2將PdfReader改為PdfFileReader
pdf_reader = PdfReader(old_file, strict=False) #讀取pdf文件
# 如果是python2將is_encrypted改為isEncrypted
if pdf_reader.is_encrypted: #解密操作(以下操作是自適應(yīng),不會(huì)展示在終端中)
if password is None:
return print('文件被加密,需要密碼!--{}'.format(filename))
else:
if pdf_reader.decrypt(password) != 1:
return print('密碼不正確!--{}'.format(filename))
elif old_file in locals():
old_file.close() #如果pdf文件已經(jīng)在本地了就關(guān)閉
return pdf_reader #返回讀出pdf的值
def deception_pdf(filename, password, decrypted_filename=None): #生成新pdf的方法(自定義函數(shù))
print('正在生成解密...')
pdf_reader = get_reader(filename, password) #得到傳入的文件名,和密碼(如果密碼沒有可以不填)
if pdf_reader is None:
return print("無內(nèi)容讀取")
# 如果是python2將is_encrypted改為isEncrypted
elif not pdf_reader.is_encrypted:
return print('文件沒有被加密,無需操作')
# 如果是python2將PdfWriter改為PdfFileWriter
pdf_writer = PdfWriter() #寫pdf(記錄pdf內(nèi)容)
#如果是python2將append_pages_from_reader改為appendPagesFromReader
pdf_writer.append_pages_from_reader(pdf_reader)
if decrypted_filename is None: #創(chuàng)建解密后的pdf文件和展示文件的路徑
decrypted_filename = "".join(filename.split('.')[:-1]) + '_' + '已解密' + '.pdf'
print("解密文件已生成:{}".format(decrypted_filename))
# 寫入新文件
pdf_writer.write(open(decrypted_filename, 'wb'))
if __name__ == '__main__':
# 逗號(hào)前面的為需要解密的pdf文件路徑,后面的''里面為密碼,如果不知道就用不填
deception_pdf(r'E:\考研\(zhòng)301數(shù)學(xué)一\數(shù)學(xué)書\數(shù)學(xué)書\2024kaoyanmath1.pdf', '')
Python取消pdf密碼保護(hù)
實(shí)現(xiàn)代碼
# coding:utf-8
import os
import PyPDF2
def get_reader(filename, password):
try:
old_file = open(filename, 'rb')
except Exception as err:
print('文件打開失??!' + str(err))
return None
# 創(chuàng)建讀實(shí)例
pdf_reader = PyPDF2.PdfReader(old_file, strict=False)
# 解密操作
if pdf_reader.is_encrypted:
if password is None:
print('%s文件被加密,需要密碼!' % filename)
return None
else:
if pdf_reader.decrypt(password) != 1:
print('%s密碼不正確!' % filename)
return None
if old_file in locals():
old_file.close()
return pdf_reader
def decrypt_pdf(filename, password, decrypted_filename=None):
"""
將加密的文件及逆行解密,并生成一個(gè)無需密碼pdf文件
:param filename: 原先加密的pdf文件
:param password: 對(duì)應(yīng)的密碼
:param decrypted_filename: 解密之后的文件名
:return:
"""
# 生成一個(gè)Reader和Writer
print('run 文件解密')
pdf_reader = get_reader(filename, password)
if pdf_reader is None:
return
if not pdf_reader.is_encrypted:
print('文件沒有被加密,無需操作!')
return
pdf_writer = PyPDF2.PdfWriter()
pdf_writer.append_pages_from_reader(pdf_reader)
if decrypted_filename is None:
decrypted_filename = "".join(filename.split('.')[:-1]) + '_' + 'decrypted' + '.pdf'
print('文件解密完成!')
# 寫入新文件
pdf_writer.write(open(decrypted_filename, 'wb'))
decrypt_pdf(r'xxx.pdf', '666')
到此這篇關(guān)于使用Python實(shí)現(xiàn)為PDF文檔設(shè)置和移除密碼的文章就介紹到這了,更多相關(guān)Python PDF設(shè)置移除密碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)本地圖片轉(zhuǎn)存并重命名的示例代碼
今天小編就為大家分享一篇python實(shí)現(xiàn)本地圖片轉(zhuǎn)存并重命名的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10
Python設(shè)計(jì)模式之享元模式原理與用法實(shí)例分析
這篇文章主要介紹了Python設(shè)計(jì)模式之享元模式原理與用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了享元模式的相關(guān)概念、原理、定義及使用方法,需要的朋友可以參考下2019-01-01
python人工智能tensorflow優(yōu)化器Optimizer算法匯總
這篇文章主要為大家介紹了python人工智能tensorflowtf優(yōu)化器Optimizer算法匯總,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
對(duì)pandas讀取中文unicode的csv和添加行標(biāo)題的方法詳解
今天小編就為大家分享一篇對(duì)pandas讀取中文unicode的csv和添加行標(biāo)題的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12
從入門到精通詳解Python datetime模塊應(yīng)用的深度指南
在編程世界中,時(shí)間無處不在,本文將帶你深入探索 Python datetime 模塊的奧秘,從基礎(chǔ)概念到高階實(shí)戰(zhàn),助你徹底搞定時(shí)間處理難題,感興趣的可以了解下2026-01-01
python requests更換代理適用于IP頻率限制的方法
今天小編就為大家分享一篇python requests更換代理適用于IP頻率限制的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08
解決Python Matplotlib繪圖數(shù)據(jù)點(diǎn)位置錯(cuò)亂問題
這篇文章主要介紹了解決Python Matplotlib繪圖數(shù)據(jù)點(diǎn)位置錯(cuò)亂問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python實(shí)現(xiàn)從N個(gè)數(shù)中找到最大的K個(gè)數(shù)
這篇文章主要介紹了Python實(shí)現(xiàn)從N個(gè)數(shù)中找到最大的K個(gè)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04
pip install報(bào)錯(cuò)This environment is externa
這篇文章主要為大家詳細(xì)介紹了Python中pip install報(bào)錯(cuò)This environment is externally managed的相關(guān)解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2025-12-12

