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

ops/2024/12/23 22:23:01/

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

项目概述

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

全部代码

python">word">import wx
word">import os
word">from pdf2docx word">import Converterword">class PDFConverterFrame(wx.Frame):word">def __init__(self):super().__init__(parent=None, title='PDF to Word Converter', size=(500, 200))self.pdf_path = None# Create main panelpanel = wx.Panel(self)# Create vertical box sizervbox = wx.BoxSizer(wx.VERTICAL)# Create file picker buttonself.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 textself.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 buttonconvert_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 sizerpanel.SetSizer(vbox)# Center window on screenself.Centre()word">def on_convert(self, event):pdf_path = self.file_picker.GetPath()word">if word">not pdf_path:wx.MessageBox('Please select a PDF file first!', 'Error', wx.OK | wx.ICON_ERROR)word">returnword">if word">not os.path.exists(pdf_path):wx.MessageBox('Selected PDF file does not exist!', 'Error', wx.OK | wx.ICON_ERROR)word">return# Generate output path (same name, same directory, .docx extension)docx_path = os.path.splitext(pdf_path)[0] + '.docx'word">try:# Update statusself.status_text.SetLabel("Converting... Please wait.")self.Layout()# Convert PDF to Wordcv = Converter(pdf_path)cv.convert(docx_path)cv.close()# Show success messageself.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)word">except Exception word">as e:# Show error messageself.status_text.SetLabel("Conversion failed!")wx.MessageBox(f'An error occurred during conversion:\n{str(e)}','Error',wx.OK | wx.ICON_ERROR)word">if __name__ == '__main__':# Initialize wx applicationapp = wx.App()# Create and show frameframe = PDFConverterFrame()frame.Show()# Start application main loopapp.MainLoop()
项目要求
  1. wxPython:用于创建图形界面。
  2. pdf2docx:一个将 PDF 文件转换为 DOCX 文件的 Python 库。
  3. 操作系统文件管理功能:用于检查文件是否存在,并获取文件路径。
代码结构

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

python">word">import wx
word">import os
word">from pdf2docx word">import Converterword">class PDFConverterFrame(wx.Frame):word">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()word">def on_convert(self, event):# 获取选择的 PDF 文件路径pdf_path = self.file_picker.GetPath()word">if word">not pdf_path:wx.MessageBox('Please select a PDF file first!', 'Error', wx.OK | wx.ICON_ERROR)word">returnword">if word">not os.path.exists(pdf_path):wx.MessageBox('Selected PDF file does not exist!', 'Error', wx.OK | wx.ICON_ERROR)word">return# 生成输出路径(同名的 DOCX 文件)docx_path = os.path.splitext(pdf_path)[0] + '.docx'word">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)word">except Exception word">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)word">if __name__ == '__main__':# 启动 wxPython 应用app = wx.App()# 创建并显示窗口frame = PDFConverterFrame()frame.Show()# 进入应用的主循环app.MainLoop()
代码解析
1. 创建窗口和面板

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

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

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

python">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. 状态文本

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

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

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

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

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

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

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

python">word">except Exception word">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.ppmy.cn/ops/144402.html

相关文章

Sql注入(靶场)26-30关

第二十六关 这关将逻辑运算符,注释符以及空格给过滤了 我们先使用单引号进行闭合 这时我们查看源代码可以看到这一关过滤了很多字符 可以看到这里将or and / -- # 空格等字符都被注释了 空格被过滤了我们可以使用()来代替,and和or可以使用双写来绕过 …

常用的缓存技术都有哪些

在计算机科学和软件开发领域,缓存技术是提高系统性能和响应速度 1. 本地缓存(Local Cache): • 存在于应用程序本地内存中的缓存,用于存储频繁访问的数据,以减少对外部存储(如数据库&#xff09…

vue项目两种路由模式原理和应用

两种模式的区别 路由,让页面url改变,但整个html页面不重新加载,单页面应用,局部刷新页面。 1. hash原理 通过动态锚点技术重写url,如“http://127.0.0.1/#/XXX”,改变#后面的路径,实现切换url…

Android Audio实战——音频流数据dump(十)

在《Android Audio基础——音频链路分析》中已经对音频链路进行了分析,并且也分析了 dump pcm 数据的相关节点,这里我们来看一下 dump pcm 数据的详细代码。 一、上/下音频数据 1、Android.bp 源码位置:/frameworks/av/media/libaudioclient/Android.bp cc_library_shar…

[计算机网络]唐僧的”通关文牒“NAT地址转换

1.NAT:唐僧的通关文牒 在古老的西游记中,唐僧师徒四人历经九九八十一难,终于取得了真经。然而,他们并不是一开始就获得了通关文牒,而是经过了重重考验,最终得到了国王的认可,才顺利通过了各个关…

使用 Elasticsearch 查询和数据同步的实现方法

在开发过程中,将数据从数据库同步到 Elasticsearch (ES) 是常见的需求之一。本文将重点介绍如何通过 Python 脚本将数据库中的数据插入或更新到 Elasticsearch,并基于多字段的唯一性来判断是否执行插入或更新操作。此外,我们还将深入探讨如何…

Firefox 基本设置备忘

Firefox 基本设置备忘 记录一些常用的 Firefox 设置,可以帮助增强浏览体验: 标签页设置: browser.search.openintab: true 在搜索栏中搜索时,在新标签页中打开结果。browser.tabs.loadBookmarksInTabs: true 点击书签时,在新标…

力扣-图论-15【算法学习day.65】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…