
用 pandoc 命令行直接转 Markdown 到 PDF/HTML/DOCX
只要周报源文件是 weekly-report.md,一条命令就能生成常用格式,无需中间工具或 GUI。Pandoc 本身不依赖 LibreOffice(docx 输出除外),但 PDF 渲染需系统级支持。
常见错误:直接运行 pandoc weekly-report.md -o report.pdf 报错 “Could not find LaTeX engine”,这是因为 Pandoc 默认调用 pdflatex,而多数最小化 Linux 发行版(如 Alpine、Ubuntu server)没装 TeX Live。
- 生成 HTML:
pandoc weekly-report.md -o report.html --standalone --self-contained(--self-contained内联 CSS/JS/图片,适合邮件或内网查看) - 生成 DOCX:
pandoc weekly-report.md -o report.docx(无需额外依赖,但中文样式可能偏简陋,建议后续用 Word 微调) - 生成 PDF(推荐方式):
pandoc weekly-report.md -o report.pdf --pdf-engine=xelatex,并确保已安装xelatex(Debian/Ubuntu:安装texlive-xetex;CentOS/RHEL:安装texlive-xetex和texlive-fonts-recommended)
让中文字体和表格在 PDF 中正常显示
默认 PDF 输出常出现中文乱码、表格换行错位,根本原因是 XeLaTeX 没指定中文字体,且 Pandoc 默认 LaTeX 模板对运维类表格(含多行命令、路径、状态码)支持弱。
解决方法不是改模板文件,而是用元数据 + 简单 YAML 头控制渲染:
- 在
weekly-report.md开头加 YAML 元数据块:--- mainfont: "Noto Sans CJK SC" monofont: "Noto Sans Mono CJK SC" geometry: margin=1in ---
- 如果系统没装 Noto 字体,先安装:
sudo apt install fonts-noto-cjk(Debian/Ubuntu)或sudo yum install google-noto-sans-cjk-fonts(RHEL/CentOS 8+) - 表格内容含长命令时,在 Markdown 表格中用
<span style="font-size:0.8em">...</span>包裹关键字段(Pandoc 会保留该 HTML 标签到 PDF 的 LaTeX 中间层)
用 Makefile 或 shell 脚本批量生成多格式并自动归档
运维周报每周固定更新,手动敲多条 pandoc 命令容易漏格式、路径错乱。脚本化核心是统一输入源、分离输出目录、保留时间戳。
一个轻量可靠的 build.sh 示例(无需 Make):
#!/bin/bash SRC="weekly-report.md" DATE=$(date +%Y%m%d) OUTDIR="dist/$DATE" <p>mkdir -p "$OUTDIR" pandoc "$SRC" -o "$OUTDIR/report.html" --standalone --self-contained pandoc "$SRC" -o "$OUTDIR/report.docx" pandoc "$SRC" -o "$OUTDIR/report.pdf" --pdf-engine=xelatex --template=eisvogel</p><h1>顺便压缩成带日期的包</h1><p>zip -j "weekly-report-$DATE.zip" "$OUTDIR"/*</p>
注意:eisvogel 是社区维护的增强 LaTeX 模板(支持目录、代码高亮、页眉页脚),用 curl -L -o eisvogel.latex https://github.com/Wandmalfarbe/pandoc-latex-template/releases/download/v2.4.1/eisvogel.latex 下载后,通过 --template=eisvogel.latex 引用。它比默认模板更适合技术文档,但会略微增加 PDF 编译时间。
为什么不要用 pandoc --to docx 直接转复杂表格或代码块
docx 输出对纯文本和简单列表友好,但遇到三类内容会降级:嵌套列表、带行号的代码块(```bash {linenos=table})、含 colspan/rowspan 的表格。Pandoc 会静默丢弃这些语义,只留扁平文本。
真实运维周报里,这类结构很常见——比如“故障复盘”部分的多列对比表、“执行命令”区块里的带编号脚本。这时候不能只依赖一次转换:
- 优先用 HTML 或 PDF 作为交付主格式(语义保留完整)
- 若必须交 DOCX,先用
pandoc -t html输出 HTML,再用 LibreOffice 命令行转:libreoffice --headless --convert-to docx report.html(更稳,但需安装 LibreOffice) - 避免在 Markdown 源中写 LaTeX 特有语法(如
\begin{verbatim}),它们在docx输出中完全无效
真正麻烦的从来不是格式数量,而是同一份源文档里混用多种技术表达意图——表格要对齐、代码要高亮、路径要等宽、中文要断行。Pandoc 是个好翻译,但得告诉它每个段落“到底想被怎么理解”。











