使用pymupdf实现PDF内容搜索并显示功能

简介:
在日常工作和学习中,我们可能需要查找和提取PDF文件中的特定内容。本文将介绍如何使用Python编程语言和wxPython图形用户界面库来实现一个简单的PDF内容搜索工具。我们将使用PyMuPDF模块来处理PDF文件,并结合wxPython构建一个用户友好的界面。
C:\pythoncode\new\pdffindcontent.py
在这里插入图片描述

准备工作

在开始之前,请确保已经安装了Python和相应的模块。可以使用pip来安装wxPython和PyMuPDF模块,具体安装方法可以参考官方文档。

创建GUI界面

我们首先需要创建一个GUI界面,以便用户选择要搜索的PDF文件并输入要查找的内容。我们使用wxPython库来创建界面。

def __init__(self, parent, title):super(PDFSearchFrame, self).__init__(parent, title=title, size=(800, 600))panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)# 选择文件按钮file_picker = wx.FilePickerCtrl(panel, style=wx.FLP_OPEN|wx.FLP_FILE_MUST_EXIST)file_picker.Bind(wx.EVT_FILEPICKER_CHANGED, self.on_file_selected)vbox.Add(file_picker, 0, wx.EXPAND|wx.ALL, 10)# 输入框和按钮hbox = wx.BoxSizer(wx.HORIZONTAL)self.search_text = wx.TextCtrl(panel)search_button = wx.Button(panel, label='搜索')search_button.Bind(wx.EVT_BUTTON, self.on_search)hbox.Add(self.search_text, 1, wx.EXPAND|wx.ALL, 5)hbox.Add(search_button, 0, wx.ALL, 5)vbox.Add(hbox, 0, wx.EXPAND|wx.ALL, 10)# 显示框self.display_text = wx.TextCtrl(panel, style=wx.TE_MULTILINE|wx.TE_READONLY)vbox.Add(self.display_text, 1, wx.EXPAND|wx.ALL, 10)panel.SetSizer(vbox)self.Show()

在上述代码中,我们创建了一个名为PDFSearchFrame的窗口类,它继承自wxPython的wx.Frame类。在该类的构造函数中,我们创建了界面的各个组件,包括选择文件按钮、输入框和搜索按钮以及显示框。

PDF内容搜索和提取

接下来,我们需要在代码中添加PDF内容搜索和提取的功能。我们将使用PyMuPDF模块来处理PDF文件。

# 导入所需模块
import wx
import fitzdef on_search(self, event):search_text = self.search_text.GetValue()if not search_text or not self.pdf_path:returndoc = fitz.open(self.pdf_path)matches = []for page in doc:text = page.get_text().lower()if search_text.lower() in text:matches.append((page.number, text))self.display_text.SetValue('')if matches:for page_num, text in matches:self.display_text.AppendText(f"Page {page_num}:\n{text}\n\n")else:self.display_text.AppendText("未找到匹配的内容。")doc.close()

在上述代码中,我们在on_search方法中添加了PDF内容搜索和提取的代码。首先,我们使用fitz.open函数打开选择的PDF文件,并遍历每一页的文本内容。然后,我们将文本内容转换为小写,并检查搜索文本是否在其中。如果找到合适的匹配项,我们将它们存储在matches列表中。最后,我们将匹配的结果显示在显示框中,如果没有找到匹配的内容,则显示相应的提示信息。

全部代码

import wx
import fitzclass PDFSearchFrame(wx.Frame):def __init__(self, parent, title):super(PDFSearchFrame, self).__init__(parent, title=title, size=(800, 600))panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)# 选择文件按钮file_picker = wx.FilePickerCtrl(panel, style=wx.FLP_OPEN|wx.FLP_FILE_MUST_EXIST)file_picker.Bind(wx.EVT_FILEPICKER_CHANGED, self.on_file_selected)vbox.Add(file_picker, 0, wx.EXPAND|wx.ALL, 10)# 输入框和按钮hbox = wx.BoxSizer(wx.HORIZONTAL)self.search_text = wx.TextCtrl(panel)search_button = wx.Button(panel, label='搜索')search_button.Bind(wx.EVT_BUTTON, self.on_search)hbox.Add(self.search_text, 1, wx.EXPAND|wx.ALL, 5)hbox.Add(search_button, 0, wx.ALL, 5)vbox.Add(hbox, 0, wx.EXPAND|wx.ALL, 10)# 显示框self.display_text = wx.TextCtrl(panel, style=wx.TE_MULTILINE|wx.TE_READONLY)vbox.Add(self.display_text, 1, wx.EXPAND|wx.ALL, 10)panel.SetSizer(vbox)self.Show()def on_file_selected(self, event):self.pdf_path = event.GetPath()def on_search(self, event):search_text = self.search_text.GetValue()if not search_text or not self.pdf_path:returndoc = fitz.open(self.pdf_path)matches = []for page in doc:text = page.get_text().lower()if search_text.lower() in text:matches.append((page.number, text))self.display_text.SetValue('')if matches:for page_num, text in matches:self.display_text.AppendText(f"Page {page_num}:\n{text}\n\n")else:self.display_text.AppendText("未找到匹配的内容。")doc.close()if __name__ == '__main__':app = wx.App()PDFSearchFrame(None, title="PDF搜索")app.MainLoop()

