Markdown转PDF分页:在你想要的位置准确另起一页

作者 pdftomd.tools 团队 · 更新于 · 阅读约 6 分钟

Markdown 本身没有分页语法。想在 PDF 里分页,就插入一行 HTML:<div style="page-break-after: always"></div>,上下各空一行。基于 HTML 的导出工具,包括我们的 Markdown转PDF 工具,都会在这里另起一页。如果用 Pandoc 走 LaTeX,就写 \newpage。导出后再检查一下 PDF 里有没有空白页。

插图:两页纸并排,中间有一条虚线分页线,箭头指向新的一页

为什么 Markdown 没有分页符

Markdown 是为网页设计的,而网页没有“页”的概念。无论是最初的语法还是 CommonMark,都没有定义分页符。最接近的是三个短横线 ---,叫主题分隔线:它会变成一条 <hr> 横线,而不是新的一页。很多人第一反应就是拿它来分页,然后奇怪为什么没反应。

Markdown 允许的是直接写 HTML。大多数导出工具先把 Markdown 转成 HTML,再把 HTML 打印成 PDF;所以分页其实是加在 HTML 元素上的一条 CSS 规则。例外是 Pandoc 的默认路径,它经过 LaTeX,要的是 LaTeX 命令。

确实管用的分页写法

按你用的导出工具选一行,单独放在一行,前后各留一个空行,这样 Markdown 解析器才会把它当作 HTML 块:

Last paragraph of the first part.

<div style="page-break-after: always"></div>

## Part two

This heading starts a new page.
旧的属性名,我们知道的所有基于 HTML 的导出工具都认。
  • 现代 CSS:<div style="break-after: page"></div>,或者在要另起一页的元素上写 break-before: page。
  • 直接加在标题上:<h2 style="page-break-before: always">第二部分</h2>,前提是你不介意用 HTML 写这个标题。
  • VS Code 插件 Markdown PDF:它的 README 给的是 <div class="page"/>,由插件自带的样式表负责分页。这是 VS Code 里最常见的答案,上面的行内样式在那里也能用。
  • Pandoc + LaTeX(默认的 PDF 路径):一行 \newpage。raw_tex 扩展只会把它原样传给 LaTeX 和 ConTeXt 的 writer。Pandoc 的 newpage 命令不适用于 HTML 输出;如果你用 HTML 引擎生成 PDF,请改用 div。

为什么有两个名字?CSS 分片规范 用 break-before 和 break-after 取代了 page-break-before 和 page-break-after,旧名保留为别名:page-break-after: always 的效果等同于 break-after: page。对老工具来说旧写法更保险;MDN 两种都有说明。

“始终在主盒子之前/之后强制分页。”
W3C, CSS Fragmentation Module Level 3,page 值的定义(译文)

我们的导出工具如何处理手动分页

2026 年 10 月 19 日之前,我们的导出工具会忽略手动分页,所有分页位置都自己决定。现在它会读取渲染后文档中每个元素计算出的 break-before 和 break-after 值,所以写在 style 属性里的 CSS 分页,不论新旧写法都会生效。实时预览会在新页开始的地方画一条标着“分页”的虚线,导出后还会提示应用了几个手动分页。

截图:我们编辑器里的分页,左侧是 div,右侧预览中有一条虚线分页标记
截图:源码中的分页行,以及预览里的虚线标记。

几条规则让输出保持干净:

  • 文档最开头或最末尾的分页会被忽略,所以不会出现空白的第一页或最后一页。
  • 连续两个分页只算一个。Chrome 会在中间打印一张空白页;我们认为这很少是你想要的。
  • left、right、recto 和 verso 这几个值都会另起一页。我们不会为了落到左页或右页而插入空白页。
  • --- 仍然是一条横线,和 Markdown 的定义一致。
  • 长段落里依然会自动分页,而且依然避免切断一行文字、一行表格或一张图片。
截图:导出的两页 PDF,第一页是简短摘要,附录表格从第二页顶部开始
截图:用上面的例子导出的 PDF,附录从第二页开始。

我们测了什么:与 Chrome 打印对比

我们写了 9 个小文档,每个测试一种分页写法,都用真实的“下载 PDF”按钮导出,再用 pdfinfo 和 pdftotext 读回来,看哪段文字落在哪一页。作为参照,我们还用 Chrome 的 PDF 打印输出了同样的 HTML。测试中,9 个用例全部得到了预期的页面且没有空白页,其中 8/9 个与 Chrome 逐页一致。

