可复现 PDF 指南

Pandoc Markdown 转 PDF 完整指南:选择引擎、字体、中文支持、页面设置与自动化验收

有意识地选择 Pandoc PDF 引擎,控制元数据和资源,解决多语言与版式失败,并在发布前验证可复现输出。

更新于 2026 年 8 月 2 日阅读约 18 分钟InfiniSynapse 编辑团队
Pandoc Markdown 转 PDF 完整指南:选择引擎、字体、中文支持、页面设置与自动化验收主题流程示意图,展示关键步骤、内容结构与最终输出之间的关系
本页目录

快速答案:使用 Pandoc 和受控引擎从 Markdown 构建 PDF

简要答案Pandoc 会把 Markdown 解析为文档模型,再把最终 PDF 渲染交给所选引擎。应安装 Pandoc 和对应引擎,明确输入方言,让元数据和资源可复现,生成具有代表性的 PDF;转换失败时检查中间输出,并在发布前验收实际页面。

pandoc input.md -o output.pdf 只是起点。排版、Unicode 覆盖、CSS 或 TeX 行为、引用、图片分辨率、表格宽度、分页和内部链接都会受到所选路径及其依赖影响。

理解 Pandoc Markdown 转 PDF 的处理链

Pandoc 是文档转换器,而不是单一 PDF 排版引擎。它读取 Markdown、构建抽象语法树,应用元数据、默认配置、过滤器、引用、模板和写入规则,再通过 LaTeX、HTML/CSS、Typst、ConTeXt 或 roff 等中间格式调用 PDF 引擎。

读取层

声明的 Markdown 方言决定哪些表格、属性、任务列表、原始块和扩展可以识别。

文档层

元数据、引用、交叉引用、过滤器和变量会在排版前转换结构化内容。

引擎层

TeX、HTML/CSS、Typst 或其他引擎控制字体、分页、表格和最终 PDF 生成。

验收层

PDF 阅读器、文字提取、链接测试、视觉检查和回归构建用于证明产物可用。

这种分层解释了为什么两个正确的 Pandoc 命令可能生成不同 PDF。源文件相同,但引擎、模板、字体清单、环境或版本发生变化,结果就可能不同。

安装 Pandoc 并验证完整工具链

  1. 1从批准来源安装 Pandoc。记录本地和 CI 使用的准确版本。
  2. 2选择并安装一个 PDF 引擎。仅使用 PDF 扩展名不会自动安装 LaTeX、WeasyPrint、Typst 或其他依赖。
  3. 3确认可执行文件发现。在转换所用的相同 Shell、工作目录、账户和 PATH 中运行版本命令。
  4. 4清点字体和资源。验证许可证、字形覆盖、图片路径、参考文献文件、模板和过滤器。
  5. 5构建代表性测试。包含标题、链接、表格、代码、图片、非拉丁文字、引用和分页边界。
pandoc --version
xelatex --version
weasyprint --version
typst --version

只需安装实际选择的引擎,不要把该列表误解为必须安装所有渲染器。依赖越少且越受控,越容易保证安全和可复现。

根据文档选择 Pandoc PDF 引擎

路径适合场景优势主要注意点
XeLaTeX / LuaLaTeX书籍、报告、数学和多语言排版成熟分页和系统字体支持需要 TeX 包、模板知识和较长配置
pdfLaTeX字体兼容的传统 LaTeX 文档生态稳定、软件包成熟系统字体和 Unicode 直接支持有限
WeasyPrintHTML/CSS 发布和 Web 团队支持打印 CSS、样式熟悉、HTML 路径活跃分页媒体支持和字体仍需测试
Typst现代可编程排版流程构建快速、模板语言简洁需要评估模板和功能适配
ConTeXt / roff特定成熟工具链组织已有相应流程时实用对很多团队而言知识储备较少

当前 Pandoc --pdf-engine 文档列出了 LaTeX、HTML、ConTeXt、roff 和 Typst 路径支持的引擎与默认值。应根据已安装 Pandoc 版本阅读文档,不要直接复制旧论坛命令。

通过元数据控制标题、页边距、字体和目录

YAML 元数据让可重复文档设置靠近源文件。变量由所选写入器和模板解释,因此 LaTeX 变量在 HTML/CSS 路径中可能没有作用。应从最简文件开始,每次只增加一个设置。

---
title: "Verified Operations Report"
author: "Analytics Team"
date: "2026-08-02"
lang: en-US
toc: true
toc-depth: 2
number-sections: true
geometry: margin=1in
mainfont: "Noto Serif"
sansfont: "Noto Sans"
monofont: "Noto Sans Mono"
---

# Executive summary

The decision and its supporting evidence.

标题和发布日期必须真实。不要嵌入密钥、内部文件路径、个人标识符或未经批准的元数据。对于可复用设置,Pandoc 支持 defaults 文件,可以与文档内容分开审阅和版本管理。

