快速预览PDF报告,PDF提取文字并统计词频

通过统计词频来快速预览PDF报告。本文提供了文字PDF和图片PDF提取文字的两类方式。
对于是文字类的PDF可以快速的提取其中文字,但是有许多PDF是图片格式,并不能直接提取文字。本文采取PDF转图片,并通过OCR识别文字生成文本,进而统计文本的词频的方式进行快速预览。

一、PDF转图片
本文使用PyMuPDF模块进行转化。
1、 PyMuPD网上有许多资料,但是多数比较老,这个模块的API已有变动,本文做了更新。本模块安装需要pip install PyMuPDF,但是导入是fitz。该库不支持python3.10以上版本。
2、本文加了文件路径处理的功能find_pdf_files(directory)函数和以下部分。

filename = os.path.basename(pdf)
file_name, file_extension = os.path.splitext(filename)
image_path = f"{imagePath}\{file_name}{pg}.jpg"

代码

import datetime
import os
import fitz  #输出以.pdf结尾的文件的完整文件路径
def find_pdf_files(directory):pdf_files = []for root, dirs, files in os.walk(directory):for file in files:if file.endswith('.pdf'):pdf_file_path = os.path.join(root, file)pdf_files.append(pdf_file_path)return pdf_filesdef pyMuPDF_fitz(pdf, imagePath):startTime_pdf2img = datetime.datetime.now()  # 开始时间print("imagePath=" + imagePath)pdfDoc = fitz.open(pdf)for pg in range(pdfDoc.page_count):page = pdfDoc[pg]rotate = int(0)# 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。# 此处若是不做设置,默认图片大小为:792X612, dpi=96zoom_x = 1.33333333  # (1.33333333-->1056x816)   (2-->1584x1224)zoom_y = 1.33333333mat = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)pix = page.get_pixmap(matrix=mat, alpha=False)if not os.path.exists(imagePath):  # 判断存放图片的文件夹是否存在os.makedirs(imagePath)  # 若图片文件夹不存在就创建# 提取不带扩展名的文件名filename = os.path.basename(pdf)file_name, file_extension = os.path.splitext(filename)image_path = f"{imagePath}\{file_name}{pg}.jpg"pix._writeIMG(image_path,format_="jpg",jpg_quality=100)  # 将图片写入指定的文件夹内endTime_pdf2img = datetime.datetime.now()  # 结束时间print('pdf2img时间=', (endTime_pdf2img - startTime_pdf2img).seconds)if __name__ == "__main__":path=r"xx"flist=find_pdf_files(path)# 1、PDF地址for pdf in flist:# 2、需要储存图片 的目录imagePath = r"xx"pyMuPDF_fitz(pdf, imagePath)

二、OCR图片转文字
本文使用的是百度开源的paddleocr库
pip3.10 install paddlepaddlepip install paddleocr,注意这两个库暂时不支持python3.10以上的版本,主要是paddleocr依赖的PyMuPDF不支持python3.10以上版本。

代码为

from paddleocr import PaddleOCR
import os
import re#输出结果转字符串
def text_noposition(data, left, right, bottom, top):text_res = ""# data[0]包含位置和文本信息for i in data[0]:# i[0][0][0]是横向,i[0][0][1]是位置的纵向x, y = i[0][0][0], i[0][0][1]if left < x < right and bottom < y < top:# i[1][0]是文字text_res = text_res + i[1][0]return text_res
def convert_png_to_txt(dir_path,output_path):# 初始化PaddleOCRocr = PaddleOCR(use_angle_cls=True, lang="ch")output_text = ""# 遍历指定目录下的所有.png文件for filename in os.listdir(dir_path):if filename.endswith('.jpg'):file_path = os.path.join(dir_path, filename)# 使用PaddleOCR提取图片中的文本result = ocr.ocr(file_path, cls=True)print(result)# 使用text_noposition函数处理提取的文本processed_text = text_noposition(result, left=0, right=10000, bottom=500, top=2000)# 将处理后的文本追加到输出文本中output_text += processed_text + "\n"# 将输出文本写入.txt文件并关闭该文件with open(output_path, "a") as file:  # 可以根据需要更改文件名和路径file.write(output_text)file.close()# 指定要处理的图片的目录
dir_path = r'D:\data\2024\PDF\xx'
# 文件输出路径
output_path = r'D:\data\2024\PDF\xx'
convert_png_to_txt(dir_path,output_path)

三、读取高频词

读取结果、使用结巴分词,并统计词频。

视文件编码不同,如果报错gbk编码问题,打开文件部分需要改为:
f = open(file_path, encoding=‘utf-8’)

