使用Python开发PDF文本提取工具

embedded/2025/2/28 3:48:13/

在日常工作中,我们经常需要从PDF文档中提取文本内容。虽然市面上有不少相关工具,但它们要么功能过于复杂,要么使用不够方便。本文将介绍如何使用Python开发一个简单实用的PDF文本提取工具,该工具具有图形界面,操作简单直观。
C:\pythoncode\new\GetTxtFromPdfFromX2Y.py

全部代码

python">import wx
import PyPDF2
import osclass PDFConverterFrame(wx.Frame):def __init__(self):super().__init__(parent=None, title='PDF to TXT Converter', size=(500, 300))self.pdf_path = ''self.initUI()def initUI(self):panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)# 文件选择按钮file_btn = wx.Button(panel, label='选择PDF文件')file_btn.Bind(wx.EVT_BUTTON, self.onChooseFile)vbox.Add(file_btn, 0, wx.ALL | wx.CENTER, 5)# 显示所选文件路径self.path_text = wx.TextCtrl(panel, style=wx.TE_READONLY)vbox.Add(self.path_text, 0, wx.ALL | wx.EXPAND, 5)# 页面范围输入hbox1 = wx.BoxSizer(wx.HORIZONTAL)start_label = wx.StaticText(panel, label='开始页码:')self.start_page = wx.SpinCtrl(panel, value='1', min=1)end_label = wx.StaticText(panel, label='结束页码:')self.end_page = wx.SpinCtrl(panel, value='1', min=1)hbox1.Add(start_label, 0, wx.ALL | wx.CENTER, 5)hbox1.Add(self.start_page, 0, wx.ALL, 5)hbox1.Add(end_label, 0, wx.ALL | wx.CENTER, 5)hbox1.Add(self.end_page, 0, wx.ALL, 5)vbox.Add(hbox1, 0, wx.ALL | wx.CENTER, 5)# 生成按钮generate_btn = wx.Button(panel, label='生成TXT')generate_btn.Bind(wx.EVT_BUTTON, self.onGenerate)vbox.Add(generate_btn, 0, wx.ALL | wx.CENTER, 5)# 状态显示self.status_text = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_READONLY)vbox.Add(self.status_text, 1, wx.ALL | wx.EXPAND, 5)panel.SetSizer(vbox)self.Centre()def onChooseFile(self, event):with wx.FileDialog(self, "选择PDF文件", wildcard="PDF files (*.pdf)|*.pdf",style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:if fileDialog.ShowModal() == wx.ID_CANCEL:returnself.pdf_path = fileDialog.GetPath()self.path_text.SetValue(self.pdf_path)# 更新最大页码try:with open(self.pdf_path, 'rb') as file:pdf = PyPDF2.PdfReader(file)max_pages = len(pdf.pages)self.start_page.SetMax(max_pages)self.end_page.SetMax(max_pages)self.end_page.SetValue(max_pages)self.status_text.SetValue(f"PDF文件共 {max_pages} 页")except Exception as e:self.status_text.SetValue(f"读取PDF文件失败: {str(e)}")def onGenerate(self, event):if not self.pdf_path:wx.MessageBox('请先选择PDF文件', '提示', wx.OK | wx.ICON_INFORMATION)returnstart = self.start_page.GetValue()end = self.end_page.GetValue()if start > end:wx.MessageBox('开始页码不能大于结束页码', '错误', wx.OK | wx.ICON_ERROR)returntry:# 生成输出文件名output_path = os.path.splitext(self.pdf_path)[0] + '_output.txt'with open(self.pdf_path, 'rb') as file:pdf = PyPDF2.PdfReader(file)with open(output_path, 'w', encoding='utf-8') as output:for page_num in range(start - 1, end):text = pdf.pages[page_num].extract_text()output.write(f'=== 第 {page_num + 1} 页 ===\n')output.write(text)output.write('\n\n')self.status_text.SetValue(f"转换完成!\n输出文件保存在: {output_path}")except Exception as e:self.status_text.SetValue(f"转换失败: {str(e)}")wx.MessageBox(f'转换失败: {str(e)}', '错误', wx.OK | wx.ICON_ERROR)if __name__ == '__main__':app = wx.App()frame = PDFConverterFrame()frame.Show()app.MainLoop()

