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实现删除Android工程中的冗余字符串
Jan 19 Python
Python中比较特别的除法运算和幂运算介绍
Apr 05 Python
Python实现对excel文件列表值进行统计的方法
Jul 25 Python
python利用正则表达式提取字符串
Dec 08 Python
Python3如何解决字符编码问题详解
Apr 23 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
Mar 19 Python
Django实现表单验证
Sep 08 Python
python导入模块交叉引用的方法
Jan 19 Python
对Python 多线程统计所有csv文件的行数方法详解
Feb 12 Python
python获取磁盘号下盘符步骤详解
Jun 19 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
Aug 10 Python
Anaconda详细安装步骤图文教程
Nov 12 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
PHP4实际应用经验篇(9)
2006/10/09 PHP
基于php中使用excel的简单介绍
2013/08/02 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
2018/04/20 PHP
一实用的实现table排序的Javascript类库
2007/09/12 Javascript
关于JS中的闭包浅谈
2013/08/23 Javascript
关于JavaScript对象的动态选择及遍历对象
2014/03/10 Javascript
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
javascript判断并获取注册表中可信任站点的方法
2015/06/01 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
一步步教大家编写酷炫的导航栏js+css实现
2016/03/14 Javascript
全面解析node 表单的图片上传
2016/11/21 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
实例分析vue循环列表动态数据的处理方法
2018/09/28 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
axios携带cookie配置详解(axios+koa)
2018/12/28 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
2019/03/12 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
深入理解python中的atexit模块
2017/03/07 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
使用Python实现将list中的每一项的首字母大写
2019/06/11 Python
TensorFlow tf.nn.max_pool实现池化操作方式
2020/01/04 Python
python 生成任意形状的凸包图代码
2020/04/16 Python
Jupyter 无法下载文件夹如何实现曲线救国
2020/04/22 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
世界首屈一指的钓鱼用品商店:TackleDirect
2016/07/26 全球购物
Waterford加拿大官方网站:世界著名的水晶杯品牌
2016/11/01 全球购物
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
TripAdvisor台湾:全球最大旅游网站
2018/08/26 全球购物
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
小学生保护环境倡议书
2014/05/15 职场文书
运动会开幕式新闻稿
2015/07/17 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书
Python实现信息轰炸工具(再也不怕说不过别人了)
2021/06/11 Python
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android