Python中的PDF文本提取:使用fitz和wxPython库(带进度条)

news2024/11/14 13:57:16

引言:

处理大量PDF文档的文本提取任务可能是一项繁琐的工作。本文将介绍一个使用Python编写的工具,可通过简单的操作一键提取大量PDF文档中的文本内容,极大地提高工作效率。

import wx
import pathlib
import fitz

class PDFExtractor(wx.Frame):
    def __init__(self, parent, title):
        super(PDFExtractor, self).__init__(parent, title=title, size=(400, 200))
        
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)
        
        self.file_picker = wx.FilePickerCtrl(panel, style=wx.FLP_DEFAULT_STYLE | wx.FLP_USE_TEXTCTRL)
        self.save_picker = wx.DirPickerCtrl(panel, style=wx.DIRP_DEFAULT_STYLE | wx.DIRP_USE_TEXTCTRL)
        self.extract_button = wx.Button(panel, label="提取")
        
        self.extract_button.Bind(wx.EVT_BUTTON, self.on_extract)
        
        vbox.Add(wx.StaticText(panel, label="选择PDF文件:"), 0, wx.ALL | wx.EXPAND, 5)
        vbox.Add(self.file_picker, 0, wx.ALL | wx.EXPAND, 5)
        vbox.Add(wx.StaticText(panel, label="选择输出路径:"), 0, wx.ALL | wx.EXPAND, 5)
        vbox.Add(self.save_picker, 0, wx.ALL | wx.EXPAND, 5)
        vbox.Add(self.extract_button, 0, wx.ALL | wx.CENTER, 5)
        
        panel.SetSizer(vbox)
        
    def on_extract(self, event):
        pdf_path = self.file_picker.GetPath()
        save_path = self.save_picker.GetPath()
        
        if pdf_path and save_path:
            progress_dialog = wx.ProgressDialog("提取进度", "正在提取...", maximum=100, parent=self)
            
            try:
                with fitz.open(pdf_path) as doc:
                    total_pages = len(doc)
                    progress = 0
                    
                    for index, page in enumerate(doc):
                        text = page.get_text()
                        output_file = pathlib.Path(save_path) / f"page_{index + 1}.txt"
                        output_file.write_text(text, encoding="utf-8")
                        
                        progress = int((index + 1) / total_pages * 100)
                        progress_dialog.Update(progress, f"正在提取第 {index + 1} 页 / 共 {total_pages} 页")
                        
                    progress_dialog.Update(100, "提取完成!")
                    wx.MessageBox("提取完成!", "成功", wx.OK | wx.ICON_INFORMATION)
            except Exception as e:
                wx.MessageBox(str(e), "错误", wx.OK | wx.ICON_ERROR)
            finally:
                progress_dialog.Destroy()
        else:
            wx.MessageBox("请选择PDF文件和输出路径!", "错误", wx.OK | wx.ICON_ERROR)

def main():
    app = wx.App()
    frame = PDFExtractor(None, "PDF提取器")
    frame.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()

在这个示例中,我们创建了一个wx.ProgressDialog对象,用于显示提取进度。在提取每一页的文本时,我们使用enumerate函数获取当前页的索引,并根据总页数计算提取进度的百分比。然后,我们使用progress_dialog.Update方法更新进度条的进度和显示的文本。

请注意,由于提取过程可能需要一些时间,所以我们使用进度条对话框来显示进度并阻止用户的交互。在提取完成后,进度条对话框会自动关闭。

其中:

1)文档选择: 

      self.file_picker = wx.FilePickerCtrl(panel, style=wx.FLP_DEFAULT_STYLE | wx.FLP_USE_TEXTCTRL)

2、文件夹选择:     

   self.save_picker = wx.DirPickerCtrl(panel, style=wx.DIRP_DEFAULT_STYLE | wx.DIRP_USE_TEXTCTRL)

3、进度显示:

progress = int((index + 1) / total_pages * 100)
                        progress_dialog.Update(progress, f"正在提取第 {index + 1} 页 / 共 {total_pages} 页")
                        
                    progress_dialog.Update(100, "提取完成!")

4、最重要的:获得pdf中的文本:

with fitz.open(pdf_path) as doc:
     total_pages = len(doc)
     progress = 0
                    
     for index, page in enumerate(doc):
         text = page.get_text()
         output_file = pathlib.Path(save_path) / f"page_{index + 1}.txt"
         output_file.write_text(text, encoding="utf-8")

结果如下:

  

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

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

相关文章

谷歌、Edge等浏览器截图长图的方法

目录 序 谷歌浏览器 步骤1:打开开发者工具(右上角->更多开发工具->开发工具)也可以直接按F12 步骤2:按组合键CtrlShiftP,打开浏览器的console功能菜单的指令搜索栏 步骤3:搜索框输入full,找到Cap…

LeetCode--HOT100题(19)

目录 题目描述:54. 螺旋矩阵(中等)题目接口解题思路代码 PS: 题目描述:54. 螺旋矩阵(中等) 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 Le…

socker套接字

