Python编程快速上手——PDF文件操作案例分析


Posted in Python onFebruary 28, 2020

本文实例讲述了Python PDF文件操作。分享给大家供大家参考,具体如下:

题目如下:

  • 利用第九章的os.walk()函数编写脚本,遍历文件夹中的所有pdf,用命令行提供的命令对这些PDF进行加密,用原来的文件名加上_encrypted.pdf后缀,保存每个加密的PDF。在删除原来的文件之前,尝试用程序读取并解密该文件,确保被正确加密
  • 然后编写一个程序,找到文件夹中所有加密的PDF文件,利用提供的口令,创建pdf的解密拷贝,如果口令不对,程序应该打印一条消息,
    并继续处理下一个pdf文件

思路如下:

- 程序内函数1需要做以下事情:
找出文件夹中所有PDF文件
对PDF文件进行加密
保存加密的PDF文件
检验是否正确加密
删除源文件
- 程序内函数2需要做以下事情:
遍历文件夹中所有带_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编程快速上手——PDF文件操作案例分析
    Python编程快速上手——PDF文件操作案例分析
    - 原文件夹:
    Python编程快速上手——PDF文件操作案例分析
    - 新文件夹:
    Python编程快速上手——PDF文件操作案例分析
    - 拷贝文本文件:
    Python编程快速上手——PDF文件操作案例分析

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

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python基于windows平台锁定键盘输入的方法
Mar 05 Python
Python设置Socket代理及实现远程摄像头控制的例子
Nov 13 Python
Python操作Excel之xlsx文件
Mar 24 Python
对numpy Array [: ,] 的取值方法详解
Jul 02 Python
Python实现模拟登录网易邮箱的方法示例
Jul 05 Python
Python自定义装饰器原理与用法实例分析
Jul 16 Python
pycharm运行出现ImportError:No module named的解决方法
Oct 13 Python
pycharm 在windows上编辑代码用linux执行配置的方法
Oct 27 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
Feb 17 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
Mar 14 Python
Python run()函数和start()函数的比较和差别介绍
May 03 Python
Python初学者必备的文件读写指南
Jun 23 Python
Python自动采集微信联系人的实现示例
Feb 28 #Python
python代码实现TSNE降维数据可视化教程
Feb 28 #Python
Python range与enumerate函数区别解析
Feb 28 #Python
使用python的turtle函数绘制一个滑稽表情
Feb 28 #Python
python使用pandas抽样训练数据中某个类别实例
Feb 28 #Python
如何使用repr调试python程序
Feb 28 #Python
Python编程快速上手——Excel到CSV的转换程序案例分析
Feb 28 #Python
You might like
WAR3重制版DOTA 5V5初体验
2020/04/09 DOTA
php curl 上传文件代码实例
2015/04/27 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
2017/05/05 PHP
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
js函数的延迟加载实现代码
2012/10/11 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
2013/11/26 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
2014/08/22 Javascript
浅析script标签中的defer与async属性
2016/11/30 Javascript
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
微信小程序第三方框架对比 之 wepy / mpvue / taro
2019/04/10 Javascript
JavaScript中this的全面解析及常见实例
2019/05/14 Javascript
Vue3.0中的monorepo管理模式的实现
2019/10/14 Javascript
[26:21]浴火之凤-TI4世界冠军Newbee战队纪录片
2014/08/07 DOTA
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
python处理大数字的方法
2015/05/27 Python
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
NetworkX之Prim算法(实例讲解)
2017/12/22 Python
Python中的CSV文件使用"with"语句的方式详解
2018/10/16 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
python 去除二维数组/二维列表中的重复行方法
2019/01/23 Python
Django 解决由save方法引发的错误
2020/05/21 Python
python中pickle模块浅析
2020/12/29 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
美国珠宝店:Helzberg Diamonds
2018/10/24 全球购物
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
.NET remoting的两种通道是什么
2016/05/31 面试题
土木工程师职业规划范文
2014/03/07 职场文书
2014年业务员工作总结范文
2014/11/17 职场文书
毕业典礼主持词
2015/06/29 职场文书
红歌会主持词
2015/07/02 职场文书
MySQL 重命名表的操作方法及注意事项
2021/05/21 MySQL
开发者首先否认《遗弃》被取消的传言
2022/04/11 其他游戏
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL