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

news2024/11/23 0:06:35

在本篇博客中,我们将探讨如何使用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 fitz

class 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)
            return

        page = 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 = "无效的页码!"
            return

        page = doc.load_page(page_num - 1)
        text = page.get_text()
        self.content_text.text = text

        doc.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.coloradmin.cn/o/880802.html

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

相关文章

高忆管理:什么是一码通?有什么好处?

在经过券商开户后&#xff0c;除了其间的财物账户、沪深股账户外&#xff0c;还有一个一码通账户&#xff0c;什么是一码通&#xff1f;它有什么好处&#xff1f;关于这些&#xff0c;高忆管理为大家预备了以下参阅内容。 什么是一码通&#xff1f; 一码通账户&#xff0c;一般…

公司电脑三维图纸加密、机械图挡加密软件

机械图纸加密软件的问世&#xff0c;让很多的网络公司都大受其带来的工作中的便利。在安装了机械图纸加密软件后&#xff0c;不仅可以很好的管理员工在工作时的上网娱乐&#xff0c;在对整个公司员工的工作效率上也有着明显的提高&#xff0c;那么对于机械图纸加密软件的具体特…

【数据结构】堆的实现,堆排序以及TOP-K问题

目录 1.堆的概念及结构 2.堆的实现 2.1初始化堆 2.2销毁堆 2.3取堆顶元素 2.4返回堆的大小 2.5判断是否为空 2.6打印堆 2.7插入元素 2.8堆的向上调整 2.9弹出元素 2.10堆的向下调整 3. 建堆时间复杂度 4. 堆的应用 4.1 堆排序 4.2 TOP-K问题 1.堆的概念及结构 …

springboot多模块打包方式

明确子父模块结构 父目录是带modules 大致结构如下&#xff1a; <modules><module>ruoyi-admin</module><module>ruoyi-framework</module><module>ruoyi-system</module><module>ruoyi-quartz</module><module>…

线程记录(2)

1.线程状态 NEW : 分配内存地址&#xff0c;创建线程 RUNNABLE&#xff1a;&#xff08;就绪/运行&#xff09;调用start()之后&#xff08;/没有调度CPU调度&#xff09; BLOCKED&#xff1a;还未拿到锁&#xff0c;等待、被阻塞&#xff08;拿到synchronized失败状态&…

erp系统是什么,erp系统有哪些品牌

阅读本文&#xff0c;您可以了解&#xff1a;1、erp系统是什么&#xff1b;2、如何选择erp系统&#xff1b;3、erp系统有哪些品牌 一、erp系统是什么 ERP系统是企业资源规划&#xff08;Enterprise Resource Planning&#xff09;系统的缩写。它是一种集成的、全面的企业管理…

【笔试题心得】关于正则的一些整理

本文部分内容摘抄整理自 正则表达式 – 教程 | 菜鸟教程 在笔试的过程中&#xff0c;也常常会对正则表达式进行考察&#xff0c;这里对正则表达式的常见用法&#xff0c;做一个学习和总结。 正则表达式的模式可以包括以下内容&#xff1a; 字面值字符&#xff1a;例如字母、数…

Django学习笔记(2)

