媳妇儿让我给她找一个PDF转word免费工具,找了半天我决定给她写一个出来^-^
之前我媳妇儿让我给她找一个PDF转WORD的免费工具,在网上找了半天发现要不就是收费,要不就是转化的格式混乱。既然网上不能找到好用的免费工具那就直接来写一个吧。人生苦短,我用python。
万能的python肯定应该有关于这个第三方库,百度了一下果不其然——PDFminer3k(如果你用的是python2的话那你应该使用的是pdfminer)。
我们先上代码然后再分析吧。
# -*- coding:utf-8 -*-#author:菜鸟小白的学习分享from pdfminer.pdfparser import PDFParser, PDFDocumentfrom pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreterfrom pdfminer.converter import PDFPageAggregatorfrom pdfminer.layout import LTTextBoxHorizontal, LAParamsfrom pdfminer.pdfinterp import PDFTextExtractionNotAlloweddef parse(DataIO, save_path):# 用文件对象创建一个PDF文档分析器parser = PDFParser(DataIO)# 创建一个PDF文档doc = PDFDocument()# 分析器和文档相互连接parser.set_document(doc)doc.set_parser(parser)# 提供初始化密码,没有默认为空doc.initialize()# 检查文档是否可以转成TXT,如果不可以就忽略if not doc.is_extractable:raise PDFTextExtractionNotAllowedelse:# 创建PDF资源管理器,来管理共享资源rsrcmagr = PDFResourceManager()# 创建一个PDF设备对象laparams = LAParams()# 将资源管理器和设备对象聚合device = PDFPageAggregator(rsrcmagr, laparams=laparams)# 创建一个PDF解释器对象interpreter = PDFPageInterpreter(rsrcmagr, device)# 循环遍历列表,每次处理一个page内容# doc.get_pages()获取page列表for page in doc.get_pages():interpreter.process_page(page)# 接收该页面的LTPage对象layout = device.get_result()# 这里的layout是一个LTPage对象 里面存放着page解析出来的各种对象# 一般包括LTTextBox,LTFigure,LTImage,LTTextBoxHorizontal等等一些对像# 想要获取文本就得获取对象的text属性for x in layout:try:if (isinstance(x, LTTextBoxHorizontal)):with open('%s' % (save_path), 'a') as f:result = x.get_text()print(result)f.write(result + "\n")except:print("Failed")if __name__ == '__main__':# 解析同一文件夹下的PDF文件,保存到本地doc文件中with open(r'菜鸟小白.pdf', 'rb') as pdf_html:parse(pdf_html, r'11.doc')
分析过程
PDF没有WORD、Excel这样简单,可以直接去读取内容,读取PDF文件需要用程序以二进制的方式读取,然后转化成文字。而我们通过pdfminer的转化过程就好比是读取出来具体内容后猜测他们的布局,用于重建文字的结构,但是这个也无法保证100%能够工作。
代码中pdfminer调用的每个函数作用分别为:
DFParser(文档分析器)
PDFDocument(文档对象)
PDFResourceManager(资源管理器)
PDFPageInterpreter(解释器)
PDFPageAggregator(聚合器)
LAParams(参数分析器)
首先我们需要新建一个文档分析器和PDF文档,并且将PDF文档对象和文档分析器关联起来。
# 用文件对象创建一个PDF文档分析器parser = PDFParser(DataIO)# 创建一个PDF文档doc = PDFDocument()# 分析器和文档相互连接parser.set_document(doc)doc.set_parser(parser)
然后我们新建一个资源管理器和新建一个PDF参数对象
# 创建PDF资源管理器,来管理共享资源rsrcmagr = PDFResourceManager()# 创建一个PDF设备对象laparams = LAParams()
然后我们新建一个聚合器,用于接收资源管理器和参数对象;创建一个解释器,接收资源管理器和聚合器。
# 将资源管理器和设备对象聚合device = PDFPageAggregator(rsrcmagr, laparams=laparams)# 创建一个PDF解释器对象interpreter = PDFPageInterpreter(rsrcmagr, device)
然后使用get_pages()去获取所有的页面,用一个for循环遍历每一个页面,使用interperter页面解释器对页面进行逐一聚合,然后调用聚合器的get_result()获取到layout,layout中的每一个内容,只有文本内容才会被提取出来。
# 循环遍历列表,每次处理一个page内容# doc.get_pages()获取page列表for page in doc.get_pages():interpreter.process_page(page)# 接收该页面的LTPage对象layout = device.get_result()# 这里的layout是一个LTPage对象 里面存放着page解析出来的各种对象# 一般包括LTTextBox,LTFigure,LTImage,LTTextBoxHorizontal等等一些对像# 想要获取文本就得获取对象的text属性for x in layout:try:if (isinstance(x, LTTextBoxHorizontal)):with open('%s' % (save_path), 'a') as f:result = x.get_text()print(result)f.write(result + "\n")except:print("Failed")
最新实现效果
原始的PDF文档
转化后的word文档
缺陷
当前的代码仅能实现文字的提取,无法提取图片。后面我们再看看能否将图片也一起提取出来,有厉害的小伙伴也可以私信我。
最后我把这个从程序打包成了一个exe文件,只需要将你想要转化的PDF文档和exe文件放在同一个文件夹内就可以双击执行转化了。有需要的小伙伴可以私信菜鸟小白"PDFtoWORD"获取下载链接。
随机推荐
- mybatis 多表联查,多个实体类,如何返回一个List?(表太多,字段太多的问题)
原文:https://ask.csdn.net/questions/674166 自己重新定义一个实体类 把查询结果放到这个实体类中,实体类包含所有的查询结果的字段 一个更好的办法,我发现你这关联表所 ...
- CentOS Linux release 7.7.1908 (Core)--rabbitmq安装
1.连接服务器,输入账号和密码,密码输入的时候是看不见的,只管输就行,然后回车. 2.安装Erlang,RabbitMQ是用这门语言写的,所以要安装他. 3.安装filezilia就是win和linu ...
- 深度学习中环境配置的一些经验总结(conda 常用命令)
前两个月参加了学校的国创项目,和一个外院的同学组队.课题是基于深度学习的新闻图片中网络暴力元素的检查. 6月末最后一门试考完,正式开始暑假,便有了大把时间搞这个国创项目(反正没有其他事干).两个组凑钱 ...
- Spring Boot入门系列(十八)整合mybatis,使用注解的方式实现增删改查
之前介绍了Spring Boot 整合mybatis 使用xml配置的方式实现增删改查,还介绍了自定义mapper 实现复杂多表关联查询.虽然目前 mybatis 使用xml 配置的方式 已经极大减轻 ...
- JavaSE之流程控制结构
流程控制语句结构 一.顺序结构 public static void main(String[] args){ //顺序执行,根据编写的顺序,从上到下运行 System.out.pri ...
- cb23a_c++_标准模板库STL_set_multiset_关联容器
cb23a_c++_标准模板库STL_set_multiset_关联容器 set(集)数据不能重复.multiset(多集)可以重复.操作数据速度快,数据自动排序.红黑树(数据结构)红黑树-二叉树基本 ...
- 深入理解JVM(③)ZGC收集器
前言 ZGC是一款在JDK11中新加入的具有实验性质的低延迟垃圾收集器,目前仅支持Linux/x86-64.ZGC收集器是一款基于Region内存布局的,(暂时)不设分代的,使用了读屏障.染色指针和内 ...
- Beta冲刺<4/10>
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第四天(05.22) 作业正文 如下 其他参考文献 ... B ...
- js基础练习题(2)
5.函数 1.按要求封装两个函数 1.封装一个函数,要求输入字符串转化成数组弹出 2.封装一个函数,要求能求出三个数中的最小值,注意:不准使用js内置函数 2.封装一个函数,求参数的和,注意:参数不固 ...
- 【Spring注解驱动开发】如何使用@Value注解为bean的属性赋值,我们一起吊打面试官!
写在前面 在之前的文章中,我们探讨了如何向Spring的IOC容器中注册bean组件,讲解了有关bean组件的生命周期的知识.今天,我们就来一起聊聊@Value注解的用法. 项目工程源码已经提交到Gi ...