手动分页:我们的导出工具 vs Chrome 打印为 PDF,根据我们的测试(2026年10月19日)
标记我们的页数Chrome 页数空白页(我们)符合预期与 Chrome 相比
<div style="page-break-after: always">220是一致
<div style="break-before: page">220是一致
<div style="break-after: page">220是一致
<h2 style="page-break-before: always">220是一致
分页后紧跟 Markdown 标题220是一致
连续两个分页 div230是不同
文档开头和结尾各有一个分页110是一致
---(Markdown 分隔线)110是一致
手动分页与自动分页混合440是一致
唯一的差别是连续两个分页:Chrome 会多出一张空白页,我们的导出工具不会。把导出的 PDF 再转回 Markdown,标题和正文都能还原。

让标题和正文在同一页,以及其他尴尬的分页

手动分页能解决你知道的位置,其余交给导出工具。最典型的问题是标题孤零零地落在页面底部,正文却从下一页开始。文字处理软件把解决办法叫作“与下段同页”。在 CSS 里,对应的写法是给标题加 break-after: avoid,但各引擎在打印时对 avoid 值的支持并不一致,用之前先测一下。

插图:左边是落在页面底部的孤立标题,右边是同一标题移到了下一页顶部
左:孤立的标题。右:标题跟着正文一起移到下一页。

我们的导出工具不需要任何标记就能做到:标题总是和它后面的第一行在一起,表格行和图片只要一页放得下就不会被拆开。如果还是不满意某一页的结束位置,就在标题前面加一个手动分页。下图标出了哪里可以分页、哪里不行。

插图:一页纸上,块与块之间的虚线表示允许分页,表格内部的红色标记表示不允许
分页可以落在块与块之间(蓝色),不会落在一行文字或一行表格中间(红色)。

表格要格外注意。我们的 表格打印指南 讲了长表格和宽表格的处理;正式导出前,先用 MD转PDF 快速导出一下,是试排版最快的办法。

分页常见错误

分页没生效时,原因几乎总是下面四个之一:

  • div 后面没有空行。在 CommonMark 里,以 <div> 开头的 HTML 块会一直延续到下一个空行。紧跟在下面的文字会被吞进 HTML,显示时没有格式,## 和 ** 都原样露出来。
  • div 放在列表、引用或表格里。把它放到文档最外层,任何导出工具都会把它当作独立的块。
  • HTML 被禁用了。有些渲染器默认关闭 HTML,会把标签当文字显示出来。在设置里打开 HTML,或者用该工具自带的分页语法(如果有的话)。
  • 只看预览下结论。会清理 HTML 的预览常常去掉行内样式,屏幕上看不到分页,导出时却照样生效。我们的预览会显示虚线标记,但真正的检验还是导出的文件。

还有一个好习惯:手动分页一律放在要另起一页那一节的标题正上方,不要放在标题下面。这样标题和第一段永远在一起;以后删掉分页,文档的顺序也不会乱。

分享 PDF 前的快速检查

  1. 从头翻到尾找空白页;出现空白页通常是连续两个分页,或者结尾有分页。
  2. 确认每一节都从页面顶部开始,标题在最前面。
  3. 搜索最后一页的某个词,确认文字层是真的。
  4. 如果 PDF 要双面打印,并且每章必须从右页开始,请用支持 break-before: right 的工具;我们的工具会把它当普通的另起一页处理。

常见问题

Markdown 转 PDF 时怎么插入分页?

Markdown 没有分页语法。插入一行 HTML <div style="page-break-after: always"></div>,前后各空一行;基于 HTML 的 PDF 导出工具会在这里另起一页。

`---` 能分页吗?

不能。三个短横线是主题分隔线,显示为一条横线,在 PDF 里也还是一条线。

该用 page-break-after 还是 break-after?

都可以。break-after: page 是现在的 CSS 名称,page-break-after: always 是旧别名。旧写法在老工具里稍微稳妥一些;我们的导出工具两种都认。

Pandoc 怎么分页?

通过 LaTeX 生成 PDF 时,在单独一行写 \newpage。如果通过 HTML 生成 PDF(比如用 HTML 引擎),就改用 CSS div,因为这个 LaTeX 命令只会传给 LaTeX 和 ConTeXt 的 writer。

为什么多出了一张空白页?

通常是连续两个分页,或者文档最末尾有分页。这两种情况 Chrome 都会打印空白页;我们的导出工具会跳过。

能让每个 H2 都从新的一页开始吗?

在支持自定义 CSS 的工具里,用样式表写 h2 { break-before: page; } 就行。在我们的编辑器里,在每个 H2 前加 div 行,或者把标题写成 <h2 style="page-break-before: always">。