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-height
与 page-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-before
和 fo: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 样式元素。