XSL-FO 文档概述 | 第 1 页(共13 页) |
XSL-FO 文档定义了制作高质量可打印文档时非常重要的几件事情:
- 有关页面的实际大小的信息(信纸和 A4 等等)
- 有关页边距(顶部、左边、底部和右边)、页眉和页脚和页面其它特性的信息
- 有关文本的字体、字体大小、颜色和其它特征的信息
- 要打印的实际文本,由描述段落、突出显示、表等类似物的元素来标记
教程的这一章介绍纸张大小、页边距和其它页面特性,同时还介绍了用于描述它们的 XSL-FO 元素。
在讨论实际元素之前,让我们先来看看将 XML 文档转换为 PDF 文件的过程。
将 XML 文档转换为 PDF 文件 | 第 2 页(共13 页) |
将 XML 文档转换为 PDF 文件需要两个基本步骤:
- 用 XSLT 样式表将 XML 文档转换为由 XSL-FO 元素构成的文件。要执行这一转换,只需用 XML 文档和样式表(本教程的第 2 部分包含将 XHTML 元素转换成格式化对象的 XSLT 样式表)调用 XSLT 处理器。
- 用某种显示引擎(例如,本教程示例中使用的 FOP)将 XSL-FO 元素转换为 PDF 文件。这个步骤甚至更简单:您只需调用 FOP 工具,将 XSL-FO 文件的名称和 PDF 文件的名称传递给它即可。
下图描绘了这一过程:
XSL-FO 文档结构一瞥 | 第 3 页(共13 页) |
下图简单说明了 XSL-FO 文档的结构:
<fo:root>
元素包含 <fo:layout-master-set>
和 <fo:page-sequence>
。<fo:layout-master-set>
通常包含关于页面布局的信息,而 <fo:page-sequence>
包含您正在格式化的实际内容。
XSL-FO 文档结构详细介绍 | 第 4 页(共13 页) |
让我们先看一个简单的 XSL-FO 文档 ,以及它包含的标记与属性。尽管它看起来非常复杂,但不要被吓倒 ― 这个文件中的大多数内容从不改变。通常您不需要为每个项目考虑页面布局;您只要先创建一组有效的页面布局然后重复使用它们。
首先看看 <fo:root>
、<fo:layout-master-set>
、<fo:simple-page-master>
、<fo:region-body>
、<fo:page-sequence>
和 <fo:flow>
这几个元素;所有这些元素都定义文档各个方面。所有其它的项则包含内容 ― 随不同文档而变化的部分。下面就是该文件:
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="main"
margin-top="36pt" margin-bottom="36pt"
page-width="8.5in" page-height="11in"
margin-left="72pt" margin-right="72pt">
<fo:region-body margin-bottom="50pt" margin-top="50pt"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="main">
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="14pt" line-height="17pt">
This is a paragraph of text. Notice that as
<fo:inline font-style="italic">this meaningless
prose</fo:inline> drones on and on, the FOP
software automatically calculates line breaks for us.
Isn't that fascinating?
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
如果您想了解 PDF 版本是什么样子,请看看该文件 。
<fo:root> 元素 | 第 5 页(共13 页) |
XSL-FO 文档的根元素是 <fo:root>
元素。上面的样本文档在该元素中定义了 fo
名称空间前缀:
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
...
<!-- Everything else in the document -->
...
</fo:root>
通常,根元素包含一个 <fo:layout-master-set>
,然后是一个或多个 <fo:page-sequence>
。
<fo:layout-master-set> 元素 | 第 6 页(共13 页) |
<fo:layout-master-set>
元素指定页面定义。在简单的文档中,一个布局可能就足够了,但复杂的文档通常有几个页面定义。例如,您可能希望文档的奇数页和偶数页有不同的布局。可能某一章的第一页或者目录页需要独特的布局。您可以使用 <fo:simple-page-master>
元素来定义所需的每一种页面布局;然后将它们放在 <fo:layout-master-set>
元素中。
<fo:layout-master-set>
<fo:simple-page-master master-name="main"
margin-top="36pt" margin-bottom="36pt"
page-width="8.5in" page-height="11in"
margin-left="72pt" margin-right="72pt">
<fo:region-body margin-bottom="50pt" margin-top="50pt"/>
</fo:layout-master-set>
<fo:simple-page-master>
元素
第 7 页(共13 页)
<fo:simple-page-master>
元素定义某个特定页面的布局。下面是一个示例,其后是对每个属性的说明:
<fo:simple-page-master master-name="main"
margin-top="36pt" margin-bottom="36pt"
page-width="8.5in" page-height="11in"
margin-left="72pt" margin-right="72pt">
<fo:region-body margin-bottom="50pt" margin-top="50pt"/>
</fo:simple-page-master>
master-name
定义该页面 master 的名称。您可以创建几个不同的 <fo:simple-page-master>
元素,然后,当您需要在整个文档中使用不同页面布局时,可以引用其中的一个元素。
margin-top
和 margin-bottom
定义页面顶部和底部的页边距。可接受的单位有点(point)、派卡(pica)、英寸(inch)和厘米(centimeter)。
page-width
和 page-height
定义实际页面的大小。该示例定义了信纸大小的页面;要使用 A4 大小的纸张,将属性设置为 page-width="21cm"
和 page-height="29.7cm"
即可。
margin-left
和 margin-right
定义页面左边和右边的页边距。
在研究 <fo:region-body>
元素本身之前,先考虑测量单位。
XSL-FO 文档中的单位
第 8 页(共13 页)
XSL-FO 支持这些用于长度特性的实际单位,以用于测量象 margin-left
、page-width
和 page-height
这样的项:
单位 含义 cm
厘米 mm
毫米 in
英寸 pt
点(72 点 = 1 英寸) pc
派卡(12 点 = 1 派卡,6 派卡 = 1 英寸) px
像素(有时随格式化程序或设备的不同而有所不同,所以要小心使用) em
一个大写 M 的宽度
要获得更多的详细信息(包括像素的原理),可参阅 XSL-FO 规范(请参阅参考资料)。
<fo:region-body>
元素
第 9 页(共13 页)
XSL-FO 规范定义了页面上的五个区域;region-body
定义页面正中的主要区域的大小。下面是一个样本:
<fo:region-body margin-bottom="50pt" margin-top="50pt"/>
该元素为 region-body
区域定义了长度为 50 点的顶部和底部页边距。页面的其它四个区域是:
region-before
,页面顶部的区域(常用于页眉) region-after
,页面底部的区域(常用于页脚) region-start
,页面左边的区域 region-end
,页面右边的区域
下图演示了通常是如何在页面上安排这些区域的:
您用合适的 <fo:region-xxx>
元素定义每个区域的特性,并可以在以后引用这些区域。要引用不同的区域,可以使用它们的缺省名称,它们是 xsl-region-body
和 xsl-region-before
等。
注:这些定义假定文档中文本的书写方向是从左往右和从上往下的。如果您所用语言的字符是以其它方式书写的,则那四个外部区域可能指的是页面的不同区域。
<fo:page-sequence>
元素
第 10 页(共13 页)
<fo:page-sequence>
元素定义文档内使用的页面布局的序列。指定布局序列是一项高级技术,将在本教程系列的第二部分中介绍。现在,本文中的示例只是将一个名为 main
的 <fo:simple-page-master>
用于它所有的页面:
<fo:page-sequence master-reference="main">
master-reference
在这里指的是在<fo:simple-page-master> 元素中定义的 <fo:simple-page-master>
的 master-name
。正如您所料,如果所使用的 master-reference
在 XSL-FO 文档中没有定义,就会产生错误。
<fo:flow>
元素
第 11 页(共13 页)
<fo:flow>
元素定义了将在当前页边距、字体设置等之内流动的某些内容。换句话说,在此刻以前您所做的每件事都是定义页面的布局;现在您将学习如何插入要显示的某些内容。您可以依靠显示程序(本例中的 FOP)自动地或根据您指定的规则来计算所有的换行符、分栏符和分页符。
下面的示例指明该 <fo:flow>
元素包含文档主体的内容(请记住,xsl-region-body
是页面主要区域的缺省名称)。
<fo:flow flow-name="xsl-region-body">
由 flow-name
属性命名的区域必须是五个缺省名称之一或您在 XSL-FO 文档中定义的名称;您将在本教程系列的第二部分了解如何给各页面区域命名。现在,xsl-region-body
是您唯一需要考虑的。
用于内容的基本 XSL-FO 元素
第 12 页(共13 页)
用于格式化内容的两个主要 XSL-FO 元素是 <fo:block>
和 <fo:inline>
。以下是样本文档的内容:
<fo:block font-size="14pt" line-height="17pt">
This is a paragraph of text. Notice that as
<fo:inline font-style="italic">this meaningless
prose</fo:inline> drones on and on, the FOP
software automatically calculates line breaks for us.
Isn't that fascinating?
</fo:block>
<fo:block>
是最基本的元素,用于格式化一个文本块。您可以认为它类似于 HTML 中的 <p>
元素。<fo:block>
元素总是会产生一个换行。
<fo:inline>
在现有 <fo:block>
内定义一些新的文本特性。如果您希望用斜体显示一段文字中的几个单词(如示例中的单词),可以用 <fo:inline>
做到这一点。如果示例已经使用了 <fo:block>
元素,则用斜体显示的单词会作为单独的一段出现。
您的第一个 PDF 文件
第 13 页(共13 页)
要从示例文档创建 PDF 文件,可以用 FOP 工具将 simple.fo
转换为 simple.pdf
。假定您已经正确设置了类路径(在学习本教程需要什么工具,应如何配置这些工具中有描述),那么您可以用以下命令运行 FOP 工具来转换您的文件:
> java org.apache.fop.apps.Fop simple.fo simple.pdf
祝贺您!您已经从 XSL 格式化对象创建出了您的第一个 PDF 文件!如果您想要立即进行试验,可以向 <fo:flow>
元素添加更多元素。试着添加 bold(<fo:inline font-weight="bold">
)和 monospaced
(<fo:inline font-family="monospace">
)格式化对象以使 PDF 文件如下图所示:
现在您已准备好学习关于用 XSL-FO 来格式化文档的更多知识。