如何在程序中嵌入FOP

FOP使用方式

FOP有3种使用方式,分别为命令行,程序嵌入,XT 嵌入,这里将主要介绍如何在程序中嵌入FOP功能。将XML文件转换为PDF实际上分为2步,第1步是利用XSLT将XML转换为XSL-FO,第2步是将XSL-FO转换为PDF。这里不想讲述XSLT和XSL-FO有关的知识(这方面的文档相当多),而只将讲述如何进行第2步的转换编程。

在程序中嵌入FOP

1. 范例simple.fo文件

												
														
												
										

上述是一个很简单的fo文件,将显示两块文字,具体的fo语法请读者自己查看相应资料。

2. 简单调用FOP 
FOP提供的所有对外调用接口都在org.apache.fop.apps下,其下的AWTStarter.class是一个用AWT写的转换结果预览程序,CommandLineStarter.class提供命令行使用方式,PrintStarter.class提供打印接口,XTDriver.class提供XT嵌入方式接口,Driver.class则是我们要在这里讨论的程序接口。下面这个程序foptest.java演示了FOP的最简单也是最常用的使用方式。

												
														
												
										

上述程序将接受两个命令行参数,第一个参数是需要转换的fo文件名,第二个参数是输出文件名。在CLASSPATH中添加下述jar文件: {FOP安装目录}\build\fop.jar 
{FOP安装目录}\lib\batik.jar 
{FOP安装目录}\lib\xalan-2.0.0.jar 
{FOP安装目录}\lib\xerces-1.2.3.jar 
{FOP安装目录}\lib\avalon-framework-4.0.jar 
{FOP安装目录}\lib\logkit-1.0b4.jar 
{FOP安装目录}\lib\jimi-1.0.jar 
然后执行java foptest simple.fo simple.pdf

东方字符的显示在FOP的早期版本中并不被支持,最早尝试对FOP打补丁以解决显示东方字符的是日本人。从FOP 0.16版本开始,他们在sourceforge上建立了一个jpfop项目来解决日文字符的显示问题,使用相同的方法也可以被用来显示中文字符。幸运的是,当前的FOP版本已经能很好的解决中文显示的问题,不再需要我们打补丁,下面是在FOP中使用中文的步骤:

  • 第一步,建立font metrics文件对于后缀为ttf的TrueType字体文件,我们可以执行以下命令来产生font metrics文件 java org.apache.fop.fonts.apps.TTFReader C:\WINNT\Fonts\simkai.ttf simkai.xml
    这里simkai.xml就是我们为楷体产生的font metrics文件。对于Windows下的宋体来说,存在的是后缀为ttc的TrueType Collection文件,即包含多个TrueType的文件,这时首先要做的是得到这个Collection中所有TrueType的名字,执行以下命令(这个命令其实有错误): 
    java org.apache.fop.fonts.apps.TTFReader C:\WINNT\Fonts\simsun.ttc simsun.xml

    产生输出如下:


    后面的异常是由于我们给的参数不对(因为ttc不是ttf字体文件)造成的,FOP开发小组知道这个问题,但是可能觉得无关痛痒而没去修正它。无论怎样,我们得到了我们要得到的结果,里面含的字体名为SimSun和NSimSun,通过以下命令为其中的SimSun字体产生font metrics文件: java org.apache.fop.fonts.apps.TTFReader -ttcname "SimSun" C:\WINNT\Fonts\simsun.ttc simsun.xml -ttcname后面指定需要从ttc文件中提取的字体名称

  • 第二步,登记上述字体

    在FOP主目录下的conf子目录下有一个userconfig.xml文件,为了方便,我们将它和上一步产生的simsun.xml,simkai.xml都拷贝到与我们的演示程序同一目录下。在userconfig.xml的最后几行有一个<fonts></fonts>标记区,我们在其中加入以下项:


    其中metrics-file里可以设相对路径或绝对路径(因为我们这里在同一目录下,所以只需写文件名即可),font-triplet里的name可以自己自由设定,并不要求与字体名一样。设定这个名字后,在fo里就只能通过这个名字引用这个字体。

    为了演示中文显示,范例simplecn.fo文件为


    上述fo文件使用两种字体分别显示一行文字,注意在<fo:block>的属性中的font-family被我们设成userconfig.xml中相应的名字。

    由于需要读入userconfig.xml来得到字体信息,程序主体修改如下:

    总结

    FOP从技术上说无疑是一个非常优秀的产品,但是目前它对用户的开发支持显然很欠缺。FOP的开发小组也意识到了这个问题,他们允诺在将来会建立一个专门的Web站点以及丰富它的文档。如果现在就想使用更方便的产品的话,你也可以考虑一些商用产品,如RenderX和X2P。

    另外需要注意的是,今年8月推出的FOP 0.20.1版本非常的不好,不但一些范例无法运行,而且附带的源代码有若干错误,而这个9月29日推出的0.20.2RC版本有极大的改进,建议大家尽快升级到这个版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值