带表格的Markdown转PDF:打印出来依然清楚好读

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

想把带表格的Markdown转PDF又不把表格弄乱,就写简单的 GFM 表格,宽度控制在页面以内,再用一个绝不把一行拦腰切断的渲染器导出,比如我们的 MD转PDF 工具。导出后打开 PDF 检查三件事:每一列都看得到,分页处的行保持完整,单元格里的文字能选中、能搜索。

插图:两张 A4 页面上的一张长表格,顶部是表头行,每页的行都完整

简短回答:GFM 表格 + 不切断行的渲染器

Markdown 表格来自 GitHub Flavored Markdown 的扩展语法:一行表头、一行分隔线,再加若干数据行,用竖线分开。像样的导出工具都能识别。真正的差别出现在表格碰到页面边缘的时候:要么是右边(列太多),要么是底部(行太多)。

打印出来的表格好不好读,取决于三点:表格相对页面有多宽,分页时发生了什么,导出的是不是真正的文字。下面逐一讲,数据来自我们自己的导出器,测于 2026 年 10 月 18 日。

截图:在我们的编辑器里准备带表格的Markdown转PDF,左边是 Markdown 源码,右边是渲染后的表格
截图:编辑器里带表格的 Markdown。PDF 与实时预览使用同一套版式。

怎样写出打印效果好的表格

Markdown表格转PDF出问题,多半是源文件里就埋下了。养成几个习惯就能避开大部分:

  • 单元格要短。 长说明放到表格下方的段落里,单元格里只留一个短关键词。
  • 数字要对齐。 分隔行写成 ---: 就是右对齐,打印出来数字一眼就能比较。
  • 一定要有表头。 GFM 规定必须有,而且表格延续到第二页时,读者找的就是这一行。
  • 避免没有空格的长字符串。 网址和文件路径没法在空格处换行,会把整列撑宽。缩短它们,或者挪到表格下面做成脚注式列表。
  • 单元格里的竖线要转义,写成 \|,否则这一行会多出一列。
| Task           | Owner | Status    |
| :------------- | :---- | --------: |
| Draft the brief | Dana  | Done      |
| Review tables  | Lee   | In review |
| Export the PDF | Sam   | Next      |
打印效果好的表格:单元格短、有表头、有一列对齐。

导出前,先按接近打印的宽度看一眼表格。在我们的导出器里,A4 正文宽度大约是 680 个 CSS 像素。如果在窄预览里已经出现横向滚动条,印到纸上就会很挤。

宽表格:A4 放不下所有列时怎么办

插图:一张宽表格超出纵向页面,旁边是缩放适配后所有列都可见的同一张表

宽表格是 PDF 导出最容易悄悄出错的地方。我们开始为这篇文章做测试时,用自己的工具导出一张 9 列的表格,9 个表头单元格里只有 5 个完整落在页面内,最后一列完全看不到,其余部分都跑到了右边距外面。我们当天就改了导出器。现在会超出页面的表格会让单元格文字自动换行来适配宽度,重新测试时 9 列全部在页面内,没有文字越过右边距。

截图:我们的工具导出的一页 PDF,一张九列表格适配到页面宽度
真实导出:修复后的九列测试表格。窄表头里的单词会被拆开,这是适配宽度的代价。

适配总比丢列强,但不算好看:特别窄的单元格会把单词拆开。PDF 里的宽表格还有四种更好的处理方式,建议按这个顺序试:

  1. 删掉或合并列,去掉读者在纸上用不到的列。
  2. 拆成两张表,两张表共用一个关键列,比如编号或名称。
  3. 行列转置,让很多列变成行。
  4. 横向打印。 我们的导出器只生成纵向 A4。基于 Chromium 的导出工具支持 @page { size: A4 landscape; } 这样的 CSS 规则(MDN:size)。

长表格跨页

长表格跨页有两种坏法:一行被切开,上半截在这一页、下半截在下一页;或者第二页没有表头,读者分不清哪一列是什么。只要表格超过一页,这两点在带表格的Markdown转PDF时都很关键。我们用一张 60 行、每行折成两行文字的表格做了测试。

我们的测试:一张 60 行的表格打印到 A4(pdftomd.tools 团队,2026 年 10 月 18 日)
导出工具页数被切开的行带表头的页
pdftomd.tools MD转PDF404 页中 1 页
Chrome 打印为 PDF(Chrome 155.0.8059.84)303 页中 3 页
Chrome 测试用的是 14px 字号和不同的页边距,所以页数不能直接对比。
截图:我们的工具导出的长表格前两页,每页的行都完整
真实导出:第 1 页和第 2 页。行在分页处干净地结束,但第 2 页开头没有表头。

