PDF到TXT转换器:基于wxPython和PyPDF2的图形用户界面应用

winfredzhang 2025-02-24 11:25:55编程技术
292

引言

在日常工作中,我们经常需要从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()

功能需求分析

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

  1. 提供图形界面,方便用户操作

  2. 支持选择PDF文件

  3. 可以指定提取的页面范围

  4. 将提取的文本保存为TXT文件

  5. 显示操作状态和结果

技术选型

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

  • 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文件。我们在每页内容前添加了页码标记,方便阅读。

异常处理

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

  1. 文件选择验证

  2. 页码范围验证

  3. 文件读写异常处理

  4. PDF解析异常处理

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. 添加文本提取方式的选项(按段落、按行等)

运行结果

PDF到TXT转换器:基于wxPython和PyPDF2的图形用户界面应用

PDF到TXT转换器:基于wxPython和PyPDF2的图形用户界面应用

总结

本PDF到TXT转换器应用程序通过结合使用wxPython和PyPDF2库,为用户提供了一个方便、快捷的PDF文本提取工具。它具有简洁易用的界面、丰富的功能以及完善的错误处理机制,能够满足用户在日常工作中对PDF文件处理的需求。同时,该程序也展示了wxPython和PyPDF2库在GUI应用程序开发中的强大功能和灵活性。

python pdf
THE END
蜜芽
故事不长,也不难讲,四字概括,毫无意义。

相关推荐

Python操作Excel入门:Pandas 与 Openpyxl 使用指南
Python通过Pandas和Openpyxl库构建了强大的Excel自动化处理体系:Pandas擅长结构化数据的高效分析,Openpyxl提供精细化的单元格级控制。本文ZHANID工具网将系统讲解这两个库的...
2025-07-08 编程技术
257

Python爬虫进阶:基于BeautifulSoup的链接分析与过滤方法
BeautifulSoup作为Python生态中最成熟的HTML解析库,其基于DOM树的解析模型和灵活的查询接口,为链接分析提供了强大的工具链。本文ZHANID工具网将系统阐述如何利用BeautifulS...
2025-07-08 编程技术
239

Python 数据可视化项目实战:南方暴雨洪涝数据分析
截至20250621,南方地区(特别是广东、广西、湖南等地)遭遇的极端暴雨和洪水灾害,斑点鱼将使用Python进行数据分析和可视化,展示洪水影响区域、雨势强度以及经济损失等情况。
2025-07-03 编程技术
276

Python 面向对象编程中 @classmethod 的基本用法详解
在Python面向对象编程中,@classmethod作为核心装饰器之一,为开发者提供了灵活的类操作能力。它通过将方法绑定到类而非实例,实现了工厂模式、类状态管理、继承多态等高级功...
2025-07-03 编程技术
260

如何在 Python 中正确地定义变量?一篇文章讲清楚
变量是编程语言中最基础的概念之一,它是存储数据的容器,是程序与数据交互的桥梁。在 Python 中,变量定义看似简单,但其中蕴含的动态类型、命名规范、作用域等概念却深刻影...
2025-07-02 编程技术
267

如何通过pip换源解决Python依赖安装慢的问题?
在Python开发过程中,依赖安装速度直接影响项目启动效率。当开发者使用pip install命令时,默认连接的PyPI(Python Package Index)官方源常因地理位置和网络环境导致下载速度...
2025-07-01 编程技术
283