Apache FOP 是基于 Java 的开源排版引擎,将 XSL-FO 格式 XML 转换为 PDF 等印刷级输出;XSL-FO 是 W3C 定义的页面布局专用XML 语言,需通过 XSLT 从业务 XML 生成;使用流程为准备 FO 文件→调用 FOP 工具→输出 PDF,适合需严格分页与归档的文档自动化场景。
Apache FOP 是一个开源的、基于 Java 的排版引擎,它把符合 XSL-FO(Extensible Stylesheet Language Formatting Objects)规范的 XML 文档,转换成 PDF、PostScript、AFP 等格式的输出文件。 它不处理 HTML 或 CSS,也不直接渲染网页;它的核心任务是:接收结构化、带格式描述的 XSL-FO 文件,按规范精确排版,生成高质量的印刷级 PDF。
XSL-FO 是 W3C 定义的一种 XML 标记语言,专门用于描述页面布局和样式(比如页边距、分栏、字体、表格对齐、页码、脚注等)。它通常由 XSLT 从原始 XML 数据(如订单、报告、文档)转换而来。你可以把它理解为“PDF 的源代码”——用 XML 写的排版指令。
例如,一个最简的 FO 片段:
基本流程是三步:准备 FO 文件 → 调用 FOP 命令行或 API → 输出 PDF。
java 可用,bin 目录下的 fop(Linux/macOS)或 fop.bat(Windows)就能运行fop -xml input.fo -pdf output.pdf(注意:FOP 默认要求 FO 是 well-formed XML,且命名空间正确)-d 参数看调试信息-foout temp.fo 把 XSLT 输出保存下来,确认 FO 结构无误再转 PDFFOP 学习成本高、调试繁琐、对复杂 CSS 效果支持弱(比如阴影、渐变、Flex 布局),所以 Web 转 PDF(Puppeteer、WeasyPrint)更流行。但它在以下场景仍是首选:
examples/,跑通一个 basic.fo 示例是最短路径fop.xconf,添加字体路径和 embed-url,否则连“你好”都出不来
而不是 div 模拟表格,FOP 对表格分页、跨页断行有专门优化基本上就这些。FOP 不复杂但容易忽略细节,关键是理解它“XML 驱动排版”的定位——不是前端工具,而是出版流水线里的印前引擎。