如何将 Markdown 转换为 PDF
三个步骤。一切都在你的浏览器中进行。
粘贴或拖放
把你的 markdown 粘贴到文本框中,或拖放一个 .md 文件。实时预览会显示输出的样子。
选择选项
页面尺寸、方向、正文字体大小和代码块样式。默认设置适用于大多数 README。
创建并下载
marked 解析成 HTML,HTML 被分词成块,pdf-lib 进行排版——全部在你的标签页中完成。
为什么在 imisspdf 上使用 Markdown转PDF?
源文件留在你的机器上
Markdown 经常包含内部笔记、博文草稿,或代码块中的 API 密钥。没有任何内容被上传——整个过程的每一个字节都在本地运行。
对技术文档很快
标题、列表和围栏代码会一目了然地干净渲染。没有打印对话框,没有 Chrome 截图——粘贴、点击、下载。
兼容 GFM
删除线、任务列表、围栏代码块、自动链接——解析器是 GFM 模式下的 marked。表格会被压平(我们提前说明)。
“Markdown转PDF”在这里意味着什么
Markdown 是大多数开发者和技术写作者真正用来撰写内容的格式——README 文件、博客草稿、运行手册(runbook)、API 文档、内部 wiki。它轻量、 可纳入版本管理,并能在 GitHub 上干净地渲染。但当需要把那份文档分享给 不在你仓库里工作的人时,PDF 往往是合适的交付格式:它打印效果可预测, 在任何设备上都能打开,而且不依赖于收件人是否安装了 markdown 查看器。
imisspdf 的 Markdown转PDF 工具会接收你粘贴的(或作为 .md 文件拖放的)markdown 源,并在你的浏览器中生成一个单独的 PDF。 标题会保留其层级,列表会保持缩进,围栏代码块会以等宽字体渲染, 引用 / 水平分隔线看起来就像引用和分隔线。结果是一个干净、不花哨的 PDF, 适合作为交付给非技术读者的 README、技术报告或变更日志。
转换是如何工作的
三个阶段从头到尾都在你的标签页中运行:
- marked 解析器在启用 GFM 规则(围栏代码、删除线、任务列表、自动链接)的情况下把你的 markdown 转换为 HTML。
- 一个基于正则表达式的小型分词器遍历该 HTML,把它转换成一连串扁平的块级标记——标题、段落、列表、代码块、引用——以及它们的内联片段(粗体、斜体、内联代码、链接)。
- pdf-lib 使用 14 种标准 PDF 字体(正文用 Helvetica,代码用 Courier)把这些块排版到页面上。当内容溢出时会添加新页面。
这个过程中没有任何环节与服务器通信。没有远程渲染的 markdown, 没有在云函数里启动的无头 Chromium,也没有“为符合保留要求保留一小时” 的临时文件。PDF 是用 JavaScript 字节构建的,你可以在你的 DevTools 里 看着它们被写出来。
什么时候用这个工具合适——什么时候不合适
当你需要一份干净、可归档的技术内容 PDF 时,这个工具就很合适:一个 README、一份运行手册、一份用 markdown 写的报告、会议笔记、一篇教程。 对于这类文档,它会按你期望的方式处理内联格式、列表、代码和引用。
当你需要与已渲染网站达到像素级的一致时(请在已渲染的页面上使用浏览器 的“另存为 PDF”),当你需要有排版品质的表格时(请在本地使用 Pandoc + LaTeX),或当你需要带语法高亮的代码时(请从你的编辑器导出为 HTML 并 使用 HTML 转 PDF),它就是错误的工具。我们提前点明这些局限, 好让你选择正确的工作流程。
隐私与安全
Markdown 是最有可能包含你不希望放到服务器上的内容的格式之一:代码块里 的 API 密钥、链接里的内部 URL、你尚未发布的博文草稿、会议笔记里的客户 名称。基于服务器的 markdown 转 PDF 工具不得不摄取这一切。这个工具的 架构意味着你无需信任某份隐私政策——它的流程里根本就没有上传步骤。 屏蔽你的网络,页面加载之后转换照样能工作。
常见问题
支持——解析器以 GFM 模式运行,因此围栏代码块(用 ``` 反引号)、删除线(~~文本~~)、任务列表、自动链接以及 GFM 宽松的段落规则都能正常工作。无法在转换中保留的是表格:marked 会生成一个 HTML <table>,但本工具中的 PDF 渲染器不会绘制表格单元格,所以表格会被压平为纯文本行。如果你的 README 大量依赖表格,请先在 GitHub 中渲染该页面,然后使用 HTML 转 PDF,或者对其截图以获得真正的网格输出。
不会。代码块会以等宽的 Courier 字体、单一颜色渲染,以便代码的缩进和结构保持清晰可读,但不会按语言为标记着色。我们刻意跳过语法高亮,因为那会迫使在一个主要任务是转换为 PDF 的页面上加载一个 200 KB 以上的高亮库,而 PDF 通常是用来打印或归档的——不像在 IDE 里那样阅读。如果带颜色的代码很重要,请改为把编辑器里高亮过的 HTML 通过我们的 HTML 转 PDF 工具粘贴进来。
外部图片标签()会被丢弃——本工具不会去抓取远程图片。这是刻意为之,原因有二:隐私(抓取会把你的 IP 和 referer 泄露给图片托管方)和可靠性(依赖网络的渲染意味着输出不一致)。如果你需要在 PDF 中嵌入图片,请使用 JPG 转 PDF 或 PNG 转 PDF 工具把它们作为单独的页面添加进来,或者用“合并 PDF”把它们与 Markdown 渲染出的 PDF 合并。
不会。Markdown 源和渲染出的 PDF 都完全停留在你的浏览器标签页内。marked 解析器、HTML 到块的分词器以及 pdf-lib 都是客户端 JavaScript,只在本页加载一次,然后在本地运行。你可以在浏览器开发者工具的网络标签页中确认——页面加载之后,生成 PDF 不会产生任何对外的网络请求。关闭标签页后所有痕迹都会消失;因为没有服务器步骤,所以也不存在服务器端临时文件。
全部六个 Markdown 标题级别(# 到 ######)都会渲染为尺寸递减的 PDF 标题(h1 最大,h6 几乎只比正文略大)。层级会被保留,以便屏幕阅读器和 PDF 阅读器能够识别出大纲。在标题内部,内联格式(粗体、斜体、内联代码)会被遵循。我们不会自动生成目录——如果你的文档需要目录,请自行添加一个“## 目录”小节,配上一个简单的 Markdown 列表。
不支持其网格形式。marked 会把表格正确地解析为 HTML,但我们的 PDF 渲染器是一个刻意保持简单的渲染器,不会绘制单元格边框或分配列宽。表格会被逐行输出为一连串文本行,对于超过 2x2 的示例来说通常都难以阅读。如果表格对你的文档至关重要,诚实的做法是:在你喜欢的预览器中渲染成 HTML,截图,然后使用 JPG 转 PDF——或者在本地使用 Pandoc 以获得 LaTeX 级别的完整输出。我们坦率地说明这一局限,而不是假装去拙劣地渲染表格。
获得良好输出的技巧
- 使用真正的标题。行首的一个
#会变成 h1;更低的级别会干净地嵌套。PDF 阅读器和屏幕阅读器都能识别出大纲。 - 保留围栏代码块。三反引号的代码块会以 Courier 渲染,这样即使发生换行,缩进也能正确显示。
- 避免图片过多的 markdown。外部图片不会被下载。请单独把图片转换为 PDF 再合并它们。
- 对于表格,先在你的工具里渲染 markdown,然后截图。或者在本地使用 Pandoc 以获得有排版品质的表格。