io python 读取pdf_Python读取PDF信息填入Word文档

news/2024/7/23 19:09:50

5a6d013cc6ba61e8c001b3645457ba9e.png

Hello,上个周末没能搞事情,被一个代码需求给绊住了:朋友在平时工作中会经常重复性地打开不同PDF文件,选取其中特定的几组信息复制粘贴到不同的Word文档中,完成一份PDF文件平均耗时15分钟,想试试Python代码能否帮忙

f3e1909e176e22e3327f3ad43db35a08.png

4c37282a77c125ddd438ca1d247718b1.png

由于涉及其文件隐私,将需求简化如下:我这提供一份PDF版《笨办法学Python》,想把其中第五页的第1段和第4段填充到Word文档 “笔记.docx” 特定位置:

df008674692f98cbced083277f6f1377.png

上图为PDF中的目标文字;下图为Word文档要填充的位置:

ec30107874585a4aea2e6434119a2c4c.png

思路

首先利用PDFMiner模块解析PDF文件,转化成PDF内容的文本列表;根据目标位置在列表中提取目标文本;利用Python处理Word文档的库docx-mailmerge模块,进行文本填充。

PDFMiner模块

PDFMiner是一个专注于从PDF文档中提取、分析文本信息的工具。它不仅可以获取特定页码特定位置处的信息,也能获得字体等信息。其工作原理如图所示:

5bd02f6372c43b8af65830c8af3d735b.png

看不懂原理图无妨,我们着重看应用。首先安装PDFMiner,注意Python3要安装pdfminer3k,可以通过pip install pdfminer3k进行安装

解析PDF涉及代码步骤较多,先不展开,文末提供注释源码供参考。通过PDFMiner解析,文本内容按区域存到不同页码的文本list中;每一页又作为元素存入整个文档的list中。即假设content代表整个PDF文本信息,content[0]为第一页信息,content[4]即我们想要的第五页信息。而第五页中,按照list元素顺序,我们想要的第一段和第四段就可以通过content[4][1]和content[4][4]拿到了:

aa6688aa96a9afc6461b1966a319a700.png

docx-mailmerge模块

这个模块的应用类似于你先在Word文档中特定位置去定义好变量,之后在代码中通过MailMerge函数为变量赋值。

首先是安装:pip install docx-mailmerge

接下来去Word文档中定义要插入的变量,在要插入文本的位置选择 “插入”→“文档部件”→“域”:

29d55c268e99c0cacb0fdf2cb0243f57.png

在弹出的窗口中选择mailmerge变量,中文直译“邮件合并”,域名是自己定义的变量名,这里我用firstTED 来代表第一段:

fe9070402a9eb17c0fd1327ff66e07e1.png

设置完成后会看到<<firstTED>>出现在Word文档中。同理,我们设置fourthTED来代表第四段,最终结果如图:

a9780d48590b8c4ca5b27bdcf1c2a18b.png

至此,Word文档中变量定义完成,继续回到代码中。我们已经拿到了第一段和第四段的文本,接下来就是将其和新定义的firstTED 和 fourthTED 融合:

    template = "../读书笔记.docx"
    document = MailMerge(template)
    document.merge(
        firstTED = content[4][1],
        fourthTED = content[4][4],
    )
    document.write("读书笔记更新.docx")

最终在PDF文件旁会生成新的“读书笔记更新.docx”:

6a58400eb7a586eca63afd750ae979a6.png

目标达成!写给朋友的初版代码,对于能拿到的文本信息准确度也是很高的,而且可以批量处理文档。代码运行几秒钟,便将人力几个小时的工作完成了,余下的是相对轻松的校验和修正。可能你一天的繁琐工作,对代码而言就是几秒的事情。

回顾

就实现效果来看,达到了预期,但仍有待提高。最终效果与PDF文件的格式是否规范有直接关系,有许多扫描件PDF文档每页都像是图片,就无法通过PDFMiner顺利获取到文本信息。后续我们将尝试先把PDF转图片,再通过OCR识别图片中文字信息的思路来搞定。

此外,为了展示,选用的PDF和Word文档以及要插入的信息都较规范简洁,在实际需求中,因为批量操作,也会遇到各种大小问题,这些都要在实战中去不断完善。

代码下载

百度网盘链接 提取码:mvi4

GitHub代码下载链接

最后附上朋友对初版代码的反应,令人很有成就感!

d19f7e5b701a707a3783fc3d2663d35f.png

正在学Python或水平挺不错的朋友,不妨问问身边朋友有没有什么繁琐的工作可以用代码改进,如果有,反手甩他一个代码,也是很不错的体验哦~


http://www.niftyadmin.cn/n/711955.html

相关文章

html左侧浮动css,float:left css浮动靠左 布局靠左

css float:left 浮动靠左组织首先float是机关网页浮动(对象靠左left、靠右right)花式属性单词。在机关中我们要让对象靠左浮现只须要对对象配置float:left格式就可。一、float left语法1、float:left使用树模代码div{float:left}配置div结构靠左。2、float:left表达float:left是…

成长游戏

一、软件介绍软件有积分和金币两种指数。1&#xff09;积分用来记录成长&#xff0c;积分到达一定程序后会升级。积分的获取渠道&#xff1a;任务、荣誉。每个任务可以配置相应的积分。添加荣誉时也可以配置积分。2&#xff09;金币用来奖励&#xff0c;金币可以用来兑换愿望。…

图像处理之基础---卷积函数积分的计算和性质

http://www.eefocus.com/article/08-03/34761s.html转载于:https://www.cnblogs.com/pengkunfan/p/3903632.html

Java Web——Servlet之前的调用方式、重定向解决方案、请求转发解决方案

1.Servlet之前的调用方式 1.前提条件&#xff1a;针对浏览器某次请求&#xff0c;需要在服务端中由多个Servlet参与其中&#xff0c;但是浏览器一次只能请求一个资源文件&#xff0c;导致用户为了得到服务&#xff0c;结果需要手动通过浏览器发起多次请求&#xff0c;增加用户获…

控制局部对触摸的响应与否

BView遮挡AView&#xff0c;BView有子viewB1&#xff0c;AView有手势。希望点击在B1中的时候&#xff0c;AView可以响应手势。 若果让BView整个userInteractionEnabled NO&#xff0c;那么点击在BView的任何地方&#xff0c;AView的手势都会响应&#xff0c;不符合要求。 可以…

博图组态显示未分配的设备_S7-1200 PWM 功能组态及编程方法

本文档以DC/DC/DC类型的S7-1200 CPU为例进行说明。在Portal 软件中插入S7-1200 CPU(DC输出类型)&#xff0c;在“设备视图”中配置PWM。1. 进入CPU“常规”属性&#xff0c;设置“脉冲发生器”。如下图所示&#xff1a;2. 启用脉冲发生器&#xff0c;可以给该脉冲发生器起一个名…

[1252]进制转换 sdutOJ

&#xfeff;&#xfeff;进制转换 Time Limit: 1000ms Memory limit: 65536K 有疑问&#xff1f;点这里^_^ 题目描述 输入一个十进制数N&#xff0c;将它转换成R进制数输出。输入 输入数据包含多个测试实例&#xff0c;每个测试实例包含两个整数N(32位整数)和R&#xff08;…

信托互联网化改造 核心是大数据

信托行业在很多领域可以借助互联网的优势&#xff0c;比如说互联网产品的宣传介绍、互联网的验证面签、开户和期间的服务管理&#xff0c;都能够利用互联网扁平的无边界特性有效地提升客户体验和提升客户效率。 在论坛上&#xff0c;华宝信托总经理王波表示&#xff0c;尽管互联…