1.打印错误信息 2.socketaddr_in结构体 结构体: (部分库代码) (宏中的##) 3.manual TCP: SOCK_STREAM : 提供有序地,可靠的,全双工的,基于连接的流式服务 UDP: 面向数据报

C语言单链表OJ题(较易)

一、移除链表元素 leetcode链接 题目描述: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 思路: 正常遍历,找到value的值与题目中相同的结点去fr…

Statefulset 实战 3

上一部分我们说到如何使用 Statefulset 部署有状态的应用,Statefulset 可以做到部署的 每一个 pod 能够独立的拥有一个持久卷声明和持久卷 之前我们 用 Statefulset 和 ReplicaSet 对比,自然他们是有相似之处和不同之处,不同之处前面的文章已…

【云原生】K8S二进制搭建三:高可用配置

目录 一、部署CoreDNS二、配置高可用三、配置负载均衡四、部署 Dashboard 一、部署CoreDNS 在所有 node 节点上操作 #上传 coredns.tar 到 /opt 目录中 cd /opt docker load -i coredns.tar在 master01 节点上操作 #上传 coredns.yaml 文件到 /opt/k8s 目录中,部…

vue2-vue实例挂载的过程

1、思考 new Vue()这个过程中究竟做了什么?过程中是如何完成数据的绑定,又是如何将数据渲染到视图的等等。 2、分析 首先找到vue的构造函数。 源码位置:/src/core/instance/index.js options是用户传递过来的配置项,如data、meth…

通讯协议032——全网独有的OPC HDA知识一之聚合(一)

本文简单介绍OPC HDA规范的基本概念,更多通信资源请登录网信智汇(wangxinzhihui)。 本节旨在详细说明HDA聚合的要求和性能。其目的是使HDA聚合标准化,以便HDA客户端能够可靠地预测聚合计算的结果并理解其含义。如果用户需要聚合中的自定义功能&#xff…

Maven出现报错 ; Unable to import maven project: See logs for details错误的多种解决方法

问题现象; IDEA版本&#xff1a; Maven 版本 &#xff1a; 3.3.9 0.检查 maven 的设置 &#xff1a;F:\softeware\maven\apache-maven-3.9.3\conf 检查setting.xml 配置 本地仓库<localRepository>F:\softeware\maven\local\repository</localRepository>镜像…

观察者模式(C++)

定义 定义对象间的一种一对多(变化)的依赖关系&#xff0c;以便当一个对象(Subject)的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并自动更新。 ——《设计模式》GoF 使用场景 一个对象&#xff08;目标对象&#xff09;的状态发生改变&#xff0c;所有的依赖对…

信息论之从熵、惊奇到交叉熵、KL散度和互信息

一、熵&#xff08;PRML&#xff09; 考虑将A地观测的一个随机变量x&#xff0c;编码后传输到B地。 这个随机变量有8种可能的状态&#xff0c;每个状态都是等可能的。为了把x的值传给接收者&#xff0c;需要传输⼀个3⽐特的消息。注意&#xff0c;这个变量的熵由下式给出: ⾮…

掌握主动权:职场中如何主动寻找并拓宽工作领域

引言 在现代职场的竞争环境中&#xff0c;主动性是一种重要的优势。对于企业而言&#xff0c;员工的主动性是其成功的关键因素之一。而对于个人职业发展来说&#xff0c;主动性能帮助我们把握更多的机会&#xff0c;提升我们的职业能力。因此&#xff0c;学会在职场中主动寻找…

glut太阳系源码修改和对cpu占用观察

#include <GL/glut.h> static int day 100; // day 的变化&#xff1a;从 0 到 359 void myDisplay(void) {//glEnable(GL_DEPTH_TEST);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(75, 1, 1, 40…

车载软件架构 —— 车载软件安全启动关键技术解读

车载软件架构 —— 车载软件安全启动关键技术解读 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生…

Android学习之路(1) App工程的项目结构

一、App工程的项目结构 1.项目下面有两个分类 一个是app(代表app模块)&#xff0c;另一个是Gradle Scripts。其中app下面又有3个子目录&#xff0c;其功能说明如下&#xff1a; manifests 子目录下面只有一个XML文件&#xff0c;即AndroidManifest.xmljava子目录&#xff0c;…

LeetCode-Java(04)

15. 三数之和 固定第一个数&#xff0c;从后面找第二个和的三个数的和等于第一个数&#xff0c;转化为两数之和问题。比target大&#xff0c;则l--&#xff0c;否则r,直到找到三个数 class Solution {public List<List<Integer>> threeSum(int[] nums) {List<L…

笔记本更换固态硬盘和清灰更换硅脂经历分享

本文仅供参考。 目录 购买 固态硬盘和固态硬盘盒 拆机工具 系统迁移 拆机 螺丝花了不要急 换硬盘 清灰 换导热硅脂 处理分区 购买 固态硬盘和固态硬盘盒 自己选购硬盘的时候一定要和自己电脑硬盘型号匹配。至于如何查看自己电脑硬盘型号&#xff0c;这个可以去自己…

web基础与tomcat环境部署

一. 简述静态网页和动态网页的区别。 请求响应信息&#xff0c;发给客户端进行处理&#xff0c;由浏览器进行解析&#xff0c;显示的页面称为静态页面。处理文件类型如.html、jpg、.gif、.mp4、.swf、.avi、.wmv、.flv等 请求响应信息&#xff0c;发给事务端进行处理&#xff0…

Whole Tomato Visual Assist X Crack

Whole Tomato Visual Assist X Crack Visual Assist X通过Visual Studio中的关键新功能和对现有功能的改进&#xff0c;大大缩短了应用程序开发时间&#xff0c;使您能够&#xff1a;Visual Assist提高了自动化程度&#xff0c;简化了导航&#xff0c;并在开发过程中显示重要信…

安卓4G核心板开发板_MTK6785/MT6785(Helio G95)安卓手机主板方案

联发科MTK6785&#xff08;Helio G95&#xff09;安卓核心板采用八核 CPU 具有两个强大的 Arm Cortex-A76 处理器内核&#xff0c;主频高达 2.05GHz&#xff0c;外加六个 Cortex-A55 高效处理器。其强大的图形性能由 Arm Mali-G76 MC4 提供&#xff0c;速度可提升至 900MHz 。 …