XSL-FO 简介

XSL-FO 简介
herong 原创  (参与分:13,专家分:10)   发表:2003-6-26 下午8:48   更新:2003-6-28 上午7:04   版本:1.0   阅读:3602

和荣笔记 - XSL-FO 与 XHTML
========

杨和荣

版本 2.01,修改于2002年12月23日


XSL-FO 简介
========


什么是 XSL-FO?
--------

XSL-FO:一种建立在 XML 基础之上的附加排版语言。它的工作原理是在原始文字资料之中
加入 XML 语句,其作用是控制原始文字资料的排版格式。XSL-FO 其实和 TeX 非常相似,而 TeX 
在十五年以前就广泛用于各种科技文献排版之中。

XSL-FO 主要特点:

- XSL-FO 采用 XML 语言格式。

- XSL-FO 也可以和 XSL 转换语言结合使用,对被处理的 XML 文件产生两种效果:
一,内容转换;二,打印排版。


“世界你好!”实例
--------

下面是我的第一个 XSL-FO 实例,hello.fo:
[pre]
<?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="my_page" margin="0.5in">
   <fo:region-body/>
  </fo:simple-page-master>
 </fo:layout-master-set>
 <fo:page-sequence master-reference="my_page">
  <fo:flow flow-name="xsl-region-body">
   <fo:block>Hello world!</fo:block>
  </fo:flow>
 </fo:page-sequence>
</fo:root>
[/pre]
请注意:

- 这是一个完整的 XML 文件,其根元素名称为“fo:root”。

- 文中所有元素的名称都有“fo:”前坠,代表 XML 名称空间:“http://www.w3.org/1999/XSL/Format”。

有了 XSL-FO 文件后的下一个问题是用什么软件来处理这样的文件。为此我作了一些调查和测试:

- 我没有什么方法可以用 MS Internet Explorer 6.0 显示 XSL-FO 文件。

- XML Spy 可以用来编辑 XSL-FO 文件,但是我不知道怎样用它显示 XSL-FO 文件。

- 我在网络上查找一番之后,发现了 FOP。试用效果不错,而且能直接生成 PDF 文件。


安装 FOP
--------

经过初步调查,我发现 FOP (Formatting Objects Processor) 似乎是现在最常用的 XSL-FO 
处理软件。下面是安装 FOP 的步骤:

1。到 http://xml.apache.org/dist/fop/ 提取 fop-0.20.5rc2-bin.tar.gz

2。用 WinZIP 将 fop-0.20.5rc2-bin.tar.gz 解包,把内容放入 \local\fop-0.20.5rc2

3。建立一份指令文件,run_fop.bat:
[pre]
\local\j2sdk1.4.1_01\bin\java -cp \local\fop-0.20.5rc2\build\fop.jar;
   \local\fop-0.20.5rc2\lib\xercesImpl-2.2.1.jar;
   \local\fop-0.20.5rc2\lib\xalan-2.4.1.jar;
   \local\fop-0.20.5rc2\lib\avalon-framework-cvs-20020806.jar;
   \local\fop-0.20.5rc2\lib\batik.jar org.apache.fop.apps.Fop
   %1 %2 %3 %4 %5 %6
[/pre]
注意,这是一条指令,必须写成一行,而且 .jar 文件名之间不能有空格。由于显示宽度的限制,
我不得不把这一条指令写成几行。

如果你在一个指令窗口中运行上述指令文件,得到下面的结果:
[pre]
run_fop
USAGE
Fop [options] [-fo|-xml] infile [-xsl file] [-awt|-pdf|-mif|-pcl|-ps
   |-txt|-at|-print] <outfile>
 [OPTIONS]
  -d          debug mode
  -x          dump configuration settings
  -q          quiet mode
  -c cfg.xml  use additional configuration file cfg.xml
  -l lang     the language to use for user information
  -s          for area tree XML, down to block areas only
...
[/pre]
你的安装便是成功的。

根据使用说明,FOP 有两个主要功能:

- 将 XSL-FO 文件排版生成 .txt,.pdf,或者 .ps 文件。

- 按照 XSLT 文件所给转换和排版语句,将 XML 文件转换并排版生成 .txt,.pdf,或者 .ps 文件。


将 XSL-FO 文件排版生成 .txt 文件
--------

首先让我们作一个简单的例子,将 hello.fo 排版生成一个 .txt 文件。请运行下面的指令:
[pre]
run_fop -fo hello.fo -txt hello.txt
[/pre]
你会得到如下的信息:
[pre]
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] FOP 0.20.5rc2
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] building formatting object tree
[INFO] setting up fonts
[INFO] rendering areas to TEXT
[INFO] [1]
[INFO] Parsing of document complete, stopping renderer
[INFO] writing out TEXT
[/pre]
从这些信息中,我们可以看出,FOP 使用了 Xerces SAXParser 来阅读 XSL-FO 文件。我们
还可以看出,排版后的结果只有一页。

为了验证结果,请将 hello.txt 文件用 notepad 打开,你会看到:
[pre]



        Hello  world!

