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

从 PDF 到 Word:一个简单的 PythonGUI转换器

在日常工作中,我们经常需要将 PDF 文档转换为 Word 文件。幸运的是,Python 提供了很多强大的库,帮助我们实现这一功能。今天,我将与大家分享如何使用 wxPython 创建一个简单的图形用户界面(GUI)应用程序,结合 pdf2docx 库,实现将 PDF 转换为 Word 文档的功能。
C:\pythoncode\new\PDFConvertWord.py

项目概述

这个小工具的主要目的是通过一个简单的窗口,让用户选择一个 PDF 文件,然后点击“转换”按钮,程序会将 PDF 文件转换为 Word 格式并保存在相同目录下。我们将使用 wxPython 来创建图形界面,pdf2docx 来进行实际的 PDF 转换。

全部代码

import wx
import os
from pdf2docx import Converter

class PDFConverterFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='PDF to Word Converter', size=(500, 200))
        self.pdf_path = None
        
        # Create main panel
        panel = wx.Panel(self)
        
        # Create vertical box sizer
        vbox = wx.BoxSizer(wx.VERTICAL)
        
        # Create file picker button
        self.file_picker = wx.FilePickerCtrl(
            panel, 
            message="Choose a PDF file",
            wildcard="PDF files (*.pdf)|*.pdf",
            style=wx.FLP_USE_TEXTCTRL | wx.FLP_OPEN | wx.FLP_FILE_MUST_EXIST
        )
        vbox.Add(self.file_picker, 0, wx.ALL | wx.EXPAND, 5)
        
        # Create status text
        self.status_text = wx.StaticText(panel, label="Select a PDF file to convert")
        vbox.Add(self.status_text, 0, wx.ALL | wx.CENTER, 5)
        
        # Create convert button
        convert_btn = wx.Button(panel, label='Convert to Word')
        convert_btn.Bind(wx.EVT_BUTTON, self.on_convert)
        vbox.Add(convert_btn, 0, wx.ALL | wx.CENTER, 5)
        
        # Set panel sizer
        panel.SetSizer(vbox)
        
        # Center window on screen
        self.Centre()
        
    def on_convert(self, event):
        pdf_path = self.file_picker.GetPath()
        if not pdf_path:
            wx.MessageBox('Please select a PDF file first!', 'Error', wx.OK | wx.ICON_ERROR)
            return
            
        if not os.path.exists(pdf_path):
            wx.MessageBox('Selected PDF file does not exist!', 'Error', wx.OK | wx.ICON_ERROR)
            return
            
        # Generate output path (same name, same directory, .docx extension)
        docx_path = os.path.splitext(pdf_path)[0] + '.docx'
        
        try:
            # Update status
            self.status_text.SetLabel("Converting... Please wait.")
            self.Layout()
            
            # Convert PDF to Word
            cv = Converter(pdf_path)
            cv.convert(docx_path)
            cv.close()
            
            # Show success message
            self.status_text.SetLabel("Conversion completed successfully!")
            wx.MessageBox(
                f'PDF has been converted to Word!\nSaved as: {docx_path}',
                'Success',
                wx.OK | wx.ICON_INFORMATION
            )
            
        except Exception as e:
            # Show error message
            self.status_text.SetLabel("Conversion failed!")
            wx.MessageBox(
                f'An error occurred during conversion:\n{str(e)}',
                'Error',
                wx.OK | wx.ICON_ERROR
            )

if __name__ == '__main__':
    # Initialize wx application
    app = wx.App()
    
    # Create and show frame
    frame = PDFConverterFrame()
    frame.Show()
    
    # Start application main loop
    app.MainLoop()
项目要求
  1. wxPython:用于创建图形界面。
  2. pdf2docx:一个将 PDF 文件转换为 DOCX 文件的 Python 库。
  3. 操作系统文件管理功能:用于检查文件是否存在,并获取文件路径。
代码结构

我们来看看完整的代码,并逐行解析每个部分的功能。

import wx
import os
from pdf2docx import Converter

class PDFConverterFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='PDF to Word Converter', size=(500, 200))
        self.pdf_path = None
        
        # 创建主面板
        panel = wx.Panel(self)
        
        # 创建垂直排列的布局
        vbox = wx.BoxSizer(wx.VERTICAL)
        
        # 创建文件选择控件
        self.file_picker = wx.FilePickerCtrl(
            panel, 
            message="Choose a PDF file",
            wildcard="PDF files (*.pdf)|*.pdf",
            style=wx.FLP_USE_TEXTCTRL | wx.FLP_OPEN | wx.FLP_FILE_MUST_EXIST
        )
        vbox.Add(self.file_picker, 0, wx.ALL | wx.EXPAND, 5)
        
        # 创建状态文本控件
        self.status_text = wx.StaticText(panel, label="Select a PDF file to convert")
        vbox.Add(self.status_text, 0, wx.ALL | wx.CENTER, 5)
        
        # 创建转换按钮
        convert_btn = wx.Button(panel, label='Convert to Word')
        convert_btn.Bind(wx.EVT_BUTTON, self.on_convert)
        vbox.Add(convert_btn, 0, wx.ALL | wx.CENTER, 5)
        
        # 设置面板布局
        panel.SetSizer(vbox)
        
        # 窗口居中显示
        self.Centre()
        
    def on_convert(self, event):
        # 获取选择的 PDF 文件路径
        pdf_path = self.file_picker.GetPath()
        if not pdf_path:
            wx.MessageBox('Please select a PDF file first!', 'Error', wx.OK | wx.ICON_ERROR)
            return
            
        if not os.path.exists(pdf_path):
            wx.MessageBox('Selected PDF file does not exist!', 'Error', wx.OK | wx.ICON_ERROR)
            return
            
        # 生成输出路径(同名的 DOCX 文件)
        docx_path = os.path.splitext(pdf_path)[0] + '.docx'
        
        try:
            # 更新状态文本为正在转换
            self.status_text.SetLabel("Converting... Please wait.")
            self.Layout()
            
            # 使用 pdf2docx 库进行转换
            cv = Converter(pdf_path)
            cv.convert(docx_path)
            cv.close()
            
            # 转换成功后更新状态文本
            self.status_text.SetLabel("Conversion completed successfully!")
            wx.MessageBox(
                f'PDF has been converted to Word!\nSaved as: {docx_path}',
                'Success',
                wx.OK | wx.ICON_INFORMATION
            )
            
        except Exception as e:
            # 如果发生错误,显示错误信息
            self.status_text.SetLabel("Conversion failed!")
            wx.MessageBox(
                f'An error occurred during conversion:\n{str(e)}',
                'Error',
                wx.OK | wx.ICON_ERROR
            )

