XSL-FO基础知识(二)

XSL-FO 文档概述 第 1 页(共13 页)


XSL-FO 文档定义了制作高质量可打印文档时非常重要的几件事情:

  • 有关页面的实际大小的信息(信纸和 A4 等等)
  • 有关页边距(顶部、左边、底部和右边)、页眉和页脚和页面其它特性的信息
  • 有关文本的字体、字体大小、颜色和其它特征的信息
  • 要打印的实际文本,由描述段落、突出显示、表等类似物的元素来标记

教程的这一章介绍纸张大小、页边距和其它页面特性,同时还介绍了用于描述它们的 XSL-FO 元素。

在讨论实际元素之前,让我们先来看看将 XML 文档转换为 PDF 文件的过程。

将 XML 文档转换为 PDF 文件 第 2 页(共13 页)


将 XML 文档转换为 PDF 文件需要两个基本步骤:

  1. 用 XSLT 样式表将 XML 文档转换为由 XSL-FO 元素构成的文件。要执行这一转换,只需用 XML 文档和样式表(本教程的第 2 部分包含将 XHTML 元素转换成格式化对象的 XSLT 样式表)调用 XSLT 处理器。
  2. 用某种显示引擎(例如,本教程示例中使用的 FOP)将 XSL-FO 元素转换为 PDF 文件。这个步骤甚至更简单:您只需调用 FOP 工具,将 XSL-FO 文件的名称和 PDF 文件的名称传递给它即可。

下图描绘了这一过程:

FOP 过程图


XSL-FO 文档结构一瞥 第 3 页(共13 页)


下图简单说明了 XSL-FO 文档的结构:

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-topmargin-bottom

    定义页面顶部和底部的页边距。可接受的单位有点(point)、派卡(pica)、英寸(inch)和厘米(centimeter)。

  • page-widthpage-height

    定义实际页面的大小。该示例定义了信纸大小的页面;要使用 A4 大小的纸张,将属性设置为 page-width="21cm"page-height="29.7cm" 即可。

  • margin-leftmargin-right

    定义页面左边和右边的页边距。

在研究 <fo:region-body> 元素本身之前,先考虑测量单位。

XSL-FO 文档中的单位 第 8 页(共13 页)


XSL-FO 支持这些用于长度特性的实际单位,以用于测量象 margin-leftpage-widthpage-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-bodyxsl-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 文件如下图所示:

带粗体和等宽字体的 PDF 的图片

现在您已准备好学习关于用 XSL-FO 来格式化文档的更多知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值