from collections import Counter
import jieba
import pandas as pddef cut_with_filter(sentence, stopwords):# 使用结巴分词的精确模式进行分词seg_list = jieba.cut(sentence, cut_all=False)# 去除停用词filtered_seg_list = [word for word in seg_list if word not in stopwords]return filtered_seg_listif __name__ == '__main__':file_path = r"D:\data\2023\pdf\pdf\结果.txt"# 要分词的文本f = open(file_path)text = f.read()#text = read_doc_file(file_path)# 停用词列表,你可以根据需要自行添加或修改stopwords = ["的", "了", "在", "是", "我", "有", "和", "就", "不", "人", "都", "一", "一个", "上", "也", "很", "到"]word_list=cut_with_filter(text,stopwords)chinese_list = [word for word in word_list if isinstance(word, str) and word.isalpha()]# 统计每个词的词频counter = Counter(chinese_list)word_freq = dict(counter)keys = pd.Series(list(word_freq.keys()))values = pd.Series(list(word_freq.values()))# 将分词结果和词频保存到DataFramedf = pd.DataFrame({'词': keys, '词频': values})print(df)# 将DataFrame保存到Excel文件df.to_excel('分词结果1.xlsx', index=False)

四、提取文字型PDF的文字

使用PyMuPDF库可以快速提取文字型PDF的文字。本文做了封装。

1、转化单个文件,使用pdf2txt函数,输入路径是PDF文件的路径
2、转化一个文件夹下,使用 pdf2txt_multi函数,输入路径是PDF所在的文件夹

import fitz  
import os
#转化单个文件
def pdf2txt(input_file,output_file):with fitz.open(input_file) as doc:text = ""for page in doc.pages():text += page.get_text()  # 注意这里使用了 get_text() 方法with open(output_file, "w", encoding="utf-8") as f:f.write(text)return textdef pdf2txt_multi(input_folder, output_file):# 遍历输入文件夹中的所有文件for file_name in os.listdir(input_folder):if file_name.endswith(".pdf"):print(file_name)# 构建输入文件路径input_file = os.path.join(input_folder, file_name)# 打开PDF文件,并写入txt文件with fitz.open(input_file) as doc:text = ""for page in doc.pages():text += page.get_text()  # 注意这里使用了 get_text() 方法with open(output_file, "w", encoding="utf-8") as f:f.write(text)return textif __name__ == "__main__":# 输入和输出文件路径,当要转化一个文件夹时是文件夹路径。input_file =r"xx"output_file = "output.txt"pdf2txt_multi(input_file,output_file)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/625703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink会话集群docker-compose一键安装

1、安装docker 参考&#xff0c;本人这篇博客&#xff1a;https://blog.csdn.net/taotao_guiwang/article/details/135508643?spm1001.2014.3001.5501 2、flink-conf.yaml flink-conf.yaml放在/home/flink/conf/job、/home/flink/conf/task下面&#xff0c;flink-conf.yaml…

【并发】阻塞队列与等待队列

在多线程编程中&#xff0c;等待队列和阻塞队列是两个重要而常用的概念。它们在线程同步和协作中发挥着关键的作用。在本文中&#xff0c;我们将深入探讨等待队列和阻塞队列的概念、特点以及它们在多线程环境下的应用。 等待队列&#xff08;Wait Queue&#xff09;&#xff1…

C++输入输出和文件

文章目录 一. 流, 缓冲区和iostream文件二. 使用cout进行输出1. 用cout进行格式化2. 刷新输出缓冲区 三. 使用cin进行输入1. cin>>如何检查输入2. 流状态3. 其他istream类方法 四. 文件输入和输出1. 简单的文件I/O2. 文件模式3. 随机存取4. 内核格式化 To be continue...…

jmeter--6.跨线程组关联

目录 1. 跨线程组实现接口关联 2. 跨线程组实现Cookie关联 1. 跨线程组实现接口关联 1.1 根据json/正则的方式提取到需要的响应数据 1.2 在接口下新增一个BeanShell 后置处理器&#xff0c;并通过函数助手写入【${__setProperty(new_token,${access_token},)}】&#xff0c;…

Unet系列网络解析

Unet UNet最早发表在2015的MICCAI上&#xff0c;到2020年中旬的引用量已经超过了9700多次&#xff0c;估计现在都过万了&#xff0c;从这方面看足以见得其影响力。当然&#xff0c;UNet这个基本的网络结构有太多的改进型&#xff0c;应用范围已经远远超出了医学图像的范畴。我…

Linux中的高级权限

hash算法: echo 123 | md5sum : 生成随机的密码123的哈希值,只要密码是一样的,哈希值都是一样的 密码一般比较复杂,用的sha512算法,更安全 /etc/login.defs : 考试要考的配置的文件 chage -l user1 : 可以列出密码的设定情况 w : 显示当前登入系统的用户信息 last …

Java 重载 注解