if __name__ == '__main__':
    # 启动 wxPython 应用
    app = wx.App()
    
    # 创建并显示窗口
    frame = PDFConverterFrame()
    frame.Show()
    
    # 进入应用的主循环
    app.MainLoop()
代码解析
1. 创建窗口和面板

我们首先通过 wx.Frame 创建了主窗口,wx.Panel 用作主窗口中的面板,所有控件都将放置在这个面板中。wx.BoxSizer(wx.VERTICAL) 用来管理控件的布局,确保它们在窗口中按垂直方向排列。

panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
2. 文件选择器

我们使用 wx.FilePickerCtrl 来允许用户选择 PDF 文件。通过设置 wildcard,我们限制了文件选择框只显示 .pdf 文件。

self.file_picker = wx.FilePickerCtrl(
    panel, 
    message="Choose a PDF file",
    wildcard="PDF files (*.pdf)|*.pdf",
    style=wx.FLP_USE_TEXTCTRL | wx.FLP_OPEN | wx.FLP_FILE_MUST_EXIST
)
3. 状态文本

状态文本用来实时反馈转换过程中的信息(如正在转换、转换成功或失败)。

self.status_text = wx.StaticText(panel, label="Select a PDF file to convert")
4. 转换按钮

点击按钮时触发 on_convert 方法,该方法首先检查是否选择了文件,然后检查文件是否存在,最后调用 pdf2docx 库进行转换。

convert_btn = wx.Button(panel, label='Convert to Word')
convert_btn.Bind(wx.EVT_BUTTON, self.on_convert)
5. 文件转换

文件转换过程通过 pdf2docx.Converter 完成。转换过程中,程序会更新状态文本,提示用户正在进行转换,并在成功完成后显示结果信息。

cv = Converter(pdf_path)
cv.convert(docx_path)
cv.close()
6. 错误处理

如果转换过程中出现任何问题,程序会捕获异常并弹出错误提示。

except Exception as e:
    self.status_text.SetLabel("Conversion failed!")
    wx.MessageBox(f'An error occurred during conversion:\n{str(e)}', 'Error', wx.OK | wx.ICON_ERROR)
如何运行这个程序
  1. 确保你已经安装了所需的 Python 库:

    pip install wxPython pdf2docx
    
  2. 将上述代码保存为 pdf_to_word_converter.py 文件。

  3. 在终端或命令行中运行该文件:

    python pdf_to_word_converter.py
    
  4. 打开程序后,选择一个 PDF 文件,点击“Convert to Word”按钮,程序会自动将其转换为 Word 文件。

运行结果

在这里插入图片描述


http://www.kler.cn/a/443831.html

相关文章:

  • c++--------c++概念
  • Jenkins持续集成部署——jenkins安装
  • OpenHarmony-6.IPC/RPC组件
  • 多目标优化常用方法:pareto最优解
  • SpringBoot+Vue3实现阿里云视频点播 实现教育网站 在上面上传对应的视频,用户开会员以后才能查看视频
  • RK3588 , mpp硬编码yuv, 保存MP4视频文件.
  • 请给我详细讲解vue.config.js的配置内容
  • React状态管理常见面试题目(二)
  • Vue前端开发-数据缓存
  • K-Means 聚类:数据挖掘的瑞士军刀
  • 将java项目部署到linux
  • Selenium 深度解析:自动化浏览器操作的利器
  • PPT中添加多个图片
  • 解决echarts图宽度自适应问题,设置100%宽度显示100px
  • UDP网络编程套接
  • Java.10--IO流
  • 修改openjdk17 java/lang/String.java 类源码,增加一个native本地方法打印固定字符串功能
  • 图书馆管理系统(一)基于jquery、ajax
  • Linux 显示系统活动进程状态命令 ps 详细介绍
  • 如何有效修复ffmpeg.dll错误:一站式解决方案指南
  • Linux dd 命令详解:工作原理与实用指南(C/C++代码实现)
  • 单节点calico性能优化
  • springboot444新冠物资管理系统的设计与实现(论文+源码)_kaic
  • Databend 产品月报(2024年11月)
  • 【深度学习之三】FPN与PAN网络详解
  • 为SSH2协议服务器的用户设置密钥