首页/Markdown/Markdown 导出格式转换

Markdown 导出格式转换

一份 Markdown 导出成四种格式:.docx 文档、PDF(系统打印)、PNG / JPEG 长图、HTML 网页,全程在浏览器里完成。

四种格式走的是同一套渲染与净化:上面预览里看到什么,导出来就是什么。图片只取站内地址或 Base64 内嵌,外站图片不会被抓取,也不会出现在导出文件里。

正在载入工具…

这一页在做什么:Markdown 导出格式转换

.docx 是自己拼出来的:docx 本质是一个 zip 包里装几份 OOXML([Content_Types].xml、_rels/.rels、word/document.xml、word/styles.xml),本页按解析出的块结构直接生成这些 XML,再用站内早已自托管的 JSZip 打包,没有引入任何新的第三方转换库。标题用 Word 内建的 Heading 1–4 样式(能进目录与导航窗格),粗体 / 斜体 / 删除线 / 行内代码 / 链接 / 表格 / 代码块 / 引用 / 任务框 ☑☐ 都有对应写法。

列表符号是写进文字里的(- 项 而不是 Word 的自动编号)。代价是在 Word 里不能一键改成自动编号,换来的是 Word / WPS / Pages / Google Docs 打开都不跑版——导出场景里「打开不跑版」比「可再编辑列表」更重要。

图片以「嵌入文件」形式进 docx:Base64 图片直接解码成字节,站内相对路径走同源读取,外站地址一律不抓取(与预览同一口径)。实测一份含 1 张站内图 + 1 张外链图 的文档导出为 7,228 B,用 macOS 自带的 OOXML 解析器 textutil 读回:段落 27、表格 1 张、图片 1 张都在。

长图走「净化 HTML → SVG foreignObject → canvas → 位图」,不装 html2canvas:先离屏量出内容高度,把同一段 HTML 塞进 SVG 的 foreignObject,画到 canvas 再 toBlob。实测 305 字符、含 1 张站内图 的文档在 760px 宽 × 2× 倍率下出图 1,632×1,552、195 KB,耗时 1,079 ms。浏览器画布有约 1677 万像素的硬上限,超了本页会直接报错并提示调小宽度或倍率,而不是给你一张空白图。

PDF 用系统打印面板:把净化后的正文连同一段内嵌样式写进隐藏 iframe,调用它的 print(),你在面板里选「另存为 PDF」。样式按 A4、页边距 14mm 排,标题 / 表格 / 代码块设了不跨页断开。本页不生成二进制 PDF:那需要 jsPDF 一类库,而中文要么内嵌几十 MB 字体、要么整页变成不可复制的图片,两条路都不划算。

HTML 导出与「Markdown 转 HTML」是同一套净化输出(可选完整网页或纯片段),导出文件里的样式是内嵌的,换台电脑双击打开也不掉格式。

输入内置示例文档(含表格、代码块、任务列表、站内图片与 Base64 图片)本地处理
操作实测结果
导出 .docx305 字符(含表格、代码块、任务列表、站内图与外链图)→ 7,228 B,64 ms;zip 六件 CRC 全对,word/media/image1.png 是原图 3,972 B;textutil 读回 27 段 / 1 表 / ☑☐ 都在
导出 PNG 长图760px × 2× → 1,632×1,552 PNG,200,060 B,1,079 ms;站内图按量好的版面位置叠进画布,外链图留「外链图片未加载」占位
导出 JPEG 长图同一文档同一档位 → 1,632×1,552 JPEG,105,603 B(比 PNG 小 47%),1,071 ms
导出 HTML305 字符 → 3,124 B 完整网页(样式内嵌);全文 0 个