1 项目简介
Pandoc
通用文档转换器
Pandoc 是一个用 Haskell 编写的开源库和命令行工具,专门用于在不同标记格式之间进行转换。它被誉为文档格式转换的"瑞士军刀",支持超过 50 种输入格式和 60 种输出格式。
关于项目
由 John MacFarlane 维护,采用 GPLv2+ 许可证发布。主要使用 Haskell (83.8%) 编写,项目始于 2006 年。
主要用途
- 文档格式批量转换(Markdown → Word/PDF/HTML)
- 学术论文排版(支持 LaTeX、BibTeX 引用)
- 电子书制作(EPUB、PDF)
- 演示文稿生成(reveal.js、Beamer)
- Wiki 内容迁移(MediaWiki、DokuWiki 等)
2 架构概述
三阶段管道架构
Pandoc 采用模块化的三阶段管道设计,使得添加新格式只需实现 Reader 或 Writer,而无需为每对格式创建转换器。
技术栈
3 支持格式
标记语言
文档格式
Wiki/CMS
参考文献
其他
网页
文档
演示文稿
出版
4 核心功能
增强 Markdown
支持表格、定义列表、脚注、引用、数学公式、交叉引用等扩展语法
过滤器系统
支持 JSON 过滤器和内置 Lua 过滤器,可在转换过程中修改 AST
模板系统
支持自定义模板,使用变量、条件语句和循环控制输出格式
引用处理
内置 citeproc 支持,可处理 BibTeX 等参考文献并生成规范引用
5 安装配置
Homebrew(推荐)
brew install pandoc
MacPorts
port install pandoc
Conda
conda install -c conda-forge pandoc
PDF 支持
生成 PDF 需要安装 LaTeX。推荐使用 BasicTeX 或 TinyTeX(而非完整的 MacTeX,可节省 4GB 空间)。
6 基础用法
基本语法
pandoc [选项] [输入文件...]
不指定文件时,从标准输入读取;不指定输出时,输出到标准输出。
常用转换示例
Markdown → HTML
pandoc input.md -o output.html
Markdown → Word 文档
pandoc input.md -o output.docx
Markdown → PDF(需要 LaTeX)
pandoc input.md -o output.pdf
Word → Markdown
pandoc input.docx -o output.md
HTML → Markdown
pandoc -f html -t markdown https://example.com/page.html -o output.md
生成独立文档
使用 -s 或 --standalone 生成包含完整头部信息的独立文档:
pandoc -s input.md -o output.html
7 命令选项
| 选项 | 说明 |
|---|---|
-f, --from |
指定输入格式 |
-t, --to |
指定输出格式 |
-o, --output |
输出到文件 |
-s, --standalone |
生成独立文档(含头尾) |
--template |
使用自定义模板 |
-V, --variable |
设置模板变量 |
-M, --metadata |
设置文档元数据 |
-L, --lua-filter |
应用 Lua 过滤器 |
-C, --citeproc |
处理引用和参考文献 |
--toc |
生成目录 |
--pdf-engine |
指定 PDF 引擎(pdflatex/xelatex/lualatex 等) |
--sandbox |
沙箱模式(限制 IO 操作) |
8 使用示例
pandoc -s --toc -c style.css input.md -o output.html
pandoc input.md -o output.pdf \
--pdf-engine=xelatex \
-V CJKmainfont="SimSun" \
-V mainfont="Times New Roman"
pandoc paper.md -o paper.pdf \
--citeproc \
--bibliography=refs.bib \
--csl=ieee.csl
pandoc -t revealjs -s slides.md -o slides.html \
-V theme=moon \
-V transition=slide
pandoc -o book.epub \
--epub-cover-image=cover.jpg \
--metadata title="我的书" \
--metadata author="作者名" \
chapter1.md chapter2.md chapter3.md
# 将目录下所有 .md 文件转为 HTML
for f in *.md; do
pandoc "$f" -s -o "${f%.md}.html"
done
9 过滤器与扩展
Lua 过滤器
Lua 过滤器是内置的,无需额外依赖。可以在转换过程中修改 AST。
pandoc input.md -L filter.lua -o output.html
示例:将所有文本转为大写
-- uppercase.lua
function Str(elem)
return pandoc.Str(string.upper(elem.text))
end
JSON 过滤器
可使用任何编程语言编写的外部脚本处理 AST。
pandoc input.md --filter ./myfilter.py -o output.html
格式扩展
可以启用或禁用特定格式的扩展功能:
# 启用 emoji 扩展,禁用删除线
pandoc -f markdown+emoji-strikeout input.md -o output.html
常用扩展:
10 模板系统
查看默认模板
# 查看 HTML 默认模板
pandoc -D html
# 查看 LaTeX 默认模板
pandoc -D latex
模板语法
| 语法 | 说明 |
|---|---|
$variable$ |
变量插值 |
$if(var)$...$endif$ |
条件语句 |
$for(items)$...$endfor$ |
循环语句 |
$body$ |
文档主体内容 |
使用自定义模板
pandoc input.md -o output.html \
--template=custom.html \
-V title="我的文档" \
-V author="作者"
11 高级功能
Defaults 文件
使用 YAML 配置文件保存常用选项:
# defaults.yaml
from: markdown
to: html
standalone: true
toc: true
metadata:
author: "作者名"
variables:
lang: zh-CN
pandoc -d defaults.yaml input.md -o output.html
数学公式渲染
--mathjax
使用 MathJax(推荐)
--katex
使用 KaTeX(更快)
--mathml
输出 MathML
资源路径
# 指定图片等资源的搜索路径
pandoc input.md -o output.html --resource-path=.:images:assets
退出码
| 代码 | 含义 |
|---|---|
| 0 | 成功 |
| 1 | IO 错误 |
| 3 | 有警告 |
| 21-67 | 各类格式/处理错误 |