...
[/pre]
排版结果完全正确。


将 XSL-FO 文件排版生成 .pdf 文件
--------

我们的第二个例子是将 hello.fo 排版生成一个 .pdf 文件。请运行下面的指令:
[pre]
run_fop -fo hello.fo -pdf hello.pdf
[/pre]
你会得到如下的信息:
[pre]
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] FOP 0.20.5rc2
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] building formatting object tree
[INFO] setting up fonts
[INFO] [1]
[INFO] Parsing of document complete, stopping renderer
[/pre]
然后请用 Adobe Reader 打开 hello.pdf,你会看到“Hello world!”被正确地排版在
页面的左上角。这个结果非常鼓舞人心,我对 FOP 的感觉越来越好了。


将 XML 文件转换排版生成 .pdf 文件
--------

在以上两个例子中,我们将原始文字资料已经和排版语句结合在一起了。在这个例子里,
我们将使用两个输入文件:一个是原始文字资料文件 hello_xsl.xml,一个是转换和排版
语句文件 hello_fo.xls。

hello_xsl.xml:
[pre]
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="hello.xsl"?>
<p>Hello world!</p>

hello_fo.xsl:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="p">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
 <fo:layout-master-set>
  <fo:simple-page-master master-name="my_page" margin="0.5in">
   <fo:region-body/>
  </fo:simple-page-master>
 </fo:layout-master-set>
 <fo:page-sequence master-reference="my_page">
  <fo:flow flow-name="xsl-region-body">
   <fo:block>
   -<xsl:value-of select="."/>-
   </fo:block>
  </fo:flow>
 </fo:page-sequence>
</fo:root>
 </xsl:template>
</xsl:stylesheet>
[/pre]
请注意:

- 排版指令“fo:*”被嵌入在转换指令“xsl:*”之中。

- 转换指令除了引入了排版指令以外,还将原文字资料作了简单的转换,在其首尾各加了
一字符:“-”。

现在请运行下面的指令:
[pre]
run_fop -xml hello_xsl.xml -xsl hello_fo.xsl -pdf hello.pdf
[/pre]
如果你打开 hello.pdf,转换后的文字资料“-Hello world!-”被正确的排版在页面的左上角。


XML 文件的转换处理
--------

在 FOP 软件包里,还有一个 XML 文件处理软件:“xalan”。
它的功能是对 XML 文件作转换处理。下面是 xalan 的运行指令文件,run_xalan.bat:
[pre]
\local\j2sdk1.4.1_01\bin\java 
   -cp \local\fop-0.20.5rc2\lib\xercesImpl-2.2.1.jar;
   \local\fop-0.20.5rc2\lib\xalan-2.4.1.jar 
   org.apache.xalan.xslt.Process %1 %2 %3 %4 %5 %6
[/pre]
让我们借用上面最后一个例子来试验,使用 xalan,安照 hello_fo.xml 来转换 hello_xsl.xml:
[pre]
run_xalan -in hello_xsl.xml -xsl hello_fo.xsl -out hello.out
[/pre]
下面是转换后的结果 hello.out:
[pre]
<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"><fo:layout...
   -Hello world!-
   </fo:block></fo:flow></fo:page-sequence></fo:root>
[/pre]
这个结果和我们的预计是一致的。排版语句被完整地保留下来了,原文字资料也被作过转换。

结论一:XML 文件用于组织原始文字资料,XSL 文件用于定义资料转换规则。如果需要,
转换规则内部还可以嵌入排版规则,用以控制资料的显示和打印。

结论二:FOP 软件可以用于资料转换处理,可以用于资料排版处理,还可以用于资料转换和
排版的一次性处理。

其它有关文章:
http://www.geocities.com/herong_yang

版权声明
本篇文章对您是否有帮助?  投票:         投票结果:     1        0


  评论人:itjoe    参与分: 66    专家分: 0 发表时间: 2003-7-1 上午10:19
补充一点:
配置使用内嵌字体

配置中文字体
1.    制作font metric文件
a.如果是ttc类型的集合字库
  java org.apache.fop.fonts.apps.TTFReader -ttcname "SimSun" c:\winnt\fonts\simsun.ttc simsun.xml
注意大小写敏感。

b.如果是ttf类型的字体文件
java org.apache.fop.fonts.apps.TTFReader C:\WINNT\Fonts\msgothic.ttf
msgothic.xml

2.    配置userconfig.xml文件的font部分。
<font metrics-file="msgothic.xml" kerning="yes"
embed-file="C:\WINNT\Fonts\msgothic.ttf">
<font-triplet name="MSGothic" style="normal" weight="normal"/>
</font>

  评论人:llystar    参与分: 33    专家分: 0 发表时间: 2004-4-7 下午1:30
请问FOP生成中文pdf中的拷贝问题,不知如何解决?好像FOP没有解决好字体编码的映射问题,我现在做的项目中要解决这这个问题,郁闷啊...

你可能感兴趣的:(XSL)