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()
|