当前位置: 首页 > news >正文

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

引言:

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

import wx
import pathlib
import fitzclass 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 = 0for 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 = 0for 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")

结果如下:

  

相关文章:

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

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

mysql 将字段值+1或自增

一、解决方式: SET var 1; UPDATE jes_menu_info SET MENU_SORT (var : var 1) WHERE ss_idACC; 二、解读用户变量,在客户端链接到数据库实例整个过程中用户变量都是有效的。 MySQL中用户变量不用事前申明,在用的时候直接用“变量名”使…...

组合总和——力扣39

文章目录 题目描述回溯 题目描述 回溯 class Solution { public:vector<vector<int>> res;vector<int> seq; void dfs(vector<int>& nums, int pos, int target){if(target0){res.emplace_back(seq);return;}if(posnums.size()){return;}//直接跳过…...

PostgreSQL Patroni_exporter 监控 patroni高可用工具

Patroni是Cybertec公司基于python语言开发的&#xff0c;可用于使用流复制来创建&#xff0c;管理&#xff0c;维护和监视高可用性PostgreSQL集群设置的工具。 目前&#xff0c;PatroniEtcd 是最为推荐的PostgreSQL数据库高可用方案之一。 PostgreSQL有postgres_exporter监控采…...

C语言多级指针

#include "stdio.h" #include <stdlib.h>int main() {int a 10;//*p int a int *pint* p &a;int** q &p;//int** q int *(*q) int *(q) a//int**q int*(*q) int*(&a) int*&a aint*** k &q;//分析&#xff1a;首先k是个变量&…...

IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介

系列文章目录 IDEA上面书写wordcount的Scala文件具体操作 IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍 目录 系列文章目录 前言 一 准备工作 1.1 安装Maven 1.1.1 Maven安装配置步骤 1.1.2 解压相关的软件包 1.1.3 Maven 配置环境变量 1.1.4 配…...

ArraySetter

简介​ 用来展示属性类型为数组的 setter 展示​ 配置示例​ "setter": {"componentName": "ArraySetter","props": {"itemSetter": {"componentName": "ObjectSetter","props": {"c…...

Python如何解决Amazon亚马逊“图文验证码”识别(6)

前言 本文是该专栏的第55篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏前面,笔者有详细介绍多种登录验证码识别方法,感兴趣的同学可往前翻阅。而本文,笔者将单独详细介绍亚马逊Amazon的图文识别验证码的解决方法。 如上图所示,访问或请求频次达到一定程度之…...

plsql连接oracle出现TTC错误

这个错误莫名其妙&#xff0c;搜不到直接关联的解决方案。用了下面解决乱码的方式倒是解决了。 ORA-03137: TTC protocol internal error : [%s] [%s] [%s] [%s] [%s] [%s] [%s] [%s] 按照如下链接解决&#xff1a; PL/SQL Developer中文乱码解决方案_Bug君坤坤的博客-CSDN博…...

4-golang爬虫下载的代码

golang爬虫下载的代码&#xff1a; 下载程序的借鉴内容&#xff1a; 这个是关于gbk&#xff0c;utf8等相互转换的包 github.com/axgle/mahonia" 一、标准下载代码 package downloaderimport ("log""net/http""io""github.com/axgle/…...

Eureka增加账号密码认证登录

一、业务背景 注册中心Eureka在微服务开发中经常使用到&#xff0c;用来管理发布的微服务&#xff0c;供前端或者外部调用。但是如果放到生产环境&#xff0c;我们直接通过URL访问的话&#xff0c;这显然是不安全的。 所以需要给注册中心加上登录认证。 通过账号和密码认证进行…...

Practice5|58. 最后一个单词的长度、66. 加一

58. 最后一个单词的长度 1.题目&#xff1a; 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1&#xff1a; 输入&#xff1a…...

Practice4|14. 最长公共前缀、2. 两数相加

14. 最长公共前缀 1.题目&#xff1a; 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xf…...

第28天-Kubernetes架构,集群部署,Ingress,项目部署,Dashboard

1.K8S集群部署 1.1.k8s快速入门 1.1.1.简介 Kubernetes简称k8s&#xff0c;是用于自动部署&#xff0c;扩展和管理容器化应用程序的开源系统。 中文官网&#xff1a;https://kubernetes.io/zh/中文社区&#xff1a;https://www.kubernetes.org.cn/官方文档&#xff1a;https…...

剑指OfferII-58.左旋转字符串

剑指OfferII-58.左旋转字符串 目录 剑指OfferII-58.左旋转字符串题目描述解法一&#xff1a;字符数组解法二&#xff1a;原地反转 题目描述 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。 请定义一个函数实现字符串左旋转操作的功能。 比如&#xff0c…...

C语言每日一题:14《数据结构》复制带随机指针的链表

题目一&#xff1a; 题目链接&#xff1a; 思路一&#xff1a; 找相对位置暴力求解的方法&#xff1a; 1.复制一个新的链表出来遍历老的节点给新的节点赋值&#xff0c;random这个时候不去值。 2.两个链表同时遍历&#xff0c;遍历老链表的时候去寻找相对位置&#xff0c;在遍…...

MySql008——检索数据:过滤数据(WHERE子句的使用)

前提&#xff1a;使用《MySql006——检索数据&#xff1a;基础select语句》中创建的products表 一、实际需求 数据库表一般包含大量的数据&#xff0c;但是很少需要检索表中所有行。通常只会根据特定条件提取表数据的子集。只检索所需数据需要指定搜索条件&#xff08;search …...

vue2-v-show和v-if有什么区别,使用场景分别是什么?

1、v-show和v-if的共同点 在vue中&#xff0c;v-if和v-show的作用效果是相同的&#xff08;不含v-else&#xff09;&#xff0c;都能控制元素在页面是否显示&#xff0c;在用法上也相同。 当表达式为true的时候&#xff0c;都会占据页面的位置 当表达式为false的时候&#xff…...

常用的排序算法简介:冒泡、选择、插入、归并、快速

常用的排序算法包括冒泡排序、选择排序、插入排序、归并排序和快速排序。以下是它们的简单介绍&#xff1a; 1. 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a; 冒泡排序是一种经典的基于交换的排序算法。它重复地比较相邻的元素&#xff0c;如果顺序错误&#…...

Golang之路---04 项目管理——编码规范

本文根据个人编码习惯以及网络上的一些文章&#xff0c;整理了一些大家能用上的编码规范&#xff0c;可能是一些主流方案&#xff0c;但不代表官方。 1. 文件命名 由于 Windows平台文件名不区分大小写&#xff0c;所以文件名应一律使用小写 不同单词之间用下划线分词&#xf…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...