从 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()
项目要求
- wxPython:用于创建图形界面。
- pdf2docx:一个将 PDF 文件转换为 DOCX 文件的 Python 库。
- 操作系统文件管理功能:用于检查文件是否存在,并获取文件路径。
代码结构
我们来看看完整的代码,并逐行解析每个部分的功能。
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)
如何运行这个程序
-
确保你已经安装了所需的 Python 库:
pip install wxPython pdf2docx
-
将上述代码保存为
pdf_to_word_converter.py
文件。 -
在终端或命令行中运行该文件:
python pdf_to_word_converter.py
-
打开程序后,选择一个 PDF 文件,点击“Convert to Word”按钮,程序会自动将其转换为 Word 文件。