功能需求分析

在开发之前,我们先明确工具的核心功能需求:

  1. 提供图形界面,方便用户操作
  2. 支持选择PDF文件
  3. 可以指定提取的页面范围
  4. 将提取的文本保存为TXT文件
  5. 显示操作状态和结果

技术选型

基于上述需求,我们选择以下技术栈:

  • Python: 作为主要开发语言
  • wxPython: 用于开发图形界面
  • PyPDF2: 用于处理PDF文件

wxPython是一个功能强大的GUI工具包,它能够创建原生风格的界面,性能好,使用简单。PyPDF2则是一个广受欢迎的PDF处理库,支持读取文本、提取页面等操作。

环境准备

在开始开发之前,需要先安装必要的库:

pip install wxPython PyPDF2

详细设计和实现

1. 界面设计

我们的界面采用垂直布局,从上到下依次包含:

  • 文件选择按钮
  • 文件路径显示区域
  • 页码范围输入区域(开始页码和结束页码
  • 生成按钮
  • 状态显示区域

2. 核心代码实现

让我们一步步实现这个工具:

2.1 创建主窗口类
python">class PDFConverterFrame(wx.Frame):def __init__(self):super().__init__(parent=None, title='PDF to TXT Converter', size=(500, 300))self.pdf_path = ''self.initUI()

这是我们的主窗口类,继承自wx.Frame。在构造函数中,我们设置了窗口标题和大小,并初始化了UI。

2.2 界面初始化
python">def initUI(self):panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)# 文件选择按钮file_btn = wx.Button(panel, label='选择PDF文件')file_btn.Bind(wx.EVT_BUTTON, self.onChooseFile)vbox.Add(file_btn, 0, wx.ALL | wx.CENTER, 5)# 显示所选文件路径self.path_text = wx.TextCtrl(panel, style=wx.TE_READONLY)vbox.Add(self.path_text, 0, wx.ALL | wx.EXPAND, 5)

在初始化界面时,我们使用wx.BoxSizer来管理布局,这样可以确保界面元素排列整齐,并且能够适应窗口大小的变化。

2.3 文件选择功能
python">def onChooseFile(self, event):with wx.FileDialog(self, "选择PDF文件", wildcard="PDF files (*.pdf)|*.pdf",style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:if fileDialog.ShowModal() == wx.ID_CANCEL:returnself.pdf_path = fileDialog.GetPath()self.path_text.SetValue(self.pdf_path)

文件选择对话框使用wx.FileDialog实现,我们设置了文件过滤器,只显示PDF文件。当用户选择文件后,会更新显示路径,并自动获取PDF的页数信息。

2.4 转换功能实现
python">def onGenerate(self, event):if not self.pdf_path:wx.MessageBox('请先选择PDF文件', '提示', wx.OK | wx.ICON_INFORMATION)returnstart = self.start_page.GetValue()end = self.end_page.GetValue()try:output_path = os.path.splitext(self.pdf_path)[0] + '_output.txt'with open(self.pdf_path, 'rb') as file:pdf = PyPDF2.PdfReader(file)with open(output_path, 'w', encoding='utf-8') as output:for page_num in range(start - 1, end):text = pdf.pages[page_num].extract_text()output.write(f'=== 第 {page_num + 1} 页 ===\n')output.write(text)output.write('\n\n')

转换功能的核心是使用PyPDF2读取PDF内容,然后将文本写入新的TXT文件。我们在每页内容前添加了页码标记,方便阅读。

异常处理

为了提高程序的健壮性,我们添加了完善的异常处理:

  1. 文件选择验证
  2. 页码范围验证
  3. 文件读写异常处理
  4. PDF解析异常处理
python">try:# 转换操作...
except Exception as e:self.status_text.SetValue(f"转换失败: {str(e)}")wx.MessageBox(f'转换失败: {str(e)}', '错误', wx.OK | wx.ICON_ERROR)

运行效果

程序运行后会显示一个简洁的窗口,用户可以:

  1. 点击"选择PDF文件"按钮选择需要处理的PDF文件
  2. 输入需要提取的页面范围
  3. 点击"生成TXT"按钮开始转换
  4. 在状态区域查看转换结果

生成的TXT文件会自动保存在原PDF文件所在的目录下,文件名为原PDF文件名加上"_output.txt"后缀。

优化建议

  1. 添加进度条显示转换进度
  2. 支持批量处理多个PDF文件
  3. 添加文本编码选项
  4. 支持更多输出格式(如Word、HTML等)
  5. 添加文本提取方式的选项(按段落、按行等)

运行结果

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/embedded/167709.html

相关文章

危化品经营单位安全管理人员的职责及注意事项

危化品经营单位安全管理人员肩负着保障经营活动安全的重要责任,以下是其主要职责及注意事项: 职责 1. 安全制度建设与执行:负责组织制定本单位安全生产规章制度、操作规程和生产安全事故应急救援预案,确保这些制度符合国家相关法…

针对视频内容进行检测开源项目

以下是10个可以实现视频是否涉及擦边或黄色内容检测的免费开源GitHub项目推荐: 1. **OpenNSFW2** OpenNSFW2 是一个用于检测图片和视频是否包含成人内容的开源库。它基于深度学习模型,能够实时分析视频帧并给出概率值,判断内容是否涉及…

【Http和Https区别】

概念: 一、Http协议 HTTP(超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议,主要用于Web浏览器和服务器之间的通信。http也是客户端和服务器之间请求与响应的标准协议,客户端通常…

多通道数据采集和信号生成的模块化仪器如何重构飞机电子可靠性测试体系?

飞机的核心电子系统包括发电与配电系统,飞机内部所有设备和系统之间的内部数据通信系统,以及用于外部通信的射频设备。其他所有航空电子元件都依赖这些关键总线进行电力传输或数据通信。在本文中,我们将了解模块化仪器(无论是PCIe…

【AIDevops】Deepseek驱动无界面自动化运维与分布式脚本系统,初探运维革命之路

声明:笔者当前文章内容仍在构想阶段,仅部分实现 目录 引言 第一部分:基于DeepSeek大模型的单机GPT实现 1. DeepSeek大模型简介 2. 功能概述 3. 项目优势,实现技术栈及实现功能 4. 示例展示 5.腾讯云AI代码助手助力 第二部…

深入理解 JSP 与 Servlet:原理、交互及实战应用

一、引言 在 Java Web 开发领域,JSP(JavaServer Pages)和 Servlet 是两个至关重要的技术,它们共同构成了动态网页开发的基础。Servlet 作为服务器端的 Java 程序,负责处理客户端请求并生成响应;而 JSP 则是一种简化的 Servlet 开发方式,允许开发者在 HTML 页面中嵌入 J…

性能测试丨微信小程序性能优化指南

在 App 端进行微信小程序性能分析时,可以从以下几个方面入手,确保小程序的运行效率和用户体验。 1. 启动性能分析 首次加载时间:衡量小程序从启动到首页完全加载的时间,优化代码包大小和资源加载。冷启动 vs 热启动:…

计算机网络:ICMP协议(Internet控制消息协议)介绍

目录 一、简介 二、为什么要有ICMP协议? 三、ICMP协议报文格式 四、ICMP报文的类型 4.1 差错报文 4.2 查询报文 五、ICMP报文的实际案例 5.1 Ping命令 5.2 Traceroute命令 总结 今天和大家聊聊ICMP协议相关的知识,感兴趣的可以一起了解一下! 一、简介 ICMP(Inte…