引言
在日常工作中,我们经常需要从PDF文档中提取文本内容。虽然市面上有不少相关工具,但它们要么功能过于复杂,要么使用不够方便。本文将介绍如何使用Python开发一个简单实用的PDF文本提取工具,该工具具有图形界面,操作简单直观。
C:\pythoncode\new\GetTxtFromPdfFromX2Y.py
全部代码
import wx import PyPDF2 import os class 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: return self.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) return start = self.start_page.GetValue() end = self.end_page.GetValue() if start > end: wx.MessageBox('开始页码不能大于结束页码', '错误', wx.OK | wx.ICON_ERROR) return 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') 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()
功能需求分析
在开发之前,我们先明确工具的核心功能需求:
提供图形界面,方便用户操作
支持选择PDF文件
可以指定提取的页面范围
将提取的文本保存为TXT文件
显示操作状态和结果
技术选型
基于上述需求,我们选择以下技术栈:
Python: 作为主要开发语言
wxPython: 用于开发图形界面
PyPDF2: 用于处理PDF文件
wxPython是一个功能强大的GUI工具包,它能够创建原生风格的界面,性能好,使用简单。PyPDF2则是一个广受欢迎的PDF处理库,支持读取文本、提取页面等操作。
环境准备
在开始开发之前,需要先安装必要的库:
pip install wxPython PyPDF2
详细设计和实现
1. 界面设计
我们的界面采用垂直布局,从上到下依次包含:
文件选择按钮
文件路径显示区域
页码范围输入区域(开始页码和结束页码)
生成按钮
状态显示区域
2. 核心代码实现
让我们一步步实现这个工具:
2.1 创建主窗口类
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 界面初始化
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 文件选择功能
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: return self.pdf_path = fileDialog.GetPath() self.path_text.SetValue(self.pdf_path)
文件选择对话框使用wx.FileDialog
实现,我们设置了文件过滤器,只显示PDF文件。当用户选择文件后,会更新显示路径,并自动获取PDF的页数信息。
2.4 转换功能实现
def onGenerate(self, event): if not self.pdf_path: wx.MessageBox('请先选择PDF文件', '提示', wx.OK | wx.ICON_INFORMATION) return start = 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文件。我们在每页内容前添加了页码标记,方便阅读。
异常处理
为了提高程序的健壮性,我们添加了完善的异常处理:
文件选择验证
页码范围验证
文件读写异常处理
PDF解析异常处理
try: # 转换操作 ... except Exception as e: self.status_text.SetValue(f"转换失败: {str(e)}") wx.MessageBox(f'转换失败: {str(e)}', '错误', wx.OK | wx.ICON_ERROR)
运行效果
程序运行后会显示一个简洁的窗口,用户可以:
点击"选择PDF文件"按钮选择需要处理的PDF文件
输入需要提取的页面范围
点击"生成TXT"按钮开始转换
在状态区域查看转换结果
生成的TXT文件会自动保存在原PDF文件所在的目录下,文件名为原PDF文件名加上"_output.txt"后缀。
优化建议
添加进度条显示转换进度
支持批量处理多个PDF文件
添加文本编码选项
支持更多输出格式(如Word、HTML等)
添加文本提取方式的选项(按段落、按行等)
运行结果
总结
本PDF到TXT转换器应用程序通过结合使用wxPython和PyPDF2库,为用户提供了一个方便、快捷的PDF文本提取工具。它具有简洁易用的界面、丰富的功能以及完善的错误处理机制,能够满足用户在日常工作中对PDF文件处理的需求。同时,该程序也展示了wxPython和PyPDF2库在GUI应用程序开发中的强大功能和灵活性。
本文来源于#winfredzhang,由@蜜芽 整理发布。如若内容造成侵权/违法违规/事实不符,请联系本站客服处理!
该文章观点仅代表作者本人,不代表本站立场。本站不承担相关法律责任。
如若转载,请注明出处:https://www.zhanid.com/biancheng/3307.html