关于 Markdown to Word
Markdown to Word 将 GitHub Flavored Markdown 转换为格式化的 Word 文档,提供浏览器、Node.js、命令行和 MCP 使用方式。转换可在本地完成,并支持中文公文样式预设。
主要功能
- 01转换标题、列表、表格及常见 Markdown 格式
- 02输出 DOCX 文件或复制格式化文本
- 03提供中文公文字体与页面预设
- 04支持浏览器、Node.js 和命令行转换
适用场景
- 01将 AI 聊天回复整理为 Word 文档
- 02把 Markdown 报告转换为 DOCX
- 03为中文公文格式化 Markdown 文档
MCP 相关
MCP 服务通过 stdio 提供 `convert_markdown_to_word` 工具,可读取 Markdown 文本或文件并写出 DOCX。转换在本机执行,不下载远程图片。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
1收录的工具列表 · 更新于 1 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| path | string | 否 | 要转换的 Markdown 文件(.md、.markdown、.mdown 或 .txt)的路径,用于替代 markdown。相对路径以服务的工作目录为基准,因此建议使用绝对路径。 |
| markdown | string | 否 | 要转换的 Markdown。传入 path 时请省略。 |
| overwrite | boolean | 否 | 如果 output_path 已存在,则替换该文件。默认关闭,因此不会意外覆盖现有文件。 |
| font_preset | enum | 否 | 重新设置文档样式:chinese-official 会按照 GB/T 9704-2012 设置中文公文的字体、字号和页面布局。省略时使用 Word 默认样式。chinese-official |
| output_path | string | 是 | 写入 .docx 的位置;路径必须以 .docx 结尾。建议使用绝对路径。缺失的文件夹会自动创建。绝不会通过符号链接写入。 |
详细介绍
Markdown 转 Word
在浏览器中将 GitHub Flavored Markdown 转换为格式精美的 Word(.docx)文档,访问 md2word.app 即可。不会上传任何内容。
同一款转换器也发布在 npm 上,名为 markdown-to-word:可作为命令行工具、Node 库和供 AI Agent 使用的 MCP 服务,无需克隆:
npx markdown-to-word input.md
它与 word2md.com(word-to-markdown-js)方向相反,后者可将 Word 转换为 Markdown;它也是 markdown_to_word 的继任者。后者是最初的 Ruby gem 和 Web 演示版,于 2015 年首次发布,现已归档。
用法
- 访问 md2word.app。
- 将
.md文件拖放到页面任意位置,选择文件,或粘贴 Markdown。AI 聊天回复(ChatGPT、Claude 等)采用 Markdown 格式,可直接粘贴。 - 拖放文件后会立即转换。对于粘贴的文本,点击 转换为 Word,或按 Ctrl/⌘+Enter。
- 点击 下载 .docx,或点击 复制格式化文本,即可将保留格式的内容直接粘贴到 Word 或 Google 文档中。
文档会以其第一个标题命名,该标题也会成为文档标题。
转换效果
| Markdown | 在 Word 中 |
|---|---|
# 到 ###### 标题 | 标题 1–6 样式 |
**粗体**、*斜体*、~~删除线~~ | 相同的格式 |
| 项目符号列表和编号列表(含嵌套) | Word 列表 |
- [x] 任务列表 | ☒(已完成)和 ☐(待办)项,因为 Word 无法显示 HTML 中的复选框 |
| 表格 | 细边框、每页重复显示的粗体标题行,以及 Markdown 中的列对齐方式 |
[链接](https://example.com) | 可点击的超链接 |
`行内代码` 和围栏代码块 | 等宽字体;代码块保留换行 |
> 块引用 | 左对齐段落,每层嵌套缩进一级 |
--- 水平分隔线 | 横跨页面的一条线 |
[^1] 脚注 | 上标数字,注释以编号列表形式置于文档末尾的一条线之后(并非 Word 脚注) |
 | 浏览器可获取图片时嵌入图片;否则显示链接到图片的替代文本(参见限制) |
<kbd>、<mark>、<abbr> 和其他行内 HTML | 显示文本,其中 <kbd> 使用代码字体,<mark> 使用高亮样式 |
与 GitHub 一样,段落中的单个换行会合并到同一行,因此硬换行的文件会转换为普通段落。在行尾添加两个空格或一个反斜杠即可强制换行。
可选字体预设
转换默认使用 Word 的标准样式。从 样式 菜单中选择 中国公文,即可将生成的文档改为符合 GB/T 9704-2012《党政机关公文格式》的版式。(在中文页面上始终显示此菜单;在其他页面上,当粘贴的文本大部分为中文时也会显示。)每个级别都会设置一种东亚字体和一种公文字号,同时保留 Times New Roman:
| 级别 | 字号 | 汉字 | 拉丁字母和数字 |
|---|---|---|---|
| 正文 | 三号 (16pt) | 仿宋 | Times New Roman |
| 标题 1 | 二号 (22pt) | 方正小标宋简体 | Times New Roman |
| 标题 2 | 三号 (16pt) | 黑体 | Times New Roman |
| 标题 3 | 三号 (16pt) | 楷体 | Times New Roman |
| 标题 4 | 三号 (16pt) | 仿宋 (粗体) | Times New Roman |
| 标题 5-6 | 三号 (16pt) | 仿宋 | Times New Roman |
此预设还会设置页面:
- 纸张和页边距(5.1、5.2.1): A4 纸,上边距(天头)为 37mm、左边距(订口)为 28mm,正文区域(版心)为 156 × 225mm。
- 每页 22 行、每行 28 字(5.2.3): 设置 Word 文档网格,并将行距精确设为网格行距 28.95pt。关闭孤行控制,避免某一行被推到下一页,导致页面只剩 21 行。
- 缩进(7.3.3): 段落和标题下方的各级标题均首行缩进 2 个字符。表格单元格、列表项和代码块不缩进。
- 标题(7.3.1): 标题 1 居中。
- 间距: 所有级别的段前段后均为 0 行。
应用会在此浏览器中记住你的选择,并在你粘贴的文本大部分为中文时推荐此预设。
Word 会按字符类别分别确定字体,因此中文句子中的英文单词和数字仍使用 Times New Roman。打开文档的设备必须安装这些字体。部分设置超出了标准要求:
- 标准没有指定拉丁字体。拉丁字母和数字使用 Times New Roman 是常见做法。
- 标准规定使用小标宋体,并未特别指定方正小标宋简体。方正小标宋简体是方正的商业字体,大多数设备都没有安装;如果未安装,Word 会为标题替换其他字体。
- 标题 4,即标准中的三级标题(1.),设置为粗体;标准并无此要求,通常三级和四级标题都使用常规字重的仿宋。实际公文中通常会将这一级标题加粗。标题 5 和标题 6 保持常规字重,依靠编号((1)和 ①)突出显示,与印刷公文相同。
目前尚未添加页码(7.5),请参阅 #106。红色分隔线和其他版头要素也尚未添加,因为 Markdown 无法表达这些内容。
以编程方式设置:
import {
convertMarkdownToWord,
CHINESE_OFFICIAL_DOC_FONTS,
} from 'markdown-to-word';
const blob = await convertMarkdownToWord(markdown, {
fontPreset: CHINESE_OFFICIAL_DOC_FONTS,
});
如果同时传入 pageMargins,它会优先于预设的页边距;文档网格会根据文档最终采用的页边距进行调整。
隐私
转换完全在浏览器中进行:你的 Markdown 和 Word 文档不会离开你的设备。Markdown 链接的图片会像任何网页上的图片一样从其托管网站加载。md2word.app 使用无 Cookie 的 Cloudflare Web Analytics,并匿名统计转换次数(每次转换是否成功;如果失败,则统计失败原因、页面语言和启动方式;绝不收集内容、文件名、大小或任何可识别你身份的信息);本地副本或自托管副本均不会发送任何数据。预览中的原始 HTML 会经过清理,因此共享的文件无法运行脚本。请参阅隐私政策。
限制
- 仅当浏览器能够获取图片时才会嵌入图片:
data:URI,以及服务器允许跨源请求的网页 URL(大多数图片托管服务和 CDN 都允许)。其他图片(包括本地文件路径)会显示其替代文本;如果有图片 URL,则替代文本会链接到该 URL。 - 脚注会作为编号列表显示在文档末尾,而不会作为 Word 脚注显示在每页底部。
- 数学公式会保留为原样文本:
$x^2$会显示为$x^2$,而不是公式。 - 不会转换
:tada:这类 Emoji 短代码;请直接粘贴 Emoji 本身。 - 指向同一文档中标题的链接(
[see below](#usage))在 Word 中不会跳转。 <details>部分会被展开:摘要和隐藏内容都会以普通段落的形式显示。- Markdown 中复杂的原始 HTML 可能无法正确转换,也不会生成高级 Word 功能(批注、修订跟踪、页面布局)。
- 由于所有处理都在浏览器中进行,超大文档可能会运行缓慢。文件大小限制为 5 MB。
- 本网站可在当前版本的 Chrome、Edge、Firefox 和 Safari 中运行。端到端测试在 Chrome 中运行。
命令行
使用 npx 直接运行(下载并运行最新发布版本):
npx markdown-to-word report.md
也可以全局安装,以使用 md2w 命令:
npm install -g markdown-to-word
md2w report.md
它会在输入文件旁写入 .docx 文件,并使用相同的名称(report.md 会变成 report.docx);如果文件已存在,则会替换该文件,并将写入位置打印到 stderr。它需要 Node 22.12 或更高版本;如果文件缺失或为空,则会显示消息并以状态码 1 退出。
要从 stdin 读取 Markdown,请将 - 作为文件传入,或者省略文件并通过管道传入 Markdown。此时没有可用的文件名,因此必须指定 -o:
cat reply.md | md2w -o reply.docx
md2w - -o - < report.md > report.docx
选项:
-o, --output <file>:将.docx写入<file>,并按需创建文件夹。-o -会将其写入 stdout。--font-preset <name>:使用字体预设重新设置文档样式。chinese-official是 可选字体预设 中介绍的中文公文样式。-q, --quiet:除错误外,不向 stderr 打印任何内容。-V, --version:打印版本号。
MCP 服务
md2w mcp 会在标准输入/输出上运行本地 Model Context Protocol 服务,让 AI Agent 可以在你的机器上将 Markdown 转换成 Word 文档。和网站一样,它绝不会上传任何内容:服务会在进程内完成转换,并将 .docx 写入磁盘。
在 Claude Desktop 中只需单击一次:下载 markdown-to-word.mcpb,然后双击。Claude Desktop 会将其安装为扩展。你不需要 Node 或终端,因为 Claude Desktop 已内置 Node。
将其添加到 Claude Code:
claude mcp add markdown-to-word -- npx -y markdown-to-word mcp
或者添加到任何接受 JSON 配置的 MCP 客户端:
{
"mcpServers": {
"markdown-to-word": {
"command": "npx",
"args": ["-y", "markdown-to-word", "mcp"]
}
}
}
它提供一个工具:convert_markdown_to_word:
markdown或path(必须且只能填写其中一项):Markdown 字符串,或 Markdown 文件的路径(.md、.markdown、.mdown或.txt)。建议使用绝对路径;相对路径将相对于服务的工作目录解析。output_path(必填):.docx文件的写入路径;必须以.docx结尾。缺失的文件夹会自动创建。overwrite:如果output_path已存在,则替换它。默认关闭,因此工具会拒绝覆盖现有文件并说明原因。font_preset:使用chinese-official表示公文样式;省略则使用 Word 默认样式。
它会返回 output_path、文件大小(以 bytes 为单位)以及任何 warnings(未下载的远程图片,或不得不跳过的 .docx 补丁),并将这些内容作为结构化内容返回。
Agent 可能会遵循它从文档或网页中读取的指令,因此该工具限制了可被诱导执行的操作:它只读取 Markdown 文件,只写入 .docx 文件,绝不通过符号链接写入,也绝不在未获请求的情况下替换文件。它也绝不下载远程图片,因为文档中的 URL 可能指向任何位置,包括你自己的网络:这些图片会以链接形式显示在文档中。若 Agent 需要嵌入图片,可以自行获取图片,并以 data: URI 的形式将其放入 Markdown。由你运行的 CLI 没有这些限制,并且会像网站一样嵌入远程图片。
在浏览器中,md2word.app 会注册同一转换功能作为 WebMCP 工具 convert_markdown_to_docx(接受 markdown,以及可选的 filename 和 font_preset),供支持它的浏览器中的 Agent 使用。它会像粘贴内容一样在当前标签页中运行,在页面上显示结果,并以 base64 格式返回 .docx。页面还会尝试下载文件;如果没有人点击,浏览器可能会阻止下载。
在代码中使用
该转换器也已发布到 npm,包名为 markdown-to-word,适用于 Node 22.12+,也可通过打包工具(Vite、webpack、esbuild)在浏览器中使用:
npm install markdown-to-word
convertMarkdownToWord 会以 Blob 形式返回 .docx:
import { writeFile } from 'node:fs/promises';
import { convertMarkdownToWord } from 'markdown-to-word';
const blob = await convertMarkdownToWord('# Hello\n\nFrom **Markdown**.', {
pageMargins: { top: 1, right: 1, bottom: 1, left: 1 }, // inches
});
await writeFile('hello.docx', Buffer.from(await blob.arrayBuffer()));
在浏览器中,使用 URL.createObjectURL(blob) 将 Blob 交给下载链接。
转换器需要 DOM 中的 DOMParser 和 XMLSerializer。浏览器已提供这两个对象;在 Node 中,如果缺少它们,软件包会通过 jsdom 将其设为全局对象,因此无需进行任何设置。
该软件包还导出了 parseMarkdownToHtml、extractTitle、FONT_PRESETS(参见可选字体预设)以及相应的 TypeScript 类型。parseMarkdownToHtml 会原样传递未经清理的 HTML,因此在将其输出放入页面之前,请先进行清理(例如使用 DOMPurify)。
在服务器上,应将用户提供的 Markdown 视为不可信内容:转换器会下载每张远程图片()并将其嵌入文档,因此请求会从你的服务器发出(每份文档最多处理 100 个不同的 http(s) URL,每个最大 10 MB,同时最多处理 4 个)。如果服务器能够访问内部地址,请先移除图片 URL 或将其加入允许列表。
开发
需要 Node.js 22.12 或更高版本(.nvmrc 指定了 CI 使用的版本)。
git clone https://github.com/benbalter/markdown-to-word-js.git
cd markdown-to-word-js
npm install
npm run dev # http://localhost:4321
npm run build # static site in dist/
npm test # unit tests; npm run test:e2e for Playwright
有关项目结构和检查项,请参阅 CONTRIBUTING.md。
- **网站:**使用 Astro 和 Tailwind CSS,并采用 word2md.com 的设计系统。
- **转换:**使用 marked 将 Markdown 转换为 HTML,使用 @turbodocx/html-to-docx 生成
.docx,并通过 JSZip 修复代码块、分隔线、表格标题和字体预设。 - **翻译:**UI 已支持添加更多语言;请参阅 web/i18n/README.md。
- **托管:**Cloudflare Workers Static Assets。推送到
main后会进行构建、运行测试并部署;请参阅 docs/cloudflare.md。
贡献
欢迎贡献。请参阅 CONTRIBUTING.md,并针对 Bug 和功能请求提交问题。
许可证
MIT。请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。