目录 一、重载&#xff1a;二、注解 一、重载&#xff1a; 在java中&#xff0c;如果有功能类似&#xff0c;可以使用相同的名字来定义不同功能方法&#xff1b; 定义重载方法的时候&#xff0c;要求&#xff1a; 1.方法的名字必须相同&#xff0c;作用域必须相同 2.参数必须…

JS浏览器的默认行为及阻止行为,阻止右键菜单、阻止超链接跳转、阻止拖拽事件

浏览器的默认行为及阻止行为 &#xff08;一&#xff09;右键菜单事件&#xff1a;oncontextmenu 阻止&#xff1a;return false; <div οncοntextmenu"myFunction()"> <p>在文本框内右击鼠标</p> </div> <script> function myF…

命名空间 “Eigen“ 没有成员 “SelfAdjointEigenSolver“

代码中用到SelfAdjointEigenSolver 结果报错&#xff1a;报错实在windows10条件下发生的。 查找资料&#xff0c;最后还是要定位到官方文档。 计算自伴随矩阵的特征值和特征向量。 这是在特征值模块中定义的。 添加如下引用即可解决&#xff0c;请点赞关注。 #include <…

设备之AP555【之一】

1、Audio Precision官网 Audio Precision 是声学及音频测试中公认的标准。AP提供了高性能声学和音频分析仪&#xff0c;配件和应用程序&#xff0c;帮助全球工程师设计&#xff0c;验证和制造消费电子、专业和工业的声学和音频产品。 APX555B 是具有三十年经验的测试设备&…

Java项目:120SpringBoot婚恋网站

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 婚恋网站是由SpringBootMybatis开发的&#xff0c;功能详细&#xff0c;满足婚恋网的基本要求。 主要功能如下&#xff1a; 登录注册用户浏览用户搜索成…

2024年腾讯云服务器多少钱1年?超便宜62元一年

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

springCould中的Hystrix【下】-从小白开始【8】

目录 &#x1f9c2;1.熔断机制❤️❤️❤️ &#x1f32d;2.修改8001服务 ❤️❤️❤️ &#x1f95e;3.测试 ❤️❤️❤️ &#x1f953;4. 服务监控hystrixDashboard❤️❤️❤️ &#x1f32d;5.仪表盘❤️❤️❤️ &#x1f9c2;6.仪表盘的使用 ❤️❤️❤️ 1.熔断机…

数据库SELECT语句

文章目录 一、检索数据二、排序检索三、过滤数据四、数据过滤4.1 组合WHERE子句1. AND操作符2. OR操作符3. 计算次序 4.2 IN操作符4.3 NOT操作符 五、用通配符过滤LIKE操作符1. 百分号&#xff08;%&#xff09;通配符2. 下划线&#xff08;_&#xff09;通配符 使用通配符的技…

【Kotlin】协程的字节码原理

前言 协程是Koltin语言最重要的特性之一&#xff0c;也是最难理解的特性。网上关于kotlin协程的描述也是五花八门&#xff0c;有人说它是轻量级线程&#xff0c;有人说它是无阻塞式挂起&#xff0c;有人说它是一个异步框架等等&#xff0c;众说纷芸。甚至还有人出了书籍专门介…

transbigdata笔记:可视化

1 可视化轨迹 transbigdata.visualization_trip(trajdata, col[Lng, Lat, ID, Time], zoomauto, height500) 例子见transbigdata 笔记&#xff1a;官方文档案例1&#xff08;出租车GPS数据处理&#xff09;-CSDN博客 2 可视化od transbigdata.visualization_od(oddata, col…

【分布式技术】监控平台zabbix对接grafana,优化dashboard

目录 第一步&#xff1a;在zabbix server服务端安装grafana&#xff0c;并启动 第二步&#xff1a; 访问http://ip:3000/login 第三步&#xff1a;创建数据源 第四步&#xff1a;导入dashboard模板 ps&#xff1a;自定义创建新面板 第一步&#xff1a;在zabbix server服务…

关于js学习-初体验

js学习 为什么分类到opengl?前言js的基础语法1.Variables(变量):2.Data Types(数据类型):3.Arrays:4.Objects:5.Operators:6.Control Structures:7.Functions:8.Events(事件):9. Comments(注释): 思考:difference of var and let1.Scope(范围):2.Hoisting(变量提升):3.Re-decl…

Java线上问题堆栈排查分析

最近线上出现类似内存溢出问题&#xff0c;需要排查具体原因&#xff0c;记录过程&#xff0c;方便备查。 一、数据抓取 在启动参数中添加参数&#xff0c;可参照以下设置。 参数的作用是在程序发生内存溢出 OutOfMemory 时打印日志&#xff0c;dump下来&#xff0c;方便用工…

leetcode 206翻转链表

题目&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 提示&#xff1a; 链表中节点的数目范围是 [0, 5000] -5000 < Node.val < 5000 解法&#xff1a; 思路 使用双指针&#xff0c;pre,定义当前指针cur&#xff0…