# pdf.yaml
from: gfm
standalone: true
toc: true
pdf-engine: xelatex
resource-path:
  - .
  - images
variables:
  geometry: margin=1in
pandoc report.md --defaults=pdf.yaml -o report.pdf

使用明确的 Pandoc Markdown 转 PDF 命令

使用系统字体并包含目录的 TeX 路径示例:

pandoc report.md \
  --from=gfm \
  --standalone \
  --toc \
  --pdf-engine=xelatex \
  --resource-path=".;images" \
  -V geometry:margin=1in \
  -V mainfont="Noto Serif" \
  -o report.pdf

资源路径分隔符会因平台和 Shell 而不同。包含空格的路径要加引号,并在目标环境测试准确命令。HTML/CSS 路径示例:

pandoc report.md \
  --from=gfm \
  --standalone \
  --to=html5 \
  --css=print.css \
  --pdf-engine=weasyprint \
  --resource-path=".;images" \
  -o report.pdf

在不清楚参数由哪一层处理时,不要随意组合。CSS 文件不会设置 LaTeX 路径,LaTeX 头文件也不会影响 HTML 写入器。明确 --from--to--pdf-engine 有利于调试。

修复中文、多语言和缺字 PDF 输出

中文 PDF 空白或乱码通常说明引擎与字体不匹配,并不一定是 Markdown 损坏。Pandoc 官方中文 PDF FAQ建议使用 XeLaTeX 等支持 Unicode 的引擎,并选择包含所需字形的字体。

pandoc chinese.md \
  --pdf-engine=xelatex \
  -V CJKmainfont="Noto Serif CJK SC" \
  -o chinese.pdf

准确变量取决于模板和引擎。确认字体安装在构建账户下,许可允许目标分发,并且 CI 可以使用。测试中文、拉丁字符、标点、数学、Emoji 和所有必要文字系统。在一台工作站有效的字体名称,换环境后可能缺失或被别名替代。

正确解析图片、CSS、模板和参考文献文件

Pandoc 会根据工作目录和已配置资源路径解析相对资源。源文件在编辑器中预览正常,但 CI 命令从不同目录运行时仍可能失败。应把资源放入可预测目录,使用可移植相对路径,并在许可和隐私允许时把必要文件纳入版本控制。

project/
  report.md
  pdf.yaml
  references.bib
  print.css
  templates/
    report.tex
  images/
    architecture.png
  • 检查文件名大小写;Linux 构建系统会区分 Chart.pngchart.png
  • 可复现构建中避免临时签名网址和需要身份验证的远程图片。
  • 使用足够图片分辨率和正确宽高比,不要把小型位图放大到整页宽度。
  • 依赖远程内容前,确认其获得批准、稳定可用并符合保留要求。

有意识地处理表格、代码、数学、链接和引用

表格:聚焦列、缩短标签、避免不可换行内容,并在缩小字体前拆分宽矩阵。不同引擎对跨页和列宽支持不同。代码:为围栏代码设置语言,缩短长行,并测试从 PDF 复制。语法高亮不应降低对比度。

数学:选择支持所需符号的引擎和字体,并测试分页边界的公式。链接:检查可见锚文本、外部目标、内部锚点,以及离线使用时的打印网址。引用:对参考文献库和 CSL 样式进行版本管理,使用 --citeproc,并检查每条参考文献是否缺作者、日期或标识符。

pandoc paper.md \
  --citeproc \
  --bibliography=references.bib \
  --csl=style.csl \
  --pdf-engine=xelatex \
  -o paper.pdf

定制 Pandoc PDF,同时避免不可维护模板

在复制完整模板前,优先使用元数据、defaults、CSS 和小型 include 文件。完整模板提供更多控制,但也会让项目与写入器变量和 Pandoc 变化紧密耦合。如果必须自定义模板,应从已安装版本的默认模板开始,保持修改最小,并记录每个不直观代码块。

pandoc -D latex > templates/report.tex
pandoc report.md \
  --template=templates/report.tex \
  --pdf-engine=xelatex \
  -o report.pdf

建立回归样例,覆盖标题页、目录、标题、列表、脚注、引用、代码、图片、宽表格、长网址、分页、多语言文字、页眉和页脚。只通过两段文字样例的模板不足以证明可用于生产。

系统排查 Pandoc Markdown 转 PDF 错误

现象可能层级下一步诊断
“pdflatex not found”PATH 中缺少引擎安装所选引擎,或明确指定已安装的受支持引擎
中文空白或方框引擎与字体字形覆盖使用支持 Unicode 的路径并验证指定 CJK 字体
找不到图片工作目录或资源路径输出当前目录、检查大小写并设置资源路径
表格超出页面源内容密度、模板和引擎删除列、缩短单元格、拆表或有意识改变方向
未知控制序列生成 TeX、原始内容或软件包生成中间 TeX 并检查失败行和依赖
CSS 不生效输出路径错误使用 HTML 写入器和支持 CSS 的 PDF 引擎
CI 构建不同版本、字体、区域、路径或依赖漂移比较记录清单并在两个环境构建同一测试样例

