【原创实践】Python 将 Markdown 文件转换为 Word(docx)完整实现

【原创实践】Python 将 Markdown 文件转换为 Word(docx)完整实现

Python 将 Markdown 文件转换为 Word(docx)完整实现

在实际开发中,经常会遇到将 Markdown 文档转换为 Word(.docx)的需求,例如:

  • 技术文档从 Markdown 迁移到 Word
  • 自动生成可下载的 Word 报告

与 Dify、FastAPI 等系统结合做文档导出

在这里插入图片描述

本文基于 python-docx + markdown + BeautifulSoup,实现一个不依赖接口、直接读取 Markdown 文件并生成 Word 文件的完整方案,支持常见 Markdown 语法。


参考链接 https://mp.weixin.qq.com/s/vyz5d9Hya9UEEEvOiro9Vg

一、实现思路说明

整体转换流程如下:

  1. 使用 markdown 库将 Markdown 文本转换为 HTML
  2. 使用 BeautifulSoup 解析 HTML 结构
  3. 遍历 HTML 节点,映射为 Word 中的对应元素
  4. 使用 python-docx 生成并保存 .docx 文件

支持的 Markdown 元素包括:

  • 标题(h1–h6)
  • 段落
  • 无序 / 有序列表
  • 代码块
  • 行内代码、加粗、斜体
  • 表格

二、依赖安装

pip install python-docx markdown beautifulsoup4 

三、完整代码实现

from docx import Document from docx.shared import Pt from bs4 import BeautifulSoup import markdown import uuid import os FILE_DIR ="static" os.makedirs(FILE_DIR, exist_ok=True)defmd_to_word(md_text:str)->str:""" 将 Markdown 文本转换为 Word,返回生成的文件名 """ html = markdown.markdown( md_text, extensions=["extra","tables","fenced_code"]) soup = BeautifulSoup(html,"html.parser") doc = Document()for element in soup.contents: handle_element(doc, element) filename =f"{uuid.uuid4().hex}.docx" file_path = os.path.join(FILE_DIR, filename) doc.save(file_path)return filename defhandle_element(doc, el):ifnothasattr(el,"name")or el.name isNone:return# 标题if el.name in["h1","h2","h3","h4","h5","h6"]: doc.add_heading(el.get_text(), level=int(el.name[1]))return# 段落if el.name =="p": p = doc.add_paragraph() add_inline_text(p, el)return# 无序列表if el.name =="ul":for li in el.find_all("li", recursive=False): p = doc.add_paragraph(style="List Bullet") add_inline_text(p, li)return# 有序列表if el.name =="ol":for li in el.find_all("li", recursive=False): p = doc.add_paragraph(style="List Number") add_inline_text(p, li)return# 代码块if el.name =="pre": code_el = el.find("code") code = code_el.get_text()if code_el else el.get_text() p = doc.add_paragraph() run = p.add_run(code) run.font.name ="Courier New" run.font.size = Pt(10)return# 表格if el.name =="table": rows = el.find_all("tr") cols = rows[0].find_all(["th","td"]) table = doc.add_table(rows=len(rows), cols=len(cols)) table.style ="Table Grid"for r, row inenumerate(rows):for c, cell inenumerate(row.find_all(["th","td"])): paragraph = table.rows[r].cells[c].paragraphs[0] run = paragraph.add_run(cell.get_text())if cell.name =="th": run.bold =Truedefadd_inline_text(paragraph, el):""" 处理行内样式:加粗、斜体、行内代码 """for node in el.contents:ifisinstance(node,str): paragraph.add_run(node)else: run = paragraph.add_run(node.get_text())if node.name =="strong": run.bold =Trueelif node.name =="em": run.italic =Trueelif node.name =="code": run.font.name ="Courier New" run.font.size = Pt(10)defmd_to_word_from_file(md_file_path:str)->str:""" 从 Markdown 文件生成 Word """withopen(md_file_path,"r", encoding="utf-8")as f: md_text = f.read()return md_to_word(md_text)if __name__ =="__main__": md_path ="jd.md"# Markdown 文件路径 filename = md_to_word_from_file(md_path)print("生成的 Word 文件:", filename)

四、使用说明

  1. 将 Markdown 文件(如 jd.md)放到当前目录
  2. 运行脚本:
python md_to_word.py 
  1. 程序会在 static/ 目录下生成一个 .docx 文件,文件名为 UUID

五、适用场景

  • FastAPI / Flask 文档导出
  • Dify 工作流中生成 Word 报告
  • Markdown 文档批量转 Word
  • 内部系统自动生成可编辑文档

六、可优化方向

  • 增加图片(img)支持
  • 支持代码高亮样式
  • 表格列宽自适应
  • 自定义标题样式、字体、行距
  • 与 FastAPI 接口结合返回下载地址

七、总结