运行程序

完成以上步骤后,我们可以保存并运行这个程序。一个具有搜索功能的PDF内容搜索工具的窗口将会弹出。我们可以选择要搜索的PDF文件,输入要查找的内容,并点击搜索按钮。程序将会将匹配的结果显示在显示框中,包括找到的页面号和相应的文本内容。

总结:
本文介绍了如何使用Python和wxPython库来实现一个简单的PDF内容搜索工具。通过结合PyMuPDF模块和wxPython图形界面,我们能够方便地选择PDF文件,并在输入框中输入要查找的内容。程序将搜索匹配的内容,并将找到的页面内容提取到显示框中。这个工具可以帮助我们快速查找和提取PDF文件中的特定内容,提高工作效率。

关键词:Python、wxPython、PDF、内容搜索、PyMuPDF

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

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

相关文章

Redis—集群

目录标题 主从复制第一次同步命令传播分担主服务器压力增量复制总结面试题什么是Redis主从复制Redis主从复制的原理Redis主从复制的优点Redis主从复制的缺点Redis主从复制的配置步骤Redis主从复制的同步策略主从节点是长还是短连接判断某个节点是否正常工作主从复制架构中&…

elementUI 的上传组件<el-upload>,自定义上传按钮样式

方法一&#xff1a; 原理&#xff1a;调用<el-upload>组件的方法唤起选择文件事件 效果&#xff1a; 页面代码&#xff1a; 1、选择图片按钮 <div class"flex_row_spacebetween btn" click"chooseImg"><span class"el-icon-plus ic…

Kotlin 基础教程一

Kotlin 基本数据类型 Java | Kotlin byte Byte short Short int Int long Long float Float double Double boolean Boolean c…

ceph数据分布

ceph的存储是无主结构&#xff0c;数据分布依赖client来计算&#xff0c;有两个条主要路径。 1、数据到PG 2、PG 到OSD 有两个假设&#xff1a; 第一&#xff0c;pg的数量稳定&#xff0c;可以认为保持不变&#xff1b; 第二&#xff0c; OSD的数量可以增减&#xff0c;OSD的…

安装和配置 Ansible

安装和配置 Ansible 按照下方所述&#xff0c;在控制节点 control.area12.example.com 上安装和配置 Ansible&#xff1a; 安装所需的软件包 创建名为 /home/curtis/ansible/inventory 的静态清单文件&#xff0c;以满足以下要求&#xff1a; node1 是 dev 主机组的成员 node2 …

软件需求-架构师之路(五)

软件需求 软件需求&#xff1a; 指用户 对系统在功能、行为、性能、设计约束等方面的期望。 分为 需求开发 和 需求管理 两大过程。 需求开发&#xff1a; 需求获取需求分析需求定义&#xff08;需求规格说明书&#xff09;需求验证&#xff1a;拉客户一起评审&#xff0c…

LeetCode150道面试经典题-- 合并两个有序链表(简单)

1.题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 2.示例 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输…

Sencha Ext.NET Crack,构建Blazing快速应用

Sencha Ext.NET Crack,构建Blazing快速应用 Sencha Ext.NET是一个高级的ASP.NET核心组件框架&#xff0c;它包含了强大的跨浏览器Sencha Ext JS库。通过140多个预构建和专业测试的UI组件实现企业级性能和生产效率。Sencha Ext.NET使用尖端的Web技术创建功能强大的Web应用程序&a…

item_password-获得淘口令真实url

一、接口参数说明&#xff1a; item_password-获得淘口令真实url &#xff0c;点击更多API调试&#xff0c;请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_password 名称类型必须描述keyString是调用key&#xff08…

ATF(TF-A) 威胁模型汇总

安全之安全(security)博客目录导读 目录计划如下&#xff0c;相关内容补充中&#xff0c;待完成后进行超链接&#xff0c;敬请期待&#xff0c;欢迎您的关注 1、通用威胁模型 2、SPMC威胁模型 3、EL3 SPMC威胁模型 4、fvp_r 平台威胁模型 5、RSS-AP接口威胁模型 威胁建模是安全…

十、RabbitMQ集群

一、clustering 1、 使用集群的原因 单台RabbitMQ遇到内存崩溃、机器故障等情况会导致服务不可用单台RabbitMQ只能满足每秒1000条的消息吞吐量 2、搭建步骤 1、准备三台虚拟机 2、修改3台机器的主机名称 分别为node1、node2、node3 vi /etc/hostname 3、配置节点的hosts文…

hive中get_json_object函数不支持解析json中文key

问题 今天在 Hive 中 get_json_object 函数解析 json 串的时候&#xff0c;发现函数不支持解析 json 中文 key。 例如&#xff1a; select get_json_object({ "姓名":"张三" , "年龄":"18" }, $.姓名);我们希望的结果是得到姓名对应…