MD 转 Word
参考 Cherry Studio 开源实现 思路,使用 markdown-it-py 解析 Markdown 为 token,再用 python-docx 生成 Word 文档。
依赖
call agent :安装完成后请标记
python-docx(~1.2.0) —markdown-it-py(~4.0.0) —latex2mathml(~3.81.0) — (LaTeX 公式 → MathML)mathml2omml(~0.0.2) — (MathML → OMML)
使用方法
python "scripts/md_to_word.py" <input.md> [output.docx]
直接传入 Markdown 字符串:
python "scripts/md_to_word.py" --inline "<markdown字符串>" output.docx
支持的 Markdown 语法
| 语法 | 说明 |
|------|------|
| # ~ ###### | 标题 h1~h6 |
| **text** / __text__ | 粗体 |
| *text* / _text_ | 斜体 |
| `code` | 行内代码(Consolas 字体) |
| ```lang ... ``` | 代码块(灰色背景 + 边框) |
| - item / * item | 无序列表 |
| 1. item | 有序列表 |
| - [ ] / - [x] | 任务列表 |
| > quote | 引用块(左侧灰线) |
| --- / *** | 水平分割线 |
| | A | B | | 表格(三线表风格) |
| [text](url) | 超链接 |
|  | 图片(本地路径自动嵌入,支持图注) |
| ~~text~~ | 删除线 |
| $...$ / $$...$$ | LaTeX 数学公式(Word 原生 OMML 公式) |
图片处理
支持以下三种图片格式:
- 标准 Markdown 图片:
— 自动嵌入并保持原尺寸 - 带图注的图片:
<br>*▲ 图注文字*— 自动嵌入图片 + 添加居中图注 - 分行图注:
下一行*图注文字*— 自动识别绑定
工作原理
本技能采用两阶段图片处理策略:
- 阶段一(主转换):
md_to_word.py在解析 Markdown 时尝试直接插入图片,优先查找绝对路径和相对路径 - 阶段二(后处理):自动调用
embed_images.py扫描生成的 DOCX 文件,将未能插入的[图片: ...]占位符替换为真实嵌入图片,并附上图注
图片查找顺序
1. Markdown 中指定的原始路径
2. MD 源文件同目录下的相对路径
3. MD 源文件同目录下的 images/ 子目录
4. 指定的 --img-dir 参数目录
LaTeX 数学公式支持
本技能现在支持 LaTeX 数学公式转换为 Word 原生 OMML 公式(可直接在 Word 中编辑和渲染)。
支持的公式语法
| 格式 | 说明 | 示例 |
|------|------|------|
| $...$ | 行内公式 | $E=mc^2$ |
| $$...$$ | 块级公式(居中显示) | $$\int_{-\infty}^{\infty} e^{-x^2}\,dx = \sqrt{\pi}$$ |
支持的 LaTeX 语法
- 基本运算:
+-\times\div\pm - 上下标:
x^2x_n - 分式:
\frac{a}{b} - 根式:
\sqrt{x}\sqrt[n]{x} - 求和/积分/极限:
\sum\int\lim\prod - 矩阵:
\begin{bmatrix} a & b \\ c & d \end{bmatrix} - 希腊字母:
\alpha\beta\gamma\pi\infty等 - 三角函数:
\sin\cos\tan - 括号:
\left(\right) - 矢量:
\mathbf{E}\vec{v} - 更多标准 LaTeX 数学环境
转换原理
采用 md2word 的转换管线思路:
LaTeX 公式文本
↓ latex2mathml (Python 库)
MathML (数学标记语言)
↓ mathml2omml (Python 库)
OMML (Office Math Markup Language, Word 原生格式)
↓ 注入 python-docx
Word 文档中的可编辑公式
- 行内公式
$...$→ 直接嵌入段落的m:oMath元素 - 块级公式
$$...$$→ 创建居中对齐的m:oMathPara容器
无需调用外部 API,纯本地转换,完全离线可用。
项目文件
| 文件 | 说明 |
|------|------|
| scripts/md_to_word.py | 主转换脚本 — 解析 Markdown 生成 Word |
| scripts/embed_images.py | 图片后处理脚本 — 将占位符替换为真实图片 |
| SKILL.md | 本技能定义文件 |
| LICENSE | AGPL-3.0 许可证 |
工作流程
- 读取用户指定的 Markdown 文件(或直接使用对话中的 Markdown 内容)
- 用
markdown-it-py解析为 token 流 - 遍历 token,用
python-docx构建对应的 Word 元素 - 保存为
.docx文件 - 自动检测是否包含图片引用,如有则执行图片后处理嵌入
参考实现
本技能参考了 Cherry Studio src/main/services/ExportService.ts 的实现思路:
- 使用
markdown-it(JS版)/markdown-it-py(Python版)解析 Markdown - 遍历 token 流构建文档元素
- 表格采用三线表风格(表头粗体、顶部底部有边框)
已知限制
- 表格中的嵌套复杂格式(如表格内代码块)支持有限
- 图片需要本地文件路径才能嵌入(不支持网络图片下载)
- 图片尺寸固定为5英寸宽度,后续可配置
开源协议
本技能基于 GNU Affero General Public License v3.0 (AGPL-3.0) 发布。
本项目参考了 Cherry Studio(AGPL-3.0)的 ExportService.ts 实现思路。
根据 AGPL-3.0 第5节的要求,特此声明:
- ✅ 本作品基于 Cherry Studio 的思路进行修改和移植
- ✅ 修改时间:2026年6月
- ✅ 修改内容:从 TypeScript (Electron) 移植到 Python 3,替换了所有依赖库
- ✅ 本作品同样以 AGPL-3.0 协议发布
详细信息请参阅 LICENSE 文件。
Scan to join WeChat group