本文实现了一个轻量、可控、易扩展的 Markdown 转 Word 方案,不依赖外部接口,适合后端服务或本地脚本使用。
对于需要文档导出、报告生成的场景,这种方式在稳定性和可维护性上都具有明显优势。

如果你后续需要 FastAPI 接口版Dify 工作流集成版样式增强版,可以在此基础上直接扩展。

Read more

2026最新|GitHub 启用双因素身份验证 2FA 教程:TOTP.app 一键生成动态验证码(新手小白图文实操)

2026最新|GitHub 启用双因素身份验证 2FA 教程:TOTP.app 一键生成动态验证码(新手小白图文实操)

2026最新|GitHub 启用双因素身份验证 2FA 教程:TOTP.app 一键生成动态验证码(新手小白图文实操) 如果你最近登录 GitHub 时被提示“启用双因素身份验证(2FA)”,别慌——这就是在你输入密码后,再增加一道“动态验证码”的安全锁。本文用TOTP.app(可下载/可在线) 带你从 0 到 1 完成 GitHub 的 2FA 配置,全程保留原图与链接,按步骤照做就能成功。 关键词:GitHub 2FA、GitHub 双因素身份验证、GitHub 启用 2FA、GitHub TOTP、GitHub 动态验证码、GitHub 账号安全、GitHub 登录保护、

By Ne0inhk
GitHub 热榜项目 - 日榜(2026-1-10)

GitHub 热榜项目 - 日榜(2026-1-10)

GitHub 热榜项目 - 日榜(2026-1-10) 生成于:2026-1-10 统计摘要 共发现热门项目: 12 个 榜单类型:日榜 本期热点趋势总结 本期GitHub热榜显示AI智能体开发工具正席卷开发者社区,Claude Code、opencode等项目通过自然语言交互极大提升编码效率,Chrome DevTools MCP和UI-TARS-desktop则推动多模态智能体与开发工具深度集成,同时TailwindCSS持续领跑前端工具链,NetBird提供现代化安全网络方案,反映出开发者正积极采用AI助手优化工作流,并重点关注智能体工具链集成、实用型开发工具及基础设施安全三大趋势,这些高质量开源方案切实提升了开发体验与工程效率。 1. ChromeDevTools/chrome-devtools-mcp * 🏷️ 项目名称:ChromeDevTools/chrome-devtools-mcp * 🔗 项目地址: https://github.com/ChromeDevTools/chrome-devtools-mcp * ⭐ 当前 Star 数:

By Ne0inhk

飞书机器人通知:任务完成自动推送消息提醒用户查收结果

飞书机器人通知:任务完成自动推送消息提醒用户查收结果 在档案馆管理员老李的日常工作中,有一项重复而繁琐的任务——接收家属寄来的黑白老照片扫描件,手动上传到修复工具,等待几十分钟处理完成后,再逐一截图回复:“您的照片已修复,请查收。”这样的流程不仅效率低下,还容易因遗忘或延迟导致用户体验下降。直到他所在单位接入了一个新系统:照片一上传,AI自动修复着色,完成后飞书机器人立刻弹出一条带预览链接的消息:“【老照片修复完成】您提交的照片已成功上色!”整个过程无需人工干预。 这背后并非魔法,而是DDColor图像着色模型 + ComfyUI可视化工作流 + 飞书机器人自动化通知三者协同构建的一套“智能处理—状态感知—即时反馈”闭环系统的落地实践。这套方案正悄然改变着AI应用的传统交互模式。 从“无感运行”到“主动告知”:为什么需要自动化通知? 当前大多数AI图像处理系统仍停留在“执行即结束”的阶段。用户点击“开始”,然后盯着进度条猜测何时完成;或者干脆切换窗口去做别的事,结果忘了回来查看输出文件夹。这种被动式交互极大削弱了AI本应带来的便捷性。 更深层次的问题在于,当多个任务并行时,缺

By Ne0inhk

本地使用ComfyUI运行Stable Diffusion 3.5

本地使用 ComfyUI 运行 Stable Diffusion 3.5-FP8 你有没有试过用一张消费级显卡,在不到两分钟内生成一张细节拉满的 1024×1024 分辨率图像?现在,这已经不是幻想。随着 Stable Diffusion 3.5-FP8 的发布,开源文生图模型正式迈入“高效推理”时代——不仅画质不输原版,速度更快、显存更省,甚至能在 RTX 3060 上流畅跑起来。 而搭配 ComfyUI 这个高度模块化的前端工具,整个部署过程变得异常轻量且可控。本文将带你从零开始,一步步在本地搭建这套高性能量化系统,并避开国内用户最头疼的网络和路径问题。 硬件要求没你想的那么高 很多人一听到 SD3.5 就下意识觉得“得上专业卡”,其实那是针对未量化的大模型版本。FP8 版本通过 8-bit 浮点精度压缩,大幅降低了计算负载和内存占用。 实测表明:

By Ne0inhk