使用wxPython和PyMuPDF提取PDF页面指定页数的内容的应用程序

在本篇博客中,我们将探讨如何使用wxPython和PyMuPDF库创建一个简单的Bokeh应用程序,用于选择PDF文件并提取指定页面的内容,并将提取的内容显示在文本框中。
C:\pythoncode\new\pdfgetcontent.py
在这里插入图片描述

准备工作

首先,确保你已经安装了以下库:

  • wxPython:用于创建桌面应用程序界面。
  • PyMuPDF:用于处理PDF文件和提取页面内容。

你可以使用以下命令来安装这些库:

pip install wxPython pymupdf 

创建应用程序界面

我们将使用wxPython来创建应用程序的图形界面。在应用程序窗口中,我们将添加一个选择按钮,一个页码输入框,一个提取按钮和一个文本框用于显示提取的内容。

def __init__(self):super().__init__(None, title="提取PDF页面内容", size=(400, 300))panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)select_button = wx.Button(panel, label="选择PDF文件")select_button.Bind(wx.EVT_BUTTON, self.on_select_pdf)vbox.Add(select_button, proportion=0, flag=wx.ALIGN_CENTER | wx.ALL, border=10)page_label = wx.StaticText(panel, label="页码:")vbox.Add(page_label, proportion=0, flag=wx.LEFT, border=10)self.page_input = wx.TextCtrl(panel)vbox.Add(self.page_input, proportion=0, flag=wx.EXPAND | wx.ALL, border=10)extract_button = wx.Button(panel, label="提取内容")extract_button.Bind(wx.EVT_BUTTON, self.on_extract_content)vbox.Add(extract_button, proportion=0, flag=wx.ALIGN_CENTER | wx.ALL, border=10)content_label = wx.StaticText(panel, label="内容:")vbox.Add(content_label, proportion=0, flag=wx.LEFT, border=10)self.content_text = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_READONLY)vbox.Add(self.content_text, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)panel.SetSizer(vbox)def on_select_pdf(self, event):dialog = wx.FileDialog(self, message="选择PDF文件", wildcard="PDF files (*.pdf)|*.pdf", style=wx.FD_OPEN)if dialog.ShowModal() == wx.ID_OK:self.pdf_path = dialog.GetPath()dialog.Destroy()

在上述代码中,我们创建了一个名为PDFContentExtractor的类,继承自wx.Frame。在该类中,我们使用Bokeh创建了一个包含选择按钮、页码输入框、提取按钮和内容文本框的布局。我们为选择按钮和提取按钮绑定了相应的事件处理方法。

处理PDF文件选择和内容提取

我们使用wxPython的文件对话框来选择PDF文件,并使用PyMuPDF库来打开和处理PDF文件。当用户选择PDF文件并点击提取按钮时,我们将提取指定页码的内容,并将其显示在内容文本框中。

import wx
import fitzclass MyFrame(wx.Frame):def __init__(self):super().__init__(None, title="提取PDF页面内容", size=(400, 300))panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)select_button = wx.Button(panel, label="选择PDF文件")select_button.Bind(wx.EVT_BUTTON, self.on_select_pdf)vbox.Add(select_button, proportion=0, flag=wx.ALIGN_CENTER | wx.ALL, border=10)page_label = wx.StaticText(panel, label="页码:")vbox.Add(page_label, proportion=0, flag=wx.LEFT, border=10)self.page_input = wx.TextCtrl(panel)vbox.Add(self.page_input, proportion=0, flag=wx.EXPAND | wx.ALL, border=10)extract_button = wx.Button(panel, label="提取内容")extract_button.Bind(wx.EVT_BUTTON, self.on_extract_content)vbox.Add(extract_button, proportion=0, flag=wx.ALIGN_CENTER | wx.ALL, border=10)content_label = wx.StaticText(panel, label="内容:")vbox.Add(content_label, proportion=0, flag=wx.LEFT, border=10)self.content_text = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_READONLY)vbox.Add(self.content_text, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)panel.SetSizer(vbox)def on_select_pdf(self, event):dialog = wx.FileDialog(self, message="选择PDF文件", wildcard="PDF files (*.pdf)|*.pdf", style=wx.FD_OPEN)if dialog.ShowModal() == wx.ID_OK:self.pdf_path = dialog.GetPath()dialog.Destroy()def on_extract_content(self, event):page_num = int(self.page_input.GetValue())self.extract_page_content(page_num)def extract_page_content(self, page_num):doc = fitz.open(self.pdf_path)if page_num < 1 or page_num > doc.page_count:wx.MessageBox("无效的页码!", "错误", wx.OK | wx.ICON_ERROR)returnpage = doc.load_page(page_num - 1)text = page.get_text()self.content_text.SetValue(text)doc.close()if __name__ == '__main__':app = wx.App()frame = MyFrame()frame.Show()app.MainLoop()# ...class PDFContentExtractor(wx.Frame):# ...def on_select_pdf(self):dialog = wx.FileDialog(self, message="选择PDF文件", wildcard="PDF files (*.pdf)|*.pdf", style=wx.FD_OPEN)if dialog.ShowModal() == wx.ID_OK:self.pdf_path = dialog.GetPath()dialog.Destroy()def on_extract_content(self):page_num = int(self.page_input.value)self.extract_page_content(page_num)def extract_page_content(self, page_num):doc = fitz.open(self.pdf_path)if page_num < 1 or page_num > doc.page_count:self.content_text.text = "无效的页码!"returnpage = doc.load_page(page_num - 1)text = page.get_text()self.content_text.text = textdoc.close()# ...