我们的导出器保证每一行完整,但不会在后续页重复表头。Chrome 两样都做到了。CSS 2.1 规范允许这样做,但没有强制要求:

“打印用户代理可以在表格所跨的每一页上重复表头行。”
W3C, CSS 2.1,第 17.2 节(译文)

如果现在用我们的工具就需要每页都有表头,可以把长表格拆成一页一段,自己在每段开头补上表头行。在基于 HTML 的导出工具里,tr { break-inside: avoid; }(MDN)会让浏览器尽量不切断行。

Markdown表格转PDF:浏览器工具 vs VS Code vs Pandoc

三条路都能把带表格的Markdown转PDF,区别在于安装门槛和可控程度。

三种导出方式对比(依据各自文档和我们的测试)
方式渲染原理表格实际表现
我们的浏览器工具在浏览器里排版,用 pdf-lib 写入文字行保持完整;表头不重复;宽表格自动适配
VS Code + Markdown PDF 扩展通过 Chrome、Edge 或 Chromium 打印支持自定义样式表和横向设置
Pandoc默认经由 LaTeX 转换使用 longtable 环境,表格可以跨多页

VS Code 方面,Markdown PDF 扩展 的文档写明了用于自定义 CSS 的 markdown-pdf.styles 设置,以及纵向、横向选项。它用 Chromium 浏览器打印,和上表 Chrome 那一行是同一个引擎;扩展本身我们没有测过。

Pandoc 方面,Pandoc 手册 说 LaTeX 输出默认使用 longtable,表格可以跨过分页继续。手册还说,如果管道表格里有一行超过列宽,各列的相对宽度会按分隔行里短横线的数量来分配。也就是说,不用 HTML 也能把某一列调宽。

pandoc report.md -o report.pdf
Pandoc 默认的 PDF 流程(需要安装 LaTeX 引擎)。

检查 PDF:文字能选中,单元格能搜索

插图:一页带表格的 PDF,其中一行以选中文字高亮,一个放大镜悬在某个单元格上

带表格的Markdown转PDF,最后一步要查的是文字层。只有单元格是真正的文字,导出表格才有意义。有些导出工具,包括我们工具的备用模式,会把每一页存成图片放进 PDF:看着没问题,但不能搜索、不能复制,读屏软件也读不出来。检查只要十秒:打开 PDF,按 Ctrl+F(或 Cmd+F),搜一个只出现在某个单元格里的词,再选中一行粘贴出来看看。

我们的导出器写入的是真正的文字,并嵌入字体子集。在往返测试里,我们把四张表格打印成 PDF,再用我们的 PDF转Markdown 工具 转回来,17 行中有 17 行和源文件完全一致,包括一个转义的竖线和右对齐的数字。反方向的做法,请看我们的 PDF表格转Markdown 指南。

参考来源

  1. GitHub Flavored Markdown Spec, 4.10 Tables (extension) — GitHub, 2019
  2. CSS 2.1 Specification, 17 Tables — W3C, 2011
  3. break-inside — MDN Web Docs
  4. size (@page descriptor) — MDN Web Docs
  5. Pandoc User’s Guide — pandoc.org
  6. Markdown PDF (VS Code extension) — yzane, Visual Studio Marketplace

常见问题

带表格的Markdown怎么转成PDF?

用竖线和表头写 GFM 表格,宽度控制在页面以内,再用不切断行的工具导出。导出后在 PDF 里检查有没有被截掉的列、被切开的行,文字能不能选中。

为什么 PDF 里表格的列被截掉了?

表格比可打印区域宽,导出工具又没有缩小它。可以删列或拆表、行列转置,或者横向打印。我们的导出器现在会让宽表格的文字换行,适配页面宽度。

表头会在每一页重复吗?

看导出工具。在我们的测试里,Chrome 打印为 PDF 时每页都重复了表头;我们的导出器只在第一页显示,所以如果读者需要,请把长表格拆开。

能横向打印 Markdown 表格吗?

我们的导出器不行,它只生成纵向 A4。基于 Chromium 的工具可以在样式表里写 @page { size: A4 landscape; },VS Code 的 Markdown PDF 扩展也有方向设置。

PDF 里的表格文字能搜索吗?

用我们的导出器可以:单元格是嵌入了字体的真正文字。有些工具存的是页面图片,搜一个单元格里的词就能确认。

把 PDF 再转回 Markdown,跨页的表格会自动合并吗?

不会。转回来是每页一张表;删掉重复的表头行和分隔行就能合并。具体做法见我们的 表格指南。