XSL-FO是一种基于XML的排版标记语言,用于定义文档格式并经FO处理器(如Apache FOP)渲染为PDF等格式;其核心流程为XML→XSLT→XSL-FO→PDF,依赖页面布局、内容流和格式化标签实现精确打印控制。

XSL-FO(Extensible Stylesheet Language Formatting Objects) 是一种基于 XML 的标记语言,专门用于描述文档的**排版格式和布局**,常作为 XML 到 PDF 转换过程中的中间格式。它本身不生成 PDF,而是由 FO 处理器(如 Apache FOP、Antenna House、RenderX XEP)解析后,渲染成 PDF、PostScript 或其他可打印格式。
XSL-FO 的核心作用
它相当于“XML 的 CSS + 打印排版引擎接口”: - XML 提供结构化内容(比如订单数据、报告条目); - XSL-FO 文件(通常由 XSLT 从 XML 转换而来)定义这些内容如何分页、分栏、加页眉页脚、控制字体/边距/表格样式等; - FO 处理器读取该文件,执行布局计算,输出 PDF。
典型工作流程:XML → XSLT → XSL-FO → PDF
这是最常用、最可控的方式:
-
准备原始 XML:例如
report.xml,含语义化标签如、、 -
编写 XSLT 样式表(如
report.xsl):把 XML 元素映射为 XSL-FO 标签,例如: -
用 XSLT 引擎转换:命令行或程序调用(如
xsltproc report.xsl report.xml > report.fo),生成.fo文件 -
用 FO 处理器渲染 PDF:例如 Apache FOP:
fop -fo report.fo -pdf report.pdf
关键 XSL-FO 概念与常用标签
FO 文档根元素是 ,内部包含三大部分:
-
页面布局定义(
):声明页面模板(如 A4、带页眉页脚的 master page) -
页面序列(
):指定使用哪个 master,以及内容流() -
内容块容器:如
(段落)、(行内样式)、、等,支持 margin、padding、font、text-align 等属性
注意:FO 不支持浮动、Flexbox 或 CSS Grid 那类动态布局,所有位置需显式控制(如绝对定位靠 或 实现有限交互)。
实用建议与注意事项
- 初学者推荐用 Apache FOP(开源、Java 实现、文档较全),但对复杂中文/字体支持需手动配置 fonts.xml
- 中文 PDF 必须显式指定支持中文字体(如 Noto Sans CJK),否则显示方块或空白
- 调试 FO 文件可用
fop -fo xxx.fo -awt在图形界面预览(仅限本地开发) - 若只需简单报表,可考虑替代方案:JasperReports(基于 JRXML)、Docx4j(转 Word 再转 PDF)、或现代 HTML+CSS Paged Media(用 WeasyPrint / Prince 渲染)
基本上就这些。XSL-FO 不复杂但容易忽略字体和分页细节,掌握核心流程 + 一个 FO 处理器,就能稳定产出结构化 PDF。










