Python編程快速上手——PDF文件操作案例分析
本文實(shí)例講述了Python PDF文件操作。分享給大家供大家參考,具體如下:
題目如下:
- 利用第九章的os.walk()函數(shù)編寫腳本,遍歷文件夾中的所有pdf,用命令行提供的命令對(duì)這些PDF進(jìn)行加密,用原來的文件名加上_encrypted.pdf后綴,保存每個(gè)加密的PDF。在刪除原來的文件之前,嘗試用程序讀取并解密該文件,確保被正確加密
- 然后編寫一個(gè)程序,找到文件夾中所有加密的PDF文件,利用提供的口令,創(chuàng)建pdf的解密拷貝,如果口令不對(duì),程序應(yīng)該打印一條消息,
并繼續(xù)處理下一個(gè)pdf文件
思路如下:
- 程序內(nèi)函數(shù)1需要做以下事情:
找出文件夾中所有PDF文件
對(duì)PDF文件進(jìn)行加密
保存加密的PDF文件
檢驗(yàn)是否正確加密
刪除源文件
- 程序內(nèi)函數(shù)2需要做以下事情:
遍歷文件夾中所有帶_encrypted后綴的PDF文件
利用提供的口令進(jìn)行打開
能夠正確打開,則進(jìn)行口令拷貝保存到txt文件
不能正確打開輸出到屏幕
- 代碼需要做以下事情:
導(dǎo)入os,PyPDF2,sys,send2trash
生成新文件夾用于保存加密PDF及拷貝文本
- 編寫一個(gè)加密函數(shù)
函數(shù)內(nèi)調(diào)用os.walk()遍歷文件夾,文件名保存到列表
命令行參數(shù)sys.argv()提供加密口令
for循環(huán)進(jìn)行文件加密和保存加密文件操作
decrypt進(jìn)行解密,確保正確加密,并進(jìn)行反饋
刪除原有文件(send2trash) - 編寫一個(gè)生成解密拷貝函數(shù)
os.walk()遍歷,decrypt進(jìn)行解密,反饋結(jié)果,生成密碼拷貝txt
try-except進(jìn)行decrypt控制,解密失敗打印消息,continue繼續(xù)
代碼如下:
由于我的代碼在命令行運(yùn)行時(shí)提示找不到PyPDF2模塊,所以sys.argv命令行參數(shù)用的字符串直接放入函數(shù)進(jìn)行代替。
#! python3
import os, sys, PyPDF2,send2trash
os.makedirs(".\\NewPDF")
print("文件夾創(chuàng)建成功!")
path1 = os.path.abspath(".\\NewPDF")
# 文件加密函數(shù)
def decryptFile(argv,p = os.path.abspath(".\\New")):
tagFloder = '.\\PDF'
pdfList = []
#當(dāng)前目錄下創(chuàng)建新文件夾
#os.makedirs(".\\NewPDF")
#遍歷目標(biāo)文件夾,將.pdf文件名添加到列表
for foldername, subfolders, filenames in os.walk(tagFloder):
for filename in filenames:
if filename.endswith('.pdf'):
pdfList.append(filename)
print('找到PDF文件:%s' %filename)
else:
continue
#對(duì)pdf文件進(jìn)行加密)
for i in pdfList:
pdfFile = open(os.path.join(foldername,filename),'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFile)
pdfWriter = PyPDF2.PdfFileWriter()
#拷貝
for pageNum in range(pdfReader.numPages):
pdfWriter.addPage(pdfReader.getPage(pageNum))
newName = i[0:-4] #對(duì)文件名進(jìn)行分割
pdfWriter.encrypt(argv) #口令加密
pdfResult = open("{0}\\{1}_encrypted.pdf".format(p,newName),"wb+") #創(chuàng)建新文件名對(duì)象
pdfWriter.write(pdfResult) #寫入新文件
pdfReader2 = PyPDF2.PdfFileReader(pdfResult,'rb')
#進(jìn)行加密確認(rèn)
if pdfReader2.decrypt(argv):
print("正確加密!刪除原文件中...")
try:
send2trash.send2trash(os.path.join(foldername,i))
except:
print("刪除原文件:%s 失敗!"%i)
pdfResult.close()
print("Done!")
# 口令拷貝函數(shù)
def copyDcrypt(argv,p = os.path.abspath(".\\New")):
pdfList = []
for foldername, subfolders, filenames in os.walk("."):
print("父文件夾:%s"%foldername)
for filename in filenames:
if filename.endswith(".pdf"):
pdfReader = PyPDF2.PdfFileReader(open(os.path.join(foldername,filename),'rb'))
if pdfReader.isEncrypted:
pdfList.append(filename)
print('找到已加密PDF文件:%s' % filename)
else:
continue
for i in pdfList:
newName = i[0:-4] #對(duì)文件名進(jìn)行分割
try:
if pdfReader.decrypt(argv) == 1:
copyFile = open("{0}\\{1}_PASSWORD.txt" .format(p,newName), 'w')
copyFile.write("Password is : %s" % argv)
copyFile.close()
print("口令正確!拷貝生成成功!")
else:
print("口令錯(cuò)誤!")
except:
continue
# 調(diào)用函數(shù)
decryptFile("ABCDEFG",path1)
copyDcrypt("ABCDEFG",path1)
運(yùn)行結(jié)果:
- pycharm界面運(yùn)行結(jié)果:


- 原文件夾:

- 新文件夾:

- 拷貝文本文件:

更多Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python文件與目錄操作技巧匯總》、《Python編碼操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Django視圖擴(kuò)展類知識(shí)點(diǎn)詳解
這篇文章主要介紹了Django視圖擴(kuò)展類知識(shí)點(diǎn)以及實(shí)例代碼,需要的朋友們可以學(xué)習(xí)下。2019-10-10
Django框架中render_to_response()函數(shù)的使用方法
這篇文章主要介紹了Django框架中render_to_response()函數(shù)的使用方法,注意范例中該方法的參數(shù)的使用,需要的朋友可以參考下2015-07-07
Python接口自動(dòng)化淺析數(shù)據(jù)驅(qū)動(dòng)原理
這篇文章主要介紹了Python接口自動(dòng)化淺析數(shù)據(jù)驅(qū)動(dòng)原理,文中會(huì)詳細(xì)描述怎樣使用openpyxl模塊操作excel及結(jié)合ddt來實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng),有需要的朋友可以參考下2021-08-08
Python中enumerate()函數(shù)詳細(xì)分析(附多個(gè)Demo)
Python的enumerate()函數(shù)是一個(gè)內(nèi)置函數(shù),主要用于在遍歷循環(huán)中獲取每個(gè)元素的索引以及對(duì)應(yīng)的值,這篇文章主要介紹了Python中enumerate()函數(shù)的相關(guān)資料,需要的朋友可以參考下2024-10-10
Python進(jìn)階學(xué)習(xí)之pandas中read_csv()用法詳解
python中數(shù)據(jù)處理是比較方便的,經(jīng)常用的就是讀寫文件,提取數(shù)據(jù)等,本文主要介紹其中的一些用法,這篇文章主要給大家介紹了關(guān)于Python進(jìn)階學(xué)習(xí)之pandas中read_csv()用法的相關(guān)資料,需要的朋友可以參考下2024-03-03
Python?Decorator的設(shè)計(jì)模式演繹過程解析
本文主要梳理了Python?decorator的實(shí)現(xiàn)思路,解釋了為什么Python?decorator是現(xiàn)在這個(gè)樣子,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
使用python批量修改文件名的方法(視頻合并時(shí))
這篇文章主要介紹了視頻合并時(shí)使用python批量修改文件名的方法,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
python實(shí)現(xiàn)windows壁紙定期更換功能
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)windows壁紙定期更換功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01