在上述代码中,我们使用wx.FileDialog对话框来选择PDF文件,并将选择的文件路径存储在self.pdf_path变量中。

on_extract_content方法中,我们获取输入框中的页码,并调用extract_page_content方法来提取指定页码的内容。

extract_page_content方法中,我们使用PyMuPDF打开并读取PDF文件。然后,我们通过doc.load_page方法加载指定页码的页面,并使用get_text方法获取该页的文本内容。最后,我们将提取的内容设置到文本框content_text中。

运行应用程序

if __name__ == '__main__':app = wx.App()frame = PDFContentExtractor()frame.Show()app.MainLoop()

在上述代码中,我们创建了一个wx.App实例,并实例化了PDFContentExtractor类。然后,我们显示应用程序窗口,并通过调用app.MainLoop()来启动应用程序的事件循环。

结论

通过本篇博客,我们学习了如何使用wxPython和PyMuPDF创建用于选择PDF文件并提取指定页面的内容。我们还了解了如何使用Bokeh来创建交互式应用程序界面,并通过事件处理方法来处理用户的选择和操作。

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

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

相关文章

大数据-玩转数据-Flink网页埋点PV统计

一、说明 衡量网站流量一个最简单的指标&#xff0c;就是网站的页面浏览量&#xff08;Page View&#xff0c;PV&#xff09;。用户每次打开一个页面便记录1次PV&#xff0c;多次打开同一页面则浏览量累计。 一般来说&#xff0c;PV与来访者的数量成正比&#xff0c;但是PV并不…

虹科干货 | 化身向量数据库的Redis Enterprise——快速、准确、高效的非结构化数据解决方案!

用户期望在他们遇到的每一个应用程序和网站都有搜索功能。然而&#xff0c;超过80%的商业数据是非结构化的&#xff0c;以文本、图像、音频、视频或其他格式存储。Redis Enterprise如何实现矢量相似性搜索呢&#xff1f;答案是&#xff0c;将AI驱动的搜索功能集成到Redis Enter…

STABLE DIFFUSION模型及插件的存放路径

记录下学习SD的一些心得&#xff0c;使用的是秋叶大佬的集成webui&#xff0c;下载了之后点击启动器即可开启&#xff0c;文件夹中的内容如下 主模型存放在models文件下的stable-diffusion文件夹内&#xff0c;一些扩展类的插件是存放在extensions文件夹下

【设计模式】责任链模式

顾名思义&#xff0c;责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;为请求创建了一个接收者对象的链。这种模式给予请求的类型&#xff0c;对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中&#xff0c;通常每个接收者…

移动端预览指定链接的pdf文件流

场景 直接展示外部系统返回的获取文件流时出现了跨域问题&#xff1a; 解决办法 1. 外部系统返回的请求头中调整&#xff08;但是其他系统不会给你改的&#xff09; 2. 我们系统后台获取文件流并转为新的文件流提供给前端 /** 获取传入url文件流 */ GetMapping("/get…

电脑打开对话框中没有桌面这个选项解决办法

问题描述&#xff1a; 左侧栏中的桌面图标不显示 解决方法&#xff1a; 左侧的空白处右键-显示所有的文件夹 这时所有的文件夹都显示了&#xff01;

从鲁大师十五年,寻找软件的生存法则

千禧之年&#xff0c;国内互联网用户数量首次突破1000万大关&#xff0c;互联网的腾飞正式拉开序幕。 从彼时算起&#xff0c;中国互联网发展也不过23年&#xff0c;而我们记忆中那个摇着蒲扇的老头&#xff0c;却占据了其中关键的十五年。 这十五年中有太多曾经为人熟知的软件…

CHATGPT源码简介与使用指南

