python使用pypdf2實(shí)現(xiàn)pdf文檔解密
用python完成PDF的解密!?。。ǎ〈a直接可以運(yùn)行?。?/p>
用python的庫(kù)函數(shù)pypdf2完成解密,如果不會(huì)用python的小伙伴別擔(dān)心,直接點(diǎn)總結(jié)看最暴力最直接的辦法(在線解密)
前言
利用pypdf2完成pdf的解密,這里的事例是python3環(huán)境下的,當(dāng)然python2下也可以運(yùn)行,只需要修改名稱即可,在代碼中有修改的地方,筆者也會(huì)指出,看完這篇你不會(huì)解密pdf的話?。。∧俏揖驮賹懸黄?/p>
一、導(dǎo)入庫(kù)函數(shù)
這里用到的模塊有pypdf2、pycryptodome,如果沒(méi)有模塊的需要在對(duì)應(yīng)的虛擬環(huán)境中執(zhí)行以下的pip安裝命令
pip install pypdf2 pip install pycryptodome
二、主要函數(shù)解讀
1.引入庫(kù)
如果是python2的在引入函數(shù)方法的時(shí)候需要改一下,如果是python3的就直接復(fù)制下面代碼就好
from PyPDF2 import PdfReader #pdf的讀取方法 from PyPDF2 import PdfWriter #pdf的寫入方法 """ 如果是python2的將上面的PdfReader和PdfWriter改為 PdfFileReader和PDFfileWriter即可 """ from Crypto.Cipher import AES #高加密的方法,要引入不然會(huì)報(bào)錯(cuò)
2.自定義pdf讀取函數(shù)
python2需要修改的地方在代碼中已經(jīng)標(biāo)注,python3的直接復(fù)制下面代碼即可
def get_reader(filename, password): #讀取pdf的方法(自定義函數(shù)) try: old_file = open(filename, 'rb') print('解密開(kāi)始...') except Exception as err: return print('文件打開(kāi)失??!' + 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的值
3.自定義pdf生成函數(shù)
將加密的文件及逆行解密,并生成一個(gè)無(wú)需密碼pdf文件,下面是生成函數(shù)deception_pdf的基本參數(shù)
filename: 原先加密的pdf文件名稱
password: 原文件對(duì)應(yīng)的密碼
decrypted_filename: 解密之后的文件名
def deception_pdf(filename, password, decrypted_filename=None): #生成新pdf的方法(自定義函數(shù)) print('正在生成解密...') #得到傳入的文件名和密碼(這里不用做修改) pdf_reader = get_reader(filename, password) if pdf_reader is None: return print("無(wú)內(nèi)容讀取") """如果是python2將is_encrypted改為isEncrypted""" elif not pdf_reader.is_encrypted: return print('文件沒(méi)有被加密,無(wú)需操作') """如果是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'))
三、完整源代碼
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('解密開(kāi)始...') except Exception as err: return print('文件打開(kāi)失??!' + 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) #得到傳入的文件名,和密碼(如果密碼沒(méi)有可以不填) if pdf_reader is None: return print("無(wú)內(nèi)容讀取") # 如果是python2將is_encrypted改為isEncrypted elif not pdf_reader.is_encrypted: return print('文件沒(méi)有被加密,無(wú)需操作') # 如果是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', '')
使用方法:
我們要先得到需要解密的文件路徑,如下看到我們的文件路徑為(?E:\考研\(zhòng)301數(shù)學(xué)一\數(shù)學(xué)書\數(shù)學(xué)書\2024kaoyanmath1.pdf)復(fù)制后,再黏貼到代碼中的指定位置即可
為了看到直觀效果,我們看到這里的原文件是被加密的,接下來(lái)我們運(yùn)行上面的代碼然后再來(lái)看看效果
我們接著運(yùn)行代碼,接著指向的地址看
我們看到解密后的文件因?yàn)槿∠思用軝?quán)限,文件的大小也小了點(diǎn)
總結(jié)
以上就是python使用pypdf2實(shí)現(xiàn)pdf文檔解密的詳細(xì)內(nèi)容,更多關(guān)于python pypdf2實(shí)現(xiàn)pdf解密的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python使用xpath對(duì)解析內(nèi)容進(jìn)行數(shù)據(jù)提取
XPath 使用路徑表達(dá)式來(lái)選取HTML/ XML 文檔中的節(jié)點(diǎn)或節(jié)點(diǎn)集,節(jié)點(diǎn)是通過(guò)沿著路徑 (path) 或者步 (steps) 來(lái)選取的,本文將給大家介紹Python使用xpath對(duì)解析內(nèi)容進(jìn)行數(shù)據(jù)提取的方法,需要的朋友可以參考下2024-05-05安裝python-docx后,無(wú)法在pycharm中導(dǎo)入的解決方案
這篇文章主要介紹了安裝python-docx后,無(wú)法在pycharm中導(dǎo)入的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03pytorch教程resnet.py的實(shí)現(xiàn)文件源碼分析
torchvision.models這個(gè)包中包含alexnet、densenet、inception、resnet、squeezenet、vgg等常用的網(wǎng)絡(luò)結(jié)構(gòu),并且提供了預(yù)訓(xùn)練模型,可以通過(guò)簡(jiǎn)單調(diào)用來(lái)讀取網(wǎng)絡(luò)結(jié)構(gòu)和預(yù)訓(xùn)練模型2021-09-09對(duì)python 讀取線的shp文件實(shí)例詳解
今天小編就為大家分享一篇對(duì)python 讀取線的shp文件實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12用 Django 開(kāi)發(fā)一個(gè) Python Web API的方法步驟
這篇文章主要介紹了用 Django 開(kāi)發(fā)一個(gè) Python Web API的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12python圖片剪裁代碼(圖片按四個(gè)點(diǎn)坐標(biāo)剪裁)
這篇文章主要介紹了python圖片剪裁代碼(圖片按四個(gè)點(diǎn)坐標(biāo)剪裁),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03