创建app 属于自动执行了python manage.py 直接在里面运行startapp app01就可以创建app01的项目了 之后在setting.py中注册app01 INSTALLED_APPS ["django.contrib.admin","django.contrib.auth","django.contrib.contenttypes","django.c…

源代码加密 | 代码防泄密软件

其实要从技术上做好企业源代码的防泄露就要做好以下两点&#xff1a; 员工电脑本地源码防泄密 对员工本地源码文件采用透明加密方式进行防泄密处理&#xff0c;做到外发打不开。 GIT/SVN服务器防泄密 对版本管理服务器源代码加密进行有效防泄露处理&#xff0c;让员工从服务器…

语雀真的那么好用吗?那是你还没试试Baklib在线知识库/帮助中心

其实他们都是非常好用的在线知识库和协作工具。它提供了丰富的功能和友好的用户界面&#xff0c;让用户可以方便地管理和共享知识。 语雀的使用感受&#xff1a; 首先&#xff0c;语雀具有简洁、直观的界面设计&#xff0c;使得用户能够快速上手。它采用了扁平化的设计风格&a…

/proc/net/dev 最后一行读2次

网络2倍字节量和网速&#xff0c;百思不得其解。 void netdev(SamplePlugin *sample) {FILE *fp;char s[150], itf[10];long long r1, r2, r3, r4, r5, r6, r7, r8, t1, t2, t3, t4, t5, t6, t7, t8;int i0;sample->rb 0;sample->tb 0;fp fopen("/proc/net/dev&…

海国图志#1:这一周难忘瞬间,吐血整理,不得不看

这里记录每周值得分享的新闻大图&#xff0c;周日发布。 文章以高清大图呈现&#xff0c;解说以汉语为主&#xff0c;英语为辅&#xff0c;英语句子均来自NYTimes、WSJ、The Guardian等权威媒体原刊。 存档时段&#xff1a;20230731-20230806 乌克兰&#xff0c;波罗当卡 一名妇…

Swift 5.9 Macros 有哪些新更新

文章目录 前言Macros&#xff08;宏&#xff09;需要了解的关键信息环境准备创建一个宏定义宏实际使用宏 总结 前言 虽然 Swift 6 已经在地平线上浮现&#xff0c;但 5.x 版本仍然有很多新功能-更简单的 if 和 switch 用法、宏、非可复制类型、自定义 actor 执行器等等都将在 …

echarts多条折线图

代码 <template><div><!-- 折线图 --><div id"average-score1" class"risk-percent" /></div> </template><script> import * as echarts from "echarts";export default {name: "StrategicRis…

深入了解Bear Necessities Hackathon黑客松的优胜者们

生态系统中的资深建设者皆知道Moonbeam是大型黑客松狂热爱好者&#xff0c;不论是线上虚拟的还是现场的。然而&#xff0c;很少有黑客松能达到Moonbeam和AWS举办的Bear Necessities黑客松这样的规模和吸引力。本次黑客松共有755人参与&#xff0c;共提交了62份参赛作品。其中22…

普通上班族学Python有用吗?

普通上班族学Python有用吗&#xff1f;对于广大上班族而言&#xff0c;时间和精力主要问题&#xff0c;学习Python编程语言为了能提高工作效率。学Python不是单纯的为了增加知识储备&#xff0c;Python本质上是一个工具和手段&#xff0c;最终目的是要通过它来帮我们解决实际工…

高并发数据抓取实战:使用HTTP爬虫ip提升抓取速度

又到每天一期学习爬虫的时间了&#xff0c;作为一名专业的爬虫程序员&#xff0c;今天要跟你们分享一个超实用的技巧&#xff0c;就是利用HTTP爬虫ip来提升高并发数据抓取的速度。听起来有点高大上&#xff1f;别担心&#xff0c;我会用通俗易懂的话来和你们说&#xff0c;让你…

【奥义】如何用ChatGPT写论文搞模型

目录 你是否曾经在复现科研论文的结果时感到困难重重&#xff1f; 引言 1 打开需要复现的目标文献 2 提取公式定义的语句 3 文章公式、图实现 &#xff08;1&#xff09;用python复现目标文献中的公式 &#xff08;2&#xff09;用python复现目标文献中的图 4 Copy代码…

数据结构——配对堆

引入 配对堆是一个支持插入&#xff0c;查询/删除最小值&#xff0c;合并&#xff0c;修改元素等操作的数据结构&#xff0c;是一种可并堆。有速度快和结构简单的优势&#xff0c;但由于其为基于势能分析的均摊复杂度&#xff0c;无法可持久化。 定义 配对堆是一棵满足堆性质…

ntfy Delphi 相关消息接口文档

关联文档&#xff1a; ntfy 实现消息订阅和通知&#xff08;无需注册、无需服务器&#xff0c;太好了&#xff09;_海纳老吴的博客-CSDN博客群晖 nas 自建 ntfy 通知服务&#xff08;梦寐以求&#xff09;_海纳老吴的博客-CSDN博客 目录 一、消息实体对象接口 1. 消息发布方…