Markdown 转 PDF 和图片:图片版与文字版 PDF、A4 页边距、分页和中文乱码

更新于 6 分钟阅读

一份 .md 文件没法直接发给客户、传到工单里或者打印出来。常规做法是导出成 PDF 或图片,真正影响结果的选择都发生在点”导出”之前:用哪种 PDF、什么页面尺寸、页边距多宽、每一页的底部会发生什么。

两种 PDF,看起来一样,行为不同

本站的 Markdown 查看与导出工具提供两种 PDF 格式,生成方式不同,各自解决不同的问题。

PDF(图片,外观完全一致)PDF(文字可选中,经打印生成)
生成方式先把页面画到画布上,存成 JPEG,再放进 PDF由浏览器自带的打印引擎直接写出 PDF
文字能否选中、搜索不能能
链接能否点击不能一般可以
与预览是否一致一致,因为它就是预览的一张图接近,但分页由打印引擎重新排版
文件大小随页数和像素密度增大较小
长文档受画布大小限制没有这个限制
操作一键,直接下载弹出打印对话框,需要选”另存为 PDF”

给人看、要原样转发的东西,比如一页报告或者排好版的笔记,选图片版 PDF,它能保证和预览一模一样。需要搜索、复制其中的文字,要给读屏软件读,或者页数很多的文档,选文字版 PDF。文字版会打开打印对话框:目标选”另存为 PDF”,同时关闭”页眉和页脚”,否则浏览器会在每页上加日期和网址。

页面尺寸与页边距

尺寸单位是 CSS 像素,按每英寸 96 像素计算。A4 是 794 × 1123,US Letter 是 816 × 1056。“自适应高度”的几档(宽 800、390、768、1200 px)没有固定页高,只会得到一整页长图,适合在屏幕上看或者发给聊天软件,不适合打印:用它们生成的图片 PDF 是一张很长的页面(800 px 宽时为 600 pt 宽),而不是一叠 A4 纸。要打印,请选 A4 或 Letter。

页边距作用于四周,默认是 40 px,约合 1.06 厘米,打印时往往不够。1 厘米约等于 38 px,想要 2 厘米的边距就填 76。在文字版 PDF 里,同一个数值会成为 @page 的边距,所以预览中看到的设置就是打印时用的设置。如果打印对话框里也有”边距”选项,请保持”默认”,避免它覆盖页面里的设置。

分页:一行字被切成两半

固定高度的页面在页尾处会直接截断,如果没有任何东西阻止,常见后果是一行字被切成上下两半,或者标题孤零零留在页底。选项”固定高度分页时,把图片和文字整块移到下一页,避免被切断”就是解决这个问题的。打开后,横跨页边界的段落、列表项、代码块、图片或表格行会整块移到下一页,标题会和它后面的内容一起走。预览会在每个分页处画一条虚线并标出”第 N 页”,导出前就能检查。

有两个限制。一是比整页还高的块,比如特别长的代码清单,没法保持完整,仍然会被切开。二是没办法手动插入分页符:这个工具里的原始 HTML 是按文本显示的,所以写 <div style="page-break-after: always"> 只会在页面上多出一行可见的代码,而不会分页。想控制分页,只能通过调整标题和章节的长度,并盯着预览看。

原始 HTML 按文本显示还有第二个后果。GitHub 项目的 README 开头常有居中的 <p align="center"> Logo 块,导出时这段标记会原样印出来。导出前请把它改成 Markdown 图片,或者直接删掉。

长文档与”像素密度已降低”的提示

图片 PDF 和图片格式都是先把整篇文档画到同一张画布上再切成页,而浏览器的画布有尺寸上限,本页把单边上限设为 16384 px。在 2× 像素密度下,一页 A4 约 2246 px 高,所以超过大约七页就会越界;1× 时上限约为十四页。越界时工具会自动降低像素密度,并在状态栏提示,例如”像素密度已降到 1.45ד,长文档的画面会略微变软。如果长文档需要清晰的文字,请改用文字版 PDF,它没有这个限制。

像素密度本身也是一种取舍。2× 时,一页 A4 的有效分辨率是 192 dpi,屏幕上很清晰,用打印机输出也够用。调到 3× 或 4× 会让文件更大,也会让长文档更快碰到画布上限。

Markdown 转 PDF 中文乱码的真正原因

搜”Markdown 转 PDF 中文乱码”,遇到的多半是另一类工具的问题:pandoc 配合 LaTeX、一些编辑器插件、或者服务端渲染工具,需要你提供支持中文的字体文件,没有的话就是方框、问号或者整段空白。

浏览器里的导出是由浏览器自己绘制的,所以问题只剩一个:你的设备上有没有覆盖这些汉字的字体。工具的无衬线字体栈包含苹方(PingFang SC)、微软雅黑和思源黑体(Noto Sans CJK SC),衬线字体栈包含宋体(Songti SC、SimSun)和思源宋体(Noto Serif CJK SC)。Windows、macOS 和装了 CJK 字体的桌面 Linux 上,中文都能正常显示;在图片版 PDF 里,文字已经画进了图片里,阅读的人不需要安装任何字体。如果导出里出现空心方框,说明这台设备没有合适的字体,请安装一个,比如 Noto Sans CJK,而不是去改工具的设置。

顺便说一句,pandoc 配 LaTeX 引擎时,必须指定 CJK 字体才能输出中文,例如 --pdf-engine=xelatex -V CJKmainfont="Noto Serif CJK SC"。这个报错是那条工具链特有的,和浏览器导出无关。

文档里的图片

网页不能按路径去读你硬盘上的文件,所以本地图片要用”添加图片”、“添加图片文件夹”,或者直接粘贴截图,工具会按 Markdown 里写的文件名去匹配。如果文件夹里有 Markdown 文件,也会一起载入。匹配不上的图片会显示成虚线标签,状态栏会列出它们的名字。

别的网站上的图片,只有对方允许跨域读取时才能被抓取并嵌入;不允许的,会换成虚线标签。可以改用 data: 地址,或者使用会发送 CORS 头的图床。

主题与纸张

深色主题导出时会带着它的背景色,因为打印模式强制输出背景色。屏幕上好看,印在纸上却很费墨。要打印请选浅色、GitHub 或护眼纸张,深色主题留给只在屏幕上阅读的 PDF。

预览、复制和导出都在当前页面里完成,Markdown 内容不会被上传。

选哪种格式:简单对照

  • 要发聊天软件或朋友圈:PNG,自适应高度,2× 密度。
  • 要发邮件、归档、让对方可以搜索:A4 加文字版 PDF,页边距 76 px 左右,关闭页眉页脚。
  • 要保证版式和预览分毫不差、页数不多:A4 加图片版 PDF。
  • 要拿到 HTML 源码贴进别处:用本站的 Markdown 转 HTML 工具,那里有原始 HTML 的处理选项。

打开工具: Markdown 预览与导出工具

返回指南列表

更多指南