快速答案:使用 Pandoc 和受控引擎从 Markdown 构建 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从批准来源安装 Pandoc。记录本地和 CI 使用的准确版本。
- 2选择并安装一个 PDF 引擎。仅使用 PDF 扩展名不会自动安装 LaTeX、WeasyPrint、Typst 或其他依赖。
- 3确认可执行文件发现。在转换所用的相同 Shell、工作目录、账户和 PATH 中运行版本命令。
- 4清点字体和资源。验证许可证、字形覆盖、图片路径、参考文献文件、模板和过滤器。
- 5构建代表性测试。包含标题、链接、表格、代码、图片、非拉丁文字、引用和分页边界。
pandoc --version
xelatex --version
weasyprint --version
typst --version只需安装实际选择的引擎,不要把该列表误解为必须安装所有渲染器。依赖越少且越受控,越容易保证安全和可复现。
根据文档选择 Pandoc PDF 引擎
| 路径 | 适合场景 | 优势 | 主要注意点 |
|---|---|---|---|
| XeLaTeX / LuaLaTeX | 书籍、报告、数学和多语言排版 | 成熟分页和系统字体支持 | 需要 TeX 包、模板知识和较长配置 |
| pdfLaTeX | 字体兼容的传统 LaTeX 文档 | 生态稳定、软件包成熟 | 系统字体和 Unicode 直接支持有限 |
| WeasyPrint | HTML/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=1inpandoc 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.png与chart.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
- 记录源版本、命令、Pandoc 版本、引擎版本、defaults、模板、过滤器、字体和输出日期。
- 在目标阅读器中打开实际 PDF,确认标题、作者、语言和文档属性。
- 逐页检查孤立标题、表格跨页、代码截断、空白页和异常留白。
- 检查目录、章节编号、脚注、引用、交叉引用、内部锚点和外部链接。
- 检查图片分辨率、宽高比、说明、颜色对比度和内容审批。
- 搜索、选择并复制代表性文字、代码、公式和多语言字符。
- 根据交付标准运行适当可访问性检查;需要带标签 PDF 时检查标签和阅读顺序。
- 删除私有路径、批注、嵌入文件、临时元数据和未获批准的源信息。
- 在另一台设备测试,并归档实际交付的准确源文件、配置和输出。
干净构建日志不能保证排版可读、事实正确、结构可访问或分页合理。自动检查和人工检查回答不同问题,高质量发布需要两者结合。
官方来源与参考资料
本文的命令选项、PDF 引擎与安装边界以 Pandoc 项目的第一方资料为依据:Pandoc 用户手册中的 --pdf-engine 说明用于核对当前版本支持的引擎和默认行为;Pandoc 官方安装说明用于确认不同操作系统的安装方式;Pandoc 中文 PDF FAQ用于说明 Unicode 引擎和 CJK 字体选择。实际构建仍应以项目安装的准确 Pandoc 版本、PDF 引擎版本和模板为准。
这些来源分别证明“工具支持什么”,并不证明某份 PDF 已经满足组织的排版、无障碍、品牌或合规要求。本文中的命令是可复现起点,不是性能基准,也没有虚构转换成功率。发布结论必须来自代表性样例、构建日志、实际 PDF 逐页检查、文本提取与目标阅读器测试;如果官方手册与旧命令示例冲突,应优先采用当前安装版本对应的官方手册。
Pandoc Markdown 转 PDF 常见问题
Pandoc 需要外部 PDF 引擎。安装批准的 LaTeX 发行版或其他受支持引擎,确认构建账户 PATH 可以找到,并在需要时明确传入 --pdf-engine。
根据文档需求和团队技能选择。XeLaTeX 或 LuaLaTeX 适合成熟排版和多语言字体,WeasyPrint 适合 HTML/CSS 工作流,Typst 适合现代可编程排版。标准化前要测试代表性内容。
对于兼容 LaTeX 模板,可传入 -V geometry:margin=1in 等 geometry 变量,或写入 YAML/defaults。HTML/CSS 等其他路径使用各自页面样式机制。
记录版本,使用明确读取器和引擎设置重跑,生成中间 TeX 或 HTML,直接调用引擎,并在保留触发条件的前提下缩减为最小失败示例。

