空窗期开源:将 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 解析器
相关推荐
大熊猫今天吃什么19 分钟前
【一天一坑】空数组,使用 allMatch 默认返回true
前端·数据库
!win !40 分钟前
Tailwind CSS一些你需要记住的原子类
前端·tailwindcss
前端极客探险家1 小时前
打造一个 AI 面试助手:输入岗位 + 技术栈 → 自动生成面试问题 + 标准答案 + 技术考点图谱
前端·人工智能·面试·职场和发展·vue
橘子味的冰淇淋~1 小时前
【解决】Vue + Vite + TS 配置路径别名成功仍爆红
前端·javascript·vue.js
利刃之灵1 小时前
03-HTML常见元素
前端·html
kidding7231 小时前
gitee新的仓库,Vscode创建新的分支详细步骤
前端·gitee·在仓库创建新的分支
听风吹等浪起2 小时前
基于html实现的课题随机点名
前端·html
leluckys2 小时前
flutter 专题 六十三 Flutter入门与实战作者:xiangzhihong8Fluter 应用调试
前端·javascript·flutter
kidding7232 小时前
微信小程序怎么分包步骤(包括怎么主包跳转到分包)
前端·微信小程序·前端开发·分包·wx.navigateto·subpackages
微学AI2 小时前
详细介绍:MCP(大模型上下文协议)的架构与组件,以及MCP的开发实践
前端·人工智能·深度学习·架构·llm·mcp