使用技巧约 2 分钟阅读

不装 Pandoc 和 LaTeX,把 Markdown 转成 PDF

Markdown 转 PDF 不需要 Pandoc 或 LaTeX:上传 .md 文件,得到 A4 页面。表格和任务列表会排出来,脚注、公式和 Mermaid 不会。

PDF123 团队 · 更新于 2026-11-03

把 .md 文件上传到 Markdown 转 PDF,下载一份 A4 的 PDF。本机不用装任何东西,服务端也没有用 Pandoc 或 LaTeX:它解析 CommonMark,转成 HTML,再交给 WeasyPrint 打印。测试时,一份带表格、删除线和任务列表的笔记转出来是一页,三样都画出来了;脚注、emoji 短代码、公式和 Mermaid 图则原样以你输入的文字出现。

怎样不用 Pandoc 或 LaTeX,把 Markdown 转成 PDF?

在网站上选好 .md 文件,点处理即可。这个页面没有纸张大小、主题或字体的选项。用脚本时,把文件作为 fileInput 发给端点:

curl -X POST https://pdf123.xyz/api/v1/convert/markdown/pdf \
  -F [email protected] \
  -o notes.pdf

用 pdfx 命令行(用 npm install -g @pdf123/cli 安装):

pdfx markdown-to-pdf notes.md -o notes.pdf

两条命令都于 2026-10-23 在本机运行的一份服务器上执行过,第一条里的地址换成了 https://pdf123.xyz。curl 返回 HTTP 200,content-type: application/pdf。pdfx 输出 notes.pdf 并以 0 退出。pdfinfo 报告 1 页,595.276 x 841.89 点,即 A4,Producer 字段是 WeasyPrint 70.0。结果按上传的文件名命名:notes.md 得到 notes.pdf。

哪些内容能排出来,哪些保持原样

测试文件里有标题、粗体和斜体、表格、删除线、任务列表、围栏代码块、脚注、emoji 短代码、公式、Mermaid 块和一行 <script>。我用 pdftotext 提取结果里的文字,并看了页面的渲染图来核对。

Markdown 里写的 PDF 里的样子
标题、粗体、斜体、行内代码 正常排出
表格 排出,有单元格边框和浅灰表头行,标了右对齐的列数字靠右
~~删除线~~ 排成带删除线的文字
- [x] 和 - [ ] 任务列表 排出,已完成是填充的方框,未完成是空方框
围栏代码块 排在灰色方框里,没有语法着色
脚注([^1] 及其定义) 没有转换:[^1] 留在句子里,定义行作为一行普通文字打印
emoji 短代码(:smile:) 没有转换:原样打印 :smile:
公式($E = mc^2$) 没有排版:原样打印
标注为 mermaid 的围栏块 没有画图:作为代码块打印源码
<script> 标签 没有运行,它的文字也没有出现在页面上

表格、删除线和任务列表是 GitHub Flavored Markdown 规范在 CommonMark 之上列出的扩展(章节“Tables (extension)”“Strikethrough (extension)”和“Task list items (extension)”)。转换器打开的就是这三项。它解析的基础是 CommonMark 规范。其他 Markdown 工具各自添加的语法,一律不转换。

长表格会保留表头。一个 90 行、两列表头的表格打印成 4 页,pdftotext 在第 2、3 页顶部也找到了表头行。想了解反方向,以及来回转换后保留什么,见从 Markdown 到 PDF 再回来:格式转换保留什么。

页面尺寸、页边距和字体是怎么定的?

页面是 A4,页边距 2 cm,正文 11 pt,行高 1.6,颜色是接近黑色的 #111。这些值是固定的。在 144 dpi 下测量渲染出的测试页,最左的墨迹离左边缘 62.5 pt,最右的离右边缘 63.5 pt。比 2 cm(56.7 pt)多出约 6 pt,正好是默认的 8 px 正文外边距,内置样式表没有把它清零。

