空窗期开源:将 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 分钟前
Kestrel:.NET 的高性能 Web 服务器探秘
服务器·前端·kestrel·.net·net core·web-server·asp.net-core
吃吃喝喝小朋友19 分钟前
HTML DOM
前端·javascript·html
HWL567919 分钟前
HTML中,<video> 和 <source> 标签
前端·javascript·html
球球不吃虾20 分钟前
分享一个简单的交互式塔罗牌抽牌应用
前端·vue
2501_9481201521 分钟前
中职动漫设计与制作专业实训方案研究
前端·人工智能·语言模型·自然语言处理·架构
小小鸟00822 分钟前
前端 RBAC基于角色的权限控制(按钮级别)
前端
学习java的小库里23 分钟前
EasyExcel复杂导出
java·前端
muddjsv24 分钟前
前端开发通用全流程:从需求到上线,步步拆解
前端
Mr Xu_30 分钟前
从零实战!使用 Mars3D 快速构建水利监测 WebGIS 系统
前端·3d·webgis
wuhen_n33 分钟前
类型断言:as vs <> vs ! 的使用边界与陷阱
前端·javascript·typescript