XSL-FO 页面学习笔记

XSL-FO (eXtensible Stylesheet Language Formatting Objects) 是一种用来描述如何格式化 XML 数据的语言。通过使用 XSL-FO,可以将 XML 数据转换为具有多个页面、分栏、表格、图像、超链接等丰富布局的 PDF 或其他格式文档。

XSL-FO 基本结构

根元素 fo:root

XSL-FO 以 fo:root 元素作为根元素,下面是一个基本的 fo:root 结构:

xmlCopy Code
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> ... </fo:layout-master-set> <fo:page-sequence> ... </fo:page-sequence> </fo:root>

其中,fo:layout-master-set 元素定义了文档中使用的版式(或称布局模板),fo:page-sequence 元素则定义了一个页面序列(即一个文档)。一个文档可以包括多个页面序列。

版面布局 fo:simple-page-master

fo:layout-master-set 中定义版式模板,最常见的是 fo:simple-page-master 元素,如下所示:

xmlCopy Code
<fo:simple-page-master master-name="mypage" page-height="29.7cm" page-width="21cm" margin-top="0.5cm" margin-bottom="1cm" margin-left="2.5cm" margin-right="2cm"> <fo:region-body margin-top="3cm" margin-bottom="2cm"/> <fo:region-before extent="3cm"/> <fo:region-after extent="2cm"/> </fo:simple-page-master>

其中,master-name 属性为模板名称,page-heightpage-width 分别为页面高度和宽度,margin-* 属性为边距。此外,还可以定义不同的区域(如正文区、页眉区、页脚区)。

页面序列 fo:page-sequence

fo:page-sequence 元素定义了一个页面序列,如下所示:

xmlCopy Code
<fo:page-sequence master-reference="mypage"> ... </fo:page-sequence>

其中,master-reference 属性指定使用哪个版式模板,可以指定多个页面序列来生成多个文档。

区域 fo:region-xxx

在版式模板中,fo:region-xxx 定义了不同的区域,包括正文区、页眉区、页脚区等。例如:

xmlCopy Code
<fo:simple-page-master master-name="mypage"> <fo:region-body margin-top="3cm" margin-bottom="2cm"/> <fo:region-before extent="3cm"/> <fo:region-after extent="2cm"/> </fo:simple-page-master>

其中,fo:region-body 定义了正文区,fo:region-beforefo:region-after 分别定义了页眉和页脚区域。

XSL-FO 元素样式

字体样式

字体样式用于定义字体、大小、颜色等属性,如下所示:

xmlCopy Code
<fo:block font-family="Arial" font-size="12pt" color="red">Hello, world!</fo:block>

其中,font-family 属性定义字体,font-size 属性定义字号,color 属性定义字体颜色。

对齐样式

对齐样式用于定义文字或块的对齐方式,如下所示:

xmlCopy Code
<fo:center>居中文字</fo:center> <fo:block text-align="right">右对齐文字</fo:block>

边距样式

边距样式用于定义文本框或区域的边距,如下所示:

xmlCopy Code
<fo:block margin-top="5mm" margin-bottom="10mm">有上下边距的文本框。</fo:block> <fo:region-body margin-top="2cm" margin-bottom="2cm">有上下边距的区域。</fo:region-body>

行高样式

行高样式用于定义文本行的高度,如下所示:

xmlCopy Code
<fo:block line-height="1.5em">1.5倍行距的文本</fo:block>

布局样式

布局样式用于定义版式、分栏等布局,如下所示:

xmlCopy Code
<fo:simple-page-master master-name="mypage" page-height="29.7cm" page-width="21cm" margin-top="0.5cm" margin-bottom="1cm" margin-left="2.5cm" margin-right="2cm"> <fo:region-body margin-top="3cm" margin-bottom="2cm"/> <fo:region-before extent="3cm"/> <fo:region-after extent="2cm"/> </fo:simple-page-master> <fo:flow flow-name="xsl-region-body"> <fo:block-container column-count="2" column-gap="10mm">两栏布局。</fo:block-container> </fo:flow>

其中,fo:simple-page-master 定义版式模板,fo:block-container 定义块容器并设置为分栏布局。

示例

下面是一个简单的 XSL-FO 示例,用于显示一张图片和一段文字:

xmlCopy Code
<?xml version="1.0" encoding="UTF-8"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="mypage" page-height="29.7cm" page-width="21cm"> <fo:region-body margin-top="3cm" margin-bottom="2cm"/> <fo:region-before extent="3cm"/> <fo:region-after extent="2cm"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="mypage"> <fo:flow flow-name="xsl-region-body"> <fo:block font-family="Arial" font-size="12pt" color="black" text-align="center"> XSL-FO 页面学习笔记 </fo:block> <fo:block margin-top="20mm" margin-bottom="20mm" text-align="center"> <fo:external-graphic src="https://picsum.photos/400/300"/> </fo:block> <fo:block font-family="Arial" font-size="10pt" color="gray" text-align="justify"> XSL-FO 是一种用来描述如何格式化 XML 数据的语言。 </fo:block> </fo:flow> </fo:page-sequence> </fo:root>

该示例将生成一份 PDF 文档,包括一张图片和一段文字,并使用了多个 XSL-FO 样式元素。