字体列表以 Noto Sans CJK 和其他 CJK、阿拉伯文、泰文、天城文字体族开头,后面是 Noto Sans 和 DejaVu Sans。PDF 里嵌入的是服务器上实际有的那一个。在我的测试机上,pdffonts 列出的是 Hiragino Sans,所以 pdf123.xyz 上的字体可能与我看到的不同。转换器还会检查你的文字,把文档语言设为英文、简体或繁体中文、日文、韩文、阿拉伯文、泰文或印地文,阿拉伯文从右向左排。一份用简体中文写成、同一句里夹着英文单词和数字的测试笔记,转出来是一页,提取出的文字与输入一致。如果你用的文字,服务器上可能没有对应字体,请检查输出里有没有空方框。

需要别的纸张大小、页边距或字体,这里没有设置项。可以自己把 Markdown 转成 HTML,加上自己的 CSS,再用 HTML 转 PDF,它会按你的 CSS 要求的页面大小和页边距打印。

图片怎么处理?

只上传一个 .md 文件时,带过去的只有文字,所以 images/logo.png 这样的本地路径没有东西可加载。测试里,![local](images/logo.png) 打印出替代文字 local,没有图片。公开的 http 或 https 地址可以加载:一张来自公开网站的图片被嵌入,尺寸 72 x 48 像素。私有或内部网络的地址会被拦截,调用仍然返回 200,页面上是替代文字、没有图片,所以图片重要时请检查页面。

要用本地图片,就向 API 发一个 ZIP。ZIP 只渲染一个 Markdown 文件:压缩包根目录有 index.md 就用它,否则用转换器遍历文件夹时找到的第一个 .md。有多个 .md 都可能被选中时,把想要的那个命名为 index.md。图片路径从压缩包根目录算起,不是从 .md 所在的文件夹算起:

curl -X POST https://pdf123.xyz/api/v1/convert/markdown/pdf \
  -F [email protected] \
  -o a.pdf

第一个测试里,a.zip 含 index.md 和 images/logo.png,index.md 指向 images/logo.png,结果是一页 A4,嵌入了一张 300 x 120 的图片。第二个测试里,b.zip 含 docs/guide.md 和 docs/logo.png,引用 logo.png(相对于文件)只打印出替代文字,引用 docs/logo.png(相对于压缩包根目录)则嵌入了图片。工具页和 pdfx 只接受 .md;pdfx markdown-to-pdf a.zip -o a.pdf 停在了 accepts .md files, but "a.zip" is .zip,退出码 2。ZIP 需要像上面那样直接调用 API。

有三种输入会被拒绝,返回 HTTP 400,reason 为 unsupported_file_type:文件名既不是 .md 也不是 .zip(The file must be Markdown (.md) or a ZIP archive.)、.md 不是 UTF-8 文本(The Markdown file is not valid UTF-8 text.)、ZIP 里没有 .md(The ZIP archive must contain a .md file.)。响应体与其他调用一样是 application/problem+json,见错误码。

常见问题

能改页面大小或页边距吗?

这个工具不能。A4 加 2 cm 页边距是内置的。要别的尺寸,用 HTML 转 PDF,写自己的 @page 规则。

支持脚注、公式和 Mermaid 图吗?

不支持。测试里,脚注标记、emoji 短代码和公式都原样打印,Mermaid 块打印成代码块。图或公式请先自己渲染好,作为图片放进 ZIP。

Markdown 里夹的 HTML 里的 JavaScript 会运行吗?

不会。测试文件里的 <script> 行没有运行,也没有往页面里添加任何内容。WeasyPrint 打印 HTML 和 CSS,没有 JavaScript 引擎。

为什么我上传的 .md 返回了 400?

三种原因都在上面讲图片的那一节:文件名、不是 UTF-8 的文件,或者里面没有 .md 的 ZIP。把文件另存为 UTF-8,再检查扩展名。

打开工具
在浏览器里完成处理,不加水印,文件处理完就会删除。
打开工具