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卸载模块的方法汇总
Jun 07 Python
python爬虫中get和post方法介绍以及cookie作用
Feb 08 Python
PyQt5每天必学之关闭窗口
Apr 19 Python
对python多线程与global变量详解
Nov 09 Python
Python3.5 处理文本txt,删除不需要的行方法
Dec 10 Python
python程序快速缩进多行代码方法总结
Jun 23 Python
python 字典的打印实现
Sep 26 Python
浅谈Python 钉钉报警必备知识系统讲解
Aug 17 Python
Python中openpyxl实现vlookup函数的实例
Oct 28 Python
python中的yield from语法快速学习
Nov 06 Python
Python 数据分析之逐块读取文本的实现
Dec 14 Python
python反扒机制的5种解决方法
Feb 06 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中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
2009/09/05 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
2012/02/19 PHP
php版本的cron定时任务执行器使用实例
2014/08/19 PHP
PHP利用二叉堆实现TopK-算法的方法详解
2017/04/24 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
什么是PHP7中的孤儿进程与僵尸进程
2019/04/14 PHP
JS中style属性
2006/10/11 Javascript
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
通过继承IHttpHandle实现JS插件的组织与管理
2010/07/13 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
几种经典排序算法的JS实现方法
2016/03/25 Javascript
Vue.js手风琴菜单组件开发实例
2017/05/16 Javascript
原生JS实现图片网格式渐显、渐隐效果
2017/06/05 Javascript
简单实现js轮播图效果
2017/07/14 Javascript
p5.js入门教程之鼠标交互的示例
2018/03/16 Javascript
JS使用数组实现的队列功能示例
2019/03/04 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
详解vue更改头像功能实现
2019/04/28 Javascript
实例详解vue中的$root和$parent
2019/04/29 Javascript
解决Vue打包上线之后部分CSS不生效的问题
2019/11/12 Javascript
Openlayers实现地图的基本操作
2020/09/28 Javascript
[01:05]DOTA2完美大师赛趣味视频之选手教你打职业
2017/11/23 DOTA
Python常用随机数与随机字符串方法实例
2015/04/09 Python
python 安装virtualenv和virtualenvwrapper的方法
2017/01/13 Python
Python模拟随机游走图形效果示例
2018/02/06 Python
python实现微信发送邮件关闭电脑功能
2018/02/22 Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
2020/08/11 Python
CSS3点击按钮实现背景渐变动画效果
2016/10/19 HTML / CSS
《童年》教学反思
2014/02/18 职场文书
人身意外保险授权委托书
2014/10/01 职场文书
警察正风肃纪剖析材料
2014/10/16 职场文书
2015年秋季开学典礼校长致辞
2015/07/16 职场文书
2016年秋季运动会通讯稿
2015/11/25 职场文书
个人道歉信大全
2019/04/11 职场文书
Vue3中的Refs和Ref详情
2021/11/11 Vue.js