LaTeX 路径失败时,先生成中间文件而不是 PDF:

pandoc report.md --standalone -o report.tex
xelatex -interaction=nonstopmode report.tex

对于 HTML 路径,先写入独立 HTML,在浏览器打开并检查计算样式和资源请求,再调用 PDF 引擎。把失败文档缩减为最小可复现输入,但不要删掉真正触发错误的元素。

用版本化证据自动化 Pandoc PDF 构建

可复现构建应记录源版本、Pandoc 版本、PDF 引擎版本、操作系统或容器镜像、区域设置、已安装字体、软件包、过滤器、模板、defaults、参考文献、命令和输出校验和。尽量固定依赖,并在升级前审阅发行说明。

pandoc --version > build/pandoc-version.txt
xelatex --version > build/engine-version.txt
pandoc report.md --defaults=pdf.yaml -o build/report.pdf
sha256sum build/report.pdf > build/report.sha256

校验和只能证明字节相同,不能证明视觉正确。应运行页数、预期文字提取、必要元数据、断链、缺失字体和图片存在等结构检查;模板或依赖变化时,还要人工检查代表性输出。

使用在线转换器快速导出已脱敏内容

Pandoc 适合受控本地和自动化构建。如果需要快速浏览器转换,可使用 InfiniSynapse Markdown 转 PDF 工具处理已脱敏内容,然后在交付前执行相同的页面、链接、字体、图片和文字提取检查。

打开 InfiniSynapse 在线文档工具进入 InfiniSynapse

发布前验收每个 Pandoc PDF

  1. 记录源版本、命令、Pandoc 版本、引擎版本、defaults、模板、过滤器、字体和输出日期。
  2. 在目标阅读器中打开实际 PDF,确认标题、作者、语言和文档属性。
  3. 逐页检查孤立标题、表格跨页、代码截断、空白页和异常留白。
  4. 检查目录、章节编号、脚注、引用、交叉引用、内部锚点和外部链接。
  5. 检查图片分辨率、宽高比、说明、颜色对比度和内容审批。
  6. 搜索、选择并复制代表性文字、代码、公式和多语言字符。
  7. 根据交付标准运行适当可访问性检查;需要带标签 PDF 时检查标签和阅读顺序。
  8. 删除私有路径、批注、嵌入文件、临时元数据和未获批准的源信息。
  9. 在另一台设备测试,并归档实际交付的准确源文件、配置和输出。

干净构建日志不能保证排版可读、事实正确、结构可访问或分页合理。自动检查和人工检查回答不同问题,高质量发布需要两者结合。

官方来源与参考资料

本文的命令选项、PDF 引擎与安装边界以 Pandoc 项目的第一方资料为依据:Pandoc 用户手册中的 --pdf-engine 说明用于核对当前版本支持的引擎和默认行为;Pandoc 官方安装说明用于确认不同操作系统的安装方式;Pandoc 中文 PDF FAQ用于说明 Unicode 引擎和 CJK 字体选择。实际构建仍应以项目安装的准确 Pandoc 版本、PDF 引擎版本和模板为准。

这些来源分别证明“工具支持什么”,并不证明某份 PDF 已经满足组织的排版、无障碍、品牌或合规要求。本文中的命令是可复现起点,不是性能基准,也没有虚构转换成功率。发布结论必须来自代表性样例、构建日志、实际 PDF 逐页检查、文本提取与目标阅读器测试;如果官方手册与旧命令示例冲突,应优先采用当前安装版本对应的官方手册。

Pandoc Markdown 转 PDF 常见问题

为什么 Pandoc 提示找不到 pdflatex?

Pandoc 需要外部 PDF 引擎。安装批准的 LaTeX 发行版或其他受支持引擎,确认构建账户 PATH 可以找到,并在需要时明确传入 --pdf-engine

应该使用哪个 Pandoc PDF 引擎?

根据文档需求和团队技能选择。XeLaTeX 或 LuaLaTeX 适合成熟排版和多语言字体,WeasyPrint 适合 HTML/CSS 工作流,Typst 适合现代可编程排版。标准化前要测试代表性内容。

如何修改 Pandoc PDF 页边距?

对于兼容 LaTeX 模板,可传入 -V geometry:margin=1in 等 geometry 变量,或写入 YAML/defaults。HTML/CSS 等其他路径使用各自页面样式机制。

如何调试 Error producing PDF?

记录版本,使用明确读取器和引擎设置重跑,生成中间 TeX 或 HTML,直接调用引擎,并在保留触发条件的前提下缩减为最小失败示例。

关于本指南

IS
InfiniSynapse 编辑团队

我们为数据与文档工作流编写注重证据和可执行性的指南。Pandoc 行为必须使用构建中的准确版本、引擎、模板、字体、过滤器、依赖和内容进行验证。