在当今的文档处理中,Markdown因其简洁的语法和易读性而广受欢迎,而Microsoft Word(DOCX格式)则因其广泛的兼容性和专业的排版效果成为商业文档的标准。本文将介绍如何使用Python构建一个带有图形界面的Markdown转Word文档转换器,让这两种格式之间的转换变得简单直观。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
import wx import markdown2 from docx import Document from docx.shared import Pt, RGBColor from docx.enum.text import WD_ALIGN_PARAGRAPH import re
class MainFrame(wx.Frame): def __init__(self): super().__init__(parent=None, title='Markdown to DOCX Converter', size=(800, 600)) self.init_ui()
def init_ui(self): # 创建主面板 panel = wx.Panel(self)
# 创建垂直布局 vbox = wx.BoxSizer(wx.VERTICAL)
# 添加说明文字 help_text = wx.StaticText(panel, label="请输入或粘贴Markdown格式的文本:") vbox.Add(help_text, 0, wx.ALL, 5)
# 创建多行文本输入框 self.text_ctrl = wx.TextCtrl(panel, style=wx.TE_MULTILINE) vbox.Add(self.text_ctrl, 1, wx.EXPAND | wx.ALL, 5)
# 创建水平布局用于按钮 hbox = wx.BoxSizer(wx.HORIZONTAL)
# 添加转换按钮 convert_btn = wx.Button(panel, label='转换为DOCX') convert_btn.Bind(wx.EVT_BUTTON, self.on_convert) hbox.Add(convert_btn, 0, wx.ALL, 5)
# 添加清除按钮 clear_btn = wx.Button(panel, label='清除内容') clear_btn.Bind(wx.EVT_BUTTON, self.on_clear) hbox.Add(clear_btn, 0, wx.ALL, 5)
vbox.Add(hbox, 0, wx.ALIGN_RIGHT)
panel.SetSizer(vbox)
def on_convert(self, event): # 获取输入的Markdown文本 markdown_text = self.text_ctrl.GetValue() if not markdown_text.strip(): wx.MessageBox('请输入Markdown文本内容', '提示', wx.OK | wx.ICON_INFORMATION) return
# 创建保存文件对话框 with wx.FileDialog(self, "保存DOCX文件", wildcard="Word files (*.docx)|*.docx", style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as fileDialog:
if fileDialog.ShowModal() == wx.ID_CANCEL: return
# 保存文件 pathname = fileDialog.GetPath() try: self.convert_to_docx(markdown_text, pathname) wx.MessageBox('转换成功!', '提示', wx.OK | wx.ICON_INFORMATION) except Exception as e: wx.MessageBox(f'转换失败:{str(e)}', '错误', wx.OK | wx.ICON_ERROR)
def on_clear(self, event): self.text_ctrl.SetValue('')
def convert_to_docx(self, markdown_text, output_path): # 将Markdown转换为HTML html = markdown2.markdown(markdown_text, extras=['tables', 'fenced-code-blocks'])
# 创建新的Word文档 doc = Document()
# 解析HTML并添加到文档 # 移除HTML标签后按段落分割 paragraphs = re.split(r'\n+', re.sub(r'<[^>]+>', '', html))
for para_text in paragraphs: if para_text.strip(): # 检查是否是标题(以#开头) header_match = re.match(r'^(#{1,6})\s+(.+)$', para_text) if header_match: level = len(header_match.group(1)) text = header_match.group(2) p = doc.add_heading(text, level=level) else: p = doc.add_paragraph(para_text)
# 设置段落格式 p.alignment = WD_ALIGN_PARAGRAPH.LEFT
# 设置字体 run = p.runs[0] if p.runs else p.add_run() font = run.font font.name = '微软雅黑' font.size = Pt(11)
# 保存文档 doc.save(output_path)
if __name__ == '__main__': app = wx.App() frame = MainFrame() frame.Show() app.MainLoop() |
为了实现这个项目,我们选择了以下核心技术:
这些库的组合让我们能够构建一个功能完整、用户友好的文档转换工具。
我们使用wxPython创建了一个简洁的用户界面,包含以下元素:
界面设计采用垂直布局(BoxSizer),确保各个元素能够合理排布并支持窗口大小调整。
1 2 3 4 5 6 7 8 9 |
def init_ui(self): panel = wx.Panel(self) vbox = wx.BoxSizer(wx.VERTICAL)
help_text = wx.StaticText(panel, label="请输入或粘贴Markdown格式的文本:") vbox.Add(help_text, 0, wx.ALL, 5)
self.text_ctrl = wx.TextCtrl(panel, style=wx.TE_MULTILINE) vbox.Add(self.text_ctrl, 1, wx.EXPAND | wx.ALL, 5) |
转换过程分为两个主要步骤:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
def convert_to_docx(self, markdown_text, output_path): # 转换为HTML html = markdown2.markdown(markdown_text, extras=['tables', 'fenced-code-blocks'])
# 创建Word文档 doc = Document()
# 解析并添加内容 paragraphs = re.split(r'\n+', re.sub(r'<[^>]+>', '', html))
for para_text in paragraphs: if para_text.strip(): # 处理标题和段落 header_match = re.match(r'^(#{1,6})\s+(.+)$', para_text) if header_match: level = len(header_match.group(1)) text = header_match.group(2) p = doc.add_heading(text, level=level) else: p = doc.add_paragraph(para_text) |
为了确保生成的Word文档具有良好的排版效果,我们对文档样式进行了基本设置:
1 2 3 4 5 6 7 8 |
# 设置段落格式 p.alignment = WD_ALIGN_PARAGRAPH.LEFT
# 设置字体 run = p.runs[0] if p.runs else p.add_run() font = run.font font.name = '微软雅黑' font.size = Pt(11) |
在使用之前,需要安装必要的Python包:
1 |
pip install wxPython markdown2 python-docx |
这个项目还有很多可以扩展和优化的空间:
增强Markdown支持
文档处理增强