空窗期开源:将 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 解析器
相关推荐
IT_陈寒5 小时前
React性能优化踩的坑,这个错你可能也会犯
前端·人工智能·后端
zhangxingchao5 小时前
AI应用开发三:RAG技术与应用
前端·人工智能·后端
摘星小杨5 小时前
如何在前端循环调取接口,实时查询数据
开发语言·前端·javascript
Hilaku6 小时前
从搜索排名到 AI 回答? 先聊一聊 AI 可见度工具 BuildSOM !
前端·javascript·程序员
zzmgc46 小时前
纯静态 + Web Worker + 虚拟滚动:我是怎么让浏览器吃下 10MB JSON 不卡的
前端·架构
辰同学ovo6 小时前
用 Chrome DevTools MCP 给 AI 写的页面做“质检“
前端·人工智能·chrome devtools
乌托邦6 小时前
uni-mini-ci:让 uniapp 小程序构建后自动预览和上传
前端·vue.js·uni-app
豹哥学前端6 小时前
前端工程化实战:从包管理到 Vite 配置,一套下来全明白
前端·javascript·vite
网安小白6 小时前
如果解决github域名解析问题
前端
葬送的代码人生6 小时前
用一句 Prompt 十分钟搓出完整应用
前端·html·ai编程