CHATGPT源码的基本介绍 CHATGPT源码备受关注&#xff0c;它是一款基于人工智能的聊天机器人&#xff0c;旨在帮助开发者快速搭建自己的聊天机器人&#xff0c;无需编写代码。下面是对CHATGPT搭建源码的详细介绍。 CHATGPT源码的构建和功能 CHATGPT源码是基于Google的自然语言…

Linux——基础IO(1)

目录 0. 文件先前理解 1. C文件接口 1.1 写文件 1.2 读文件 1.3 输出信息到显示器 1.4 总结 and stdin & stdout & stderr 2. 系统调用文件I/O 2.1 系统接口使用示例 2.2 接口介绍 2.3 open函数返回值 3. 文件描述符fd及重定向 3.1 0 & 1 & 2 3.2…

【Spring Cloud Alibaba】RocketMQ的基础使用,如何发送消息和消费消息

在现代分布式架构的开发中&#xff0c;消息队列扮演着至关重要的角色&#xff0c;用于解耦系统组件、保障可靠性以及实现异步通信。RocketMQ作为一款开源的分布式消息中间件&#xff0c;凭借其高性能、高可用性和良好的扩展性&#xff0c;成为了众多企业在构建高可靠性、高吞吐…

stable diffusion 单张图片换头roop安装配置

1.首先安装秋叶大佬的webui 2.然后在拓展里面搜索roop,下载roop插件,然后重启webui 3.重启后,在文生图和图生图的界面,就可以看到roop的入口 4.这里面,需要提前安装Visual Studio. 勾选一些必要的选项,这里可以参照b站的视频 # 秋叶版本Stablediffusion的Roop插件的安装 …

使用 Python 在 NLP 中进行文本预处理

一、说明 自然语言处理 &#xff08;NLP&#xff09; 是人工智能 &#xff08;AI&#xff09; 和计算语言学的一个子领域&#xff0c;专注于使计算机能够理解、解释和生成人类语言。它涉及计算机和自然语言之间的交互&#xff0c;允许机器以对人类有意义和有用的方式处理、分析…

安卓中常见的字节码指令介绍

问题背景 安卓开发过程中&#xff0c;经常要通过看一些java代码对应的字节码&#xff0c;来了解java代码编译后的运行机制&#xff0c;本文将通过一个简单的demo介绍一些基本的字节码指令。 问题分析 比如以下代码&#xff1a; public class test {public static void main…

Java课题笔记~ JSP编程

4.1 JSP基本语法 JSP (全称Java Server Pages) 是由 Sun Microsystems 公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求&#xff0c;而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。 JSPHTMLJava JSP的本质是Servlet 访问JSP的时候&#x…

【设计模式】原型模式

原型模式&#xff08;Prototype Pattern&#xff09;是用于创建重复的对象&#xff0c;同时又能保证性能。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式之一。 这种模式是实现了一个原型接口&#xff0c;该接口用于创建当前对象的克隆。当直接…

基于微服务+Java+Spring Cloud +Vue+UniApp +MySql实现的智慧工地云平台源码

基于微服务JavaSpring Cloud VueUniApp MySql开发的智慧工地云平台源码 智慧工地概念&#xff1a; 智慧工地就是互联网建筑工地&#xff0c;是将互联网的理念和技术引入建筑工地&#xff0c;然后以物联网、移动互联网技术为基础&#xff0c;充分应用BIM、大数据、人工智能、移…

Android布局【RelativeLayout】

文章目录 介绍常见属性根据父容器定位根据兄弟组件定位 通用属性margin 设置组件与父容器的边距padding 设置组件内部元素的边距 项目结构主要代码 介绍 RelativeLayout是一个相对布局&#xff0c;如果不指定对齐位置&#xff0c;都是默认相对于父容器的左上角的开始布局 常见…

MQTT宝典

文章目录 1.介绍2.发布和订阅3.MQTT 数据包结构4.Demo5.EMQX 1.介绍 什么是MQTT协议 MQTT&#xff08;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的“轻量级”通讯协议&#xff0c;该协议构建于TCP/IP协…

安卓快速开发

1.环境搭建 Android Studio下载网页&#xff1a;https://developer.android.google.cn/studio/index.html 第一次新建工程需要等待很长时间&#xff0c;新建一个Empty Views Activity 项目&#xff0c;右上角选择要运行的机器&#xff0c;运行就安装上去了(打开USB调试)。 2…

【Linux】UDP协议——传输层

目录 传输层 再谈端口号 端口号范围划分 认识知名端口号 两个问题 netstat与iostat pidof UDP协议 UDP协议格式 UDP协议的特点 面向数据报 UDP的缓冲区 UDP使用注意事项 基于UDP的应用层协议 传输层 在学习HTTP等应用层协议时&#xff0c;为了便于理解&#xff…