1、把 XML 转成 PDF 的有效工具:FOP格式对象处理器 (FOP) 是一个源码开放的 Java API,可以把 XML 数据转换成 PDF 格式,同样的,也可以转成其他相关的格式,象 TXT, SVG, AWT, MIF, 和 PS. 该软件是在Apache XML 项目下开发的,可以免费使用。这篇文章展示了如何开始使用 FOP。FOP 的主要优点是它转换 XML 数据到 PDF 格式报告的性能,使用的了格式化树结构。我们提供的绝大多数的例子将会集中展示这个非凡的转换,但也会把 XML 数据转成 Java AWT 格式.这篇文章的面向于精通 XML 和 XSLT 的开发者的。要获取更多的关
2、于 XML 的信息,可以到 XML.com。安装FOP 可以从 FOP 发布目录上面下载。下载文件是一个 gzip 文件包,它包括两个发行包。其中 fop-0.20.4-src 发行包包含源代码,使用它可以自己用 Ant 进行编译。fop-0.20.4-bin 发行包包含了运行部分, 里面没有源代码和 Java 文档。把源码包解压到你选择的一个目录下。你会得到程序解压生成的 fop-0.20.4 主目录 和一系列子目录:build, conf, docs, hyph, lib 和 src. build 包含最新的 FOP 运行文件 fop.jar, 这个文件应该被放在应用程序的CLASSPAT
3、H 中。 conf 包含了确定的配置文件,这个我们将在后面进行讨论。 docs 包含了各种各样的例子,文档, 和一些图形图片。 hyph 包含了不同语言的连字符信息。 lib 包含了所有的外部.jar 文件,这些文件对于 FOP 自己的运行是必需的。他们包括 Avalon, Batik, Xalan, 和 Xerces。 由于这篇文章 是着重介绍 FOP 的, 我们不会深入讨论这些 API。只需要知道 FOP 使用这些 API就够了。在配置的时候我们需要把这些库放到应用程序的 CLASSPATH 中。 src 包含了所有源代码。FOP 简介图形 1. FOP 架构.FOP 是一个被 3W 组织
4、在 XSL 说明书 中指定的用于理解格式化对象的工具。说明书的第一部分说明了 XSLT 的转化处理。我们感爱好的是第二部分, 里面说明了我们所说的格式化对象(FO)的处理。 说明书中的这一部分定义了独立输出的格式化对象, 它由一系列的文档风格以及布局的词表组成。举个例子来说, 其中的一个格式化对象是fo:simple-page-master, 它用来说明一个页面模板,它包含一些相关的属性 (边界,页头, 等等) 。就这样,象 FOP 这样的工具可以读吃这些信息并且把这些信息转化成想要的格式输出(PDF/TXT)。很重要的一点是相同的风格信息可以产生不同的输出。 一篇 FO 文档简单的说就是一篇
5、 XML 文档。 它的命名空间由 W3C 站点 定义。它 可以包含任何在这个命名空间中元素。你能够手工的创建这样的文档并且为每一个元素指定确切的值,每一个元素应该被输出。然而,更为通用的方法是写一个 XSLT 的样式表,来治理你的 XML 数据文件, 根据你的样式标的规则来进行转换 , 从而产生最终的 FO 文档。动态生成的数据能够跟一个存在的样式表绑定来产生 FO 文档。虽然 FOP 的主要意图是处理 FO 文档, 但是他也能够通过一个样式表完成已存在数据文件(XML)的转换。我们假定在一 XSL 文件的表中有你的以 XML 个是存放的商务数据以及样式表信息。假如你把这两者提供给 FOP,
6、FOP 将会把这些信息转换成一篇临时的 FO文档并且最终生成你期望的输出。一个简单的例子例子文件下载这篇文章中的例子文件 。这个 .zip 文件包含了下列文件: krusty.fo, krusty.pdf, krusty.xml, and krusty.xsl.了解了原理以后,让我们实际运行一下 FOP。 打开一个命令窗口并且定位到你的FOP 安装目录下。FOP 的根目录下面包含了两个运行体: 一部分是可运行在 Unix 系统上的 shell 脚本,另一部分是用于 windows 环境的一系列文件,通过这些文件 FOP 能够通过命令行来运行。根据你的系统情况来运行相关的脚本。FOP 将会报没有
7、输入参数的提示,从而输出一系列的运行例子。好的这意味着你现在可以开始使用 FOP 了。让我们从创建一个简单的 FO 文件开始。假如你想要看到最终结果, 可以点击这里krusty.fo.就像我前面所讲到过的,一个 FO 文件是一个简单的类似表的 Xml 文件。因此开开你的文本编辑器并输入第一行:所有的 FO 文件必须有这个外层元素作为根http:/www.w3.org/1999/XSL/Format“. 这个 根 元素的后面跟着元素,它表明了我们文档的页面布局。page-height=“29.7cm“ page-width=“21cm“margin-top=“1cm“ margin-bottom
8、=“2cm“ margin-left=“2.5cm“ margin-right=“2.5cm“就像你看到的, 主要的布局设置包括不同的简单的可以放在里面的页面布局定义。在我们的例子中,已经定义了一个单独的简单页面治理者,在里面,我们可以看到简单页面的属性,我们给它起的名字 simple (这个名字以后我们会用到 ), 这个页面的高度是 29.7 厘米, 宽度是 21 厘米, 顶端空白为 1 厘米, 等等。我们可以定义许多我们想要的简单页面并且赋给他们不同的名字,这些名字我们会在后面饮用这些页面的时候用到。现在我们已经定义了页面队列术语和大小与它们将来看上去模样的对应,进而我们需要定义实际的目录
9、持有者。下面是我们使用 标记的位置:注重在定义页面顺序的时候,我们引用到了简单的页面治理者, 之所以称为简单, 是因为我们在前面已经定义了。这意味着我们的内容将被简单页面治理者限定在一个页面之内。实际的内容被放在 元素中。在元素中的 元素,开始一个段落并定义这个段落的每个属性。就此出来说我们设开头文字“Krusty the Clown,“的字体为 sans serif 字体, 背景色为蓝色,文字排序方式为居中。简单的, 对于下一个块, 我们设定字体大小为 12 磅。文字排序方式根据具体情况而定。font-family=“sans-serif“ line-height=“24pt“space-a
10、fter.optimum=“15pt“background-color=“blue“color=“white“text-align=“center“padding-top=“3pt“Krusty the Clownfont-family=“sans-serif“ line-height=“15pt“space-after.optimum=“3pt“text-align=“justify“这个备忘录解释了为什末 Krusty the Clown 是我们做好的客户。我们需要从现在开始关心他的需求,从而确保他的宠物猴子有足够的香蕉可以吃。最后, 关闭所有打开的标记并且保存为文件 krusty.fo,
11、这个文件存放在 FOP 根目录下。现在是看 FOP 运作的时候了。在 FOP 的根目录下,敲入如下的命令:fop krusty.fo krusty.pdfFOP 将会运行并且在相同的目录下将我们的 krusty.fo 文件转化为一个 krusty.pdf 文档。通过双击打开文件,检查最终的输出是否真的符合我们的要求。 对 FO 文件进行一点改变,然后看看在输出中有什末影响。 从改变内容中的文字开始,继而试着改变风格,边界, 颜色, 字体, 等等, 然后看所有的变化是怎样的。XSL + XML通过运行简单的例子, 你将会注重到手工的产生一个 FO 文档是很难的。直接的修改和改变 FO 文件实在是
12、令人讨厌的,我们正在失去内容独立性的优越性。因此通常地, 你将会换用一个 XSLT 样式表来把你的 XML 数据转化成为一篇 XSL-FO 文件。你不需要在外部或者为这个转换明确地做什末事情来转换到 FOP。你可以为 FOP 指定样式表和 XML 文件,这样 FOP 就可以自己进行转化了。让我们看看下面的例子,它会告诉我们这些是怎样实现的。我们将从前面的例子中把数据提取出来放到一个 XML 文件 中。因此我们的 XML 数据文件看书去就会使这个样子的:Krusty the Clown这个备忘录解释了为什末 Krusty the Clown 是我们做好的客户。我们需要从现在开始关心他的需求,从而
13、确保他的宠物猴子有足够的香蕉可以吃。把这个文件保存在 FOP 的根目录下。我们现在需要生成一个样式表,然后用它来转化这个数据文件为 FO 文件。要想察看最后的结果,可以下载最后的 XSL 文件 (这个文件也在 FOP.zip 例子文件中)。xmlns:xsl=“http:/www.w3.org/1999/XSL/Transform“xmlns:fo=“http:/www.w3.org/1999/XSL/Format“像期望的那样, XSL 文档的开头是 XML 声明, 紧跟着是命名空间的声明。假如你以前曾经用过 XSLT, 你会注重到现在我们试图做的是对我们的 XML 中的标记进行匹配,替换并
14、使用它们来转化为另一个 XML 文件,也就是我们的 FO 文件。因此上面的文本行寻找和匹配根 标记并使用它后面的内容来替换它。这个内容, 下面是它的概要, 基本来说,它是我们简单布局治理者的定义,正如我们上面对 FO 文件所描述的那样。http:/www.w3.org/1999/XSL/Format“page-height=“29.7cm“ page-width=“21cm“margin-top=“1cm“ margin-bottom=“2cm“ margin-left=“2.5cm“ margin-right=“2.5cm“用实际的格式化信息替换数据标记从而形成我们的 XSL 文件。font
15、-family=“sans-serif“ line-height=“24pt“space-after.optimum=“15pt“background-color=“blue“color=“white“text-align=“center“padding-top=“3pt“font-family=“sans-serif“ line-height=“15pt“space-after.optimum=“3pt“text-align=“justify“正如你所看到的, 在 FO 标记术语中的模板匹配项被相应的格式化信息替换了。样式表包括样式表的结束标记。把这个文件保存为 krusty.xsl 文件,并存放在 FOP 根目录下。下面通过运行来看看我们努力的结果, 在 FOP 的根目录下输入下面的命令行:fop -xml krusty.xml -xsl krusty.xsl -pdf krusty.pdf因而, 你正在指定输入的 XSL 和 XML