空窗期开源:将 Markdown 文件转换为 DOCX 格式,支持浏览器和 Node.js 环境。

markdown-docx

之前做一款AI产品,导出docx文档都是依赖后端实现的,找了几圈,也没找到适合的轮子,现在工作节奏慢了下来,就抽时间写了这样一个工具,如果你有类似需求,希望能帮你节约一些时间。😀

在线演示

Markdown 转 DOCX 转换器md-docx.vace.me

功能特性

  • 📝 高保真 Markdown 转 DOCX 格式
  • 🖼️ 支持图片(自动下载)
  • 📋 支持表格、列表、代码块等 Markdown 元素
  • 🔗 支持超链接与脚注
  • 💅 可自定义样式
  • 🌐 同时支持浏览器与 Node.js 环境
  • 🖥️ 提供命令行工具

安装

bash 复制代码
# 使用 npm
npm install markdown-docx

# 使用 yarn
yarn add markdown-docx

# 使用 pnpm
pnpm add markdown-docx

基础用法

Node.js

javascript 复制代码
import fs from 'node:fs/promises';
import markdownDocx, { Packer } from 'markdown-docx';

async function convertMarkdownToDocx() {
  // 读取 Markdown 内容
  const markdown = await fs.readFile('input.md', 'utf-8');
  
  // 转换为 DOCX
  const doc = await markdownDocx(markdown);
  
  // 保存文件
  const buffer = await Packer.toBuffer(doc);
  await fs.writeFile('output.docx', buffer);
  
  console.log('转换完成!');
}

convertMarkdownToDocx();

浏览器环境

javascript 复制代码
import markdownDocx, { Packer } from 'markdown-docx';

async function convertMarkdownToDocx(markdownText) {
  // 转换为 DOCX
  const doc = await markdownDocx(markdownText);
  
  // 生成下载文件
  const blob = await Packer.toBlob(doc);
  
  // 创建下载链接
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = 'document.docx';
  a.click();
  
  // 清理资源
  URL.revokeObjectURL(url);
}

// 示例:配合文本域使用
document.getElementById('convert-btn').addEventListener('click', () => {
  const markdown = document.getElementById('markdown-input').value;
  convertMarkdownToDocx(markdown);
});

高级用法

使用 MarkdownDocx 类

通过 MarkdownDocx 类实现更精细的控制:

javascript 复制代码
import { MarkdownDocx, Packer } from 'markdown-docx';
import fs from 'node:fs/promises';

async function convertWithOptions() {
  const markdown = await fs.readFile('input.md', 'utf-8');
  
  // 创建带配置的转换器
  const converter = new MarkdownDocx(markdown)
  
  // 生成文档
  const doc = await converter.toDocument({
    title: '我的文档',
    creator: 'markdown-docx',
    description: '由 Markdown 生成'
  });
  
  // 保存文件
  const buffer = await Packer.toBuffer(doc);
  await fs.writeFile('output.docx', buffer);
}

配置选项

MarkdownDocx 构造函数和 markdownDocx 函数接收如下配置参数:

选项 类型 默认值 说明
imageAdapter 函数 内置适配器 自定义图片处理器
ignoreImage 布尔值 false 是否忽略图片
ignoreFootnote 布尔值 false 是否忽略脚注
ignoreHtml 布尔值 false 是否忽略内联 HTML
gfm 布尔值 true 启用 GitHub 风格 Markdown

同时支持 marked 库的额外配置选项。

命令行工具

提供 CLI 工具进行文件转换:

bash 复制代码
# 全局安装
npm install -g markdown-docx

# 基础用法
markdown-docx --input input.md --output output.docx

# 简写形式
markdown-docx -i input.md -o output.docx

未指定输出文件时,默认使用输入文件名并添加 .docx 后缀。

支持的 Markdown 特性

  • 标题(H1-H6)
  • 段落与换行
  • 强调(粗体、斜体、删除线)
  • 列表(有序/无序)
  • 链接与图片
  • 引用块
  • 语法代码块
  • 表格
  • 水平分隔线
  • 脚注
  • 任务列表(复选框)

图片适配器

内置自动下载图片的适配器,可通过实现 ImageAdapter 接口创建自定义适配器。 适配器需包含 getImage 方法,接收图片 URL 并返回包含图片数据的 Promise。

ts 复制代码
const imageAdapter: (token: Tokens.Image) => Promise<null | MarkdownImageItem>

样式定制

通过样式组件自定义 DOCX 外观:

javascript 复制代码
import { styles, colors, classes, numbering } from 'markdown-docx';

// 示例:修改超链接颜色
styles.default.hyperlink.run.color = '0077cc';
styles.markdown.code.run.color = '000000';

可参考 src/styles 目录下的文件编写自定义样式:

浏览器与 Node.js 差异

根据运行环境自动选择图片适配器:

  • 浏览器环境使用 Fetch API
  • Node.js 环境使用内置 HTTP/HTTPS 模块

示例

更多示例请查看仓库中的 tests 目录

相关项目

  • docx - DOCX 生成底层库
  • marked - 本项目使用的 Markdown 解析器
相关推荐
网络点点滴8 小时前
Vue3中toRaw和MarkRaw
前端·javascript·vue.js
李松桃8 小时前
01HTML-CSS-入门知识点
前端·css
广州华水科技8 小时前
北斗GNSS变形监测系统是什么?主要有哪几种应用?
前端
晴天168 小时前
【跨桌面应用开发】Neutralinojs快速入门指南
前端·javascript·electron·node.js
爱学习的程序媛9 小时前
【Web前端】深入解析JavaScript异步编程
开发语言·前端·javascript·ecmascript·web
梧桐1689 小时前
马克沁机枪上阵(二):前线开辟—Claude Code 如何用一天打通前端
前端
是上好佳佳佳呀9 小时前
【前端(一)】HTML 知识梳理:从结构到常用标签
前端·html
楚轩努力变强9 小时前
2026 年前端进阶:端侧大模型 + WebGPU,从零打造高性能 AI 原生前端应用
前端·typescript·大模型·react·webgpu·ai原生·高性能前端
放下华子我只抽RuiKe59 小时前
深度学习 - 01 - NLP自然语言处理基础
前端·人工智能·深度学习·神经网络·自然语言处理·矩阵·easyui
酉鬼女又兒10 小时前
零基础入门前端 第十三届蓝桥杯省赛 :水果拼盘 Flex一篇过(可用于备赛蓝桥杯Web应用开发)
前端·css·职场和发展·蓝桥杯·css3