Python实现PDF批量加密与解密脚本详解

程一诺
程一诺
发布时间:2026-10-13 | 3人浏览过
原创

本文通过Python脚本演示PDF文件的批量加密与解密操作。利用os.walk遍历文件夹,结合PyPDF2对PDF进行加密保存,并通过命令行参数传递口令。脚本包含加密验证、源文件删除及解密拷贝生成逻辑,适用于需要批量管理PDF安全性的场景。

本文通过具体实例展示如何使用Python对PDF文件进行相关操作,供读者参考学习。

具体需求如下:

  • 首先,利用第九章介绍的os.walk()函数编写脚本,遍历指定文件夹内的所有PDF文件。通过命令行传入加密口令,对这些PDF进行加密处理,并将加密后的文件以原文件名加上“_encrypted.pdf”后缀保存。在删除原始文件前,程序需尝试读取并解密该文件,以验证加密是否成功。
  • 其次,编写另一个程序用于查找文件夹中所有已加密的PDF文件。利用提供的口令尝试创建解密副本,若口令不正确,程序应打印错误消息,并继续处理下一个PDF文件。

解决思路如下:

- 第一个函数需执行以下操作: 扫描文件夹内所有PDF文件 对文件执行加密操作 保存加密后的PDF文件 验证加密是否正确 删除原始文件 - 第二个函数需执行以下操作: 遍历文件夹中带“_encrypted”后缀的PDF文件 使用提供的口令尝试打开文件 若打开成功,将口令拷贝保存至txt文件 若打开失败,则在屏幕输出提示信息 - 代码层面需完成: 导入os、PyPDF2、sys及send2trash模块 生成新文件夹以存放加密后的PDF及生成的文本拷贝

  • 编写加密函数: 在函数内部调用os.walk()遍历文件夹,并将文件名保存至列表 通过sys.argv()获取命令行提供的加密口令 使用for循环执行文件加密及保存加密文件的操作 调用decrypt方法进行解密验证,确保加密无误并反馈结果 使用send2trash删除原始文件
  • 编写生成解密拷贝函数: 利用os.walk()遍历目录,通过decrypt进行解密操作 反馈处理结果,生成包含密码的拷贝txt文件 使用try-except结构控制decrypt流程,若解密失败则打印消息并continue继续处理

具体代码实现如下:

由于在命令行运行时提示找不到PyPDF2模块,因此此处将sys.argv命令行参数直接作为字符串传入函数进行替代处理。


#! python3
import os, sys, PyPDF2,send2trash

os.makedirs(".\\NewPDF")
print("文件夹创建成功!")
path1 = os.path.abspath(".\\NewPDF")
# 文件加密函数
def decryptFile(argv,p = os.path.abspath(".\\New")):
 tagFloder = '.\\PDF'
 pdfList = []
 #当前目录下创建新文件夹
 #os.makedirs(".\\NewPDF")
 #遍历目标文件夹,将.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
 #对pdf文件进行加密)
 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] #对文件名进行分割
  pdfWriter.encrypt(argv) #口令加密
  pdfResult = open("{0}\\{1}_encrypted.pdf".format(p,newName),"wb+") #创建新文件名对象
  pdfWriter.write(pdfResult) #写入新文件
  pdfReader2 = PyPDF2.PdfFileReader(pdfResult,'rb')
  #进行加密确认
  if pdfReader2.decrypt(argv):
   print("正确加密!删除原文件中...")
   try:
    send2trash.send2trash(os.path.join(foldername,i))
   except:
    print("删除原文件:%s 失败!"%i)
  pdfResult.close()
  print("Done!")

# 口令拷贝函数
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] #对文件名进行分割
   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("口令错误!")
   except:
    continue
# 调用函数
decryptFile("ABCDEFG",path1) 

copyDcrypt("ABCDEFG",path1)

运行结果展示:

  • PyCharm界面运行结果如下: - 原文件夹状态: - 新文件夹状态: - 生成的拷贝文本文件:

更多Python相关内容感兴趣的读者可查看本站专题:《Python文件与目录操作技巧汇总》、《Python编码操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述的代码与思路对大家学习Python程序设计有所帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表