Python 实现加密过的PDF文件转WORD格式


Posted in Python onFebruary 04, 2020

实现方法简介

许多文件都支持转换为PDF格式,诸如Word,Excel,PowerPoint,Cad以及图片格式。所以pdf从学校到职场,都可以看到pdf文件的身影。

为了保证了文件的安全性,正常情况下无法对pdf的内容进行编辑。但是相应的我们就无法修改pdf的内容,也不便于pdf资料的使用。虽然现在市面上有很多 pdf 转 word 软件,比如 wps,但大多数的软件是要收费的,并且价格不菲。前些天就有人叫我帮她把 pdf 文档转成 word 的文档。因为写尽调报告需要去查看各种信评资料,往往这些资料都是pdf格式的文件,而且经常出现加密文档,为了方便查找和复制相关资料,将加密过的pdf文件转换成word文档就会便捷不少,提高使用效率。

于是想到写个程序,把 pdf 转成 word 文档。秉承着不要重复造轮子的想法,我首先在网上搜索了下相关代码。大多是针对未加密过的pdf文件来实现,本文结合加密文档的特殊性写了相关程序来实现这个功能。

支持加密文件的格式转换

代码效果

环境配置

1、pdfminer安装库命令:

pip install pdfminer3k

2、docx安装库命令:

pip install python_docx

注:pdf中非图片构成的部分才能被成功转换:

#-*- coding: UTF-8 -*- 
#!/usr/bin/python
#-*- coding: utf-8 -*-
import sys
import importlib
importlib.reload(sys)
from pdfminer.pdfparser import PDFParser,PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import *
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed
import os
#设置工作目录文件夹
os.chdir(r'c:/users/dicey/desktop/codes/pdf-docx')
#解析pdf文件函数
def parse(pdf_path):
 fp = open('diya.pdf', 'rb') # 以二进制读模式打开
 # 用文件对象来创建一个pdf文档分析器
 parser = PDFParser(fp)
 # 创建一个PDF文档
 doc = PDFDocument()
 # 连接分析器 与文档对象
 parser.set_document(doc)
 doc.set_parser(parser)
 # 提供初始化密码
 # 如果没有密码 就创建一个空的字符串
 doc.initialize()
 # 检测文档是否提供txt转换,不提供就忽略
 if not doc.is_extractable:
  raise PDFTextExtractionNotAllowed
 else:
  # 创建PDf 资源管理器 来管理共享资源
  rsrcmgr = PDFResourceManager()
  # 创建一个PDF设备对象
  laparams = LAParams()
  device = PDFPageAggregator(rsrcmgr, laparams=laparams)
  # 创建一个PDF解释器对象
  interpreter = PDFPageInterpreter(rsrcmgr, device)
  # 用来计数页面,图片,曲线,figure,水平文本框等对象的数量
  num_page, num_image, num_curve, num_figure, num_TextBoxHorizontal = 0, 0, 0, 0, 0
  # 循环遍历列表,每次处理一个page的内容
  for page in doc.get_pages(): # doc.get_pages() 获取page列表
   num_page += 1 # 页面增一
   interpreter.process_page(page)
   # 接受该页面的LTPage对象
   layout = device.get_result()
   for x in layout:
    if isinstance(x,LTImage): # 图片对象
     num_image += 1
    if isinstance(x,LTCurve): # 曲线对象
     num_curve += 1
    if isinstance(x,LTFigure): # figure对象
     num_figure += 1
    if isinstance(x, LTTextBoxHorizontal): # 获取文本内容
     num_TextBoxHorizontal += 1 # 水平文本框对象增一
     # 保存文本内容
     with open(r'test2.doc', 'a',encoding='utf-8') as f: #生成doc文件的文件名及路径
      results = x.get_text()
      f.write(results)
      f.write('\n')
  print('对象数量:\n','页面数:%s\n'%num_page,'图片数:%s\n'%num_image,'曲线数:%s\n'%num_curve,'水平文本框:%s\n'
    %num_TextBoxHorizontal)

if __name__ == '__main__':
 pdf_path = r'diya.pdf' #pdf文件路径及文件名
 parse(pdf_path)

提供初始化密码

如果没有密码 就创建一个空的字符串

doc.initialize()

如果有密码 就写入相应的密码

未知加密方式的pdf文件

如果pdf文件的加密方式不知道,影响文件的复制和打印等可以先利用chrome浏览器来取消加密逻辑

实现方式很简单,只需要将加密的文件拖入到chrome浏览器再选择打印另存为就可以,破除加密后再使用程序转换文件格式

总结

以上所述是小编给大家介绍的Python 实现加密过的PDF文件转WORD格式,希望对大家有所帮助!

Python 相关文章推荐
Python中变量交换的例子
Aug 25 Python
Windows和Linux下使用Python访问SqlServer的方法介绍
Mar 10 Python
Python格式化css文件的方法
Mar 10 Python
python生成二维码的实例详解
Oct 29 Python
Python检测网络延迟的代码
May 15 Python
在Python 字典中一键对应多个值的实例
Feb 03 Python
Python获取Redis所有Key以及内容的方法
Feb 19 Python
pandas条件组合筛选和按范围筛选的示例代码
Aug 26 Python
python重要函数eval多种用法解析
Jan 14 Python
OpenCV图片漫画效果的实现示例
Aug 18 Python
python反编译教程之2048小游戏实例
Mar 03 Python
python tkinter模块的简单使用
Apr 07 Python
解决tensorflow打印tensor有省略号的问题
Feb 04 #Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 #Python
在 Python 中接管键盘中断信号的实现方法
Feb 04 #Python
在TensorFlow中屏蔽warning的方式
Feb 04 #Python
Python和Anaconda和Pycharm安装教程图文详解
Feb 04 #Python
Python3.7黑帽编程之病毒篇(基础篇)
Feb 04 #Python
python with (as)语句实例详解
Feb 04 #Python
You might like
php的mssql数据库连接类实例
2014/11/28 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
PHP实现适用于自定义的验证码类
2016/06/15 PHP
Laravel学习基础之migrate的使用教程
2017/10/11 PHP
PHP的PDO连接讲解
2019/01/24 PHP
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
2010/09/12 Javascript
提示$ is not defined错误分析及解决
2013/04/09 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
HTML+CSS+JS实现完美兼容各大浏览器的TABLE固定列
2015/04/26 Javascript
用JS动态改变表单form里的action值属性的两种方法
2016/05/25 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
JS实现可用滑块滑动的缓动图代码
2019/09/01 Javascript
Vue登录主页动态背景短视频制作
2019/09/21 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
Python中文件操作简明介绍
2015/04/13 Python
Python中最常用的操作列表的几种方法归纳
2015/04/24 Python
django 常用orm操作详解
2017/09/13 Python
python安装numpy&安装matplotlib& scipy的教程
2017/11/02 Python
Django中Middleware中的函数详解
2019/07/18 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
python基于socket实现的UDP及TCP通讯功能示例
2019/11/01 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
Python装饰器实现方法及应用场景详解
2020/03/26 Python
检测浏览器对HTML5和CSS3支持度的方法
2015/06/25 HTML / CSS
几道数据库的面试题或笔试题
2014/05/31 面试题
销售工作岗位职责
2013/12/24 职场文书
毕业自我鉴定书
2014/03/24 职场文书
2014年社区党建工作汇报材料
2014/11/02 职场文书
如何用Navicat操作MySQL
2021/05/12 MySQL
Rust 连接 PostgreSQL 数据库的详细过程
2022/01/22 PostgreSQL
css3带你实现3D转换效果
2022/02/24 HTML / CSS