网上对FOP支持中文的介绍还不少,但都是针对0.20版本的,FOP都发展这么久了,结构已经完成不一样了,如何让FOP支持TrueType中文,FOP的压缩包里的examples\fo\advanced\目录提供了说明用的PDF文件,但有一些错误,下面结合我的实现,以支持Windows的Simsun为例,列出将xml转为pdf的整个过程:
Step 1:生成字体相关的xml文件simsun.xml
FOP的例子是要求在命令行下输入这样的命令:
java org.apache.fop.fonts.apps.TTFReader C:\WINNT\Fonts\simsun.ttc simsun.xml
我觉得命令行不好用,比较麻烦,于是在Eclipse下用Java代码实现了:
import org.apache.fop.fonts.apps.TTFReader;
public class ReadTTFFont {
public static void main(String[] args) {
String[] parameters = new String[] {
// 以下两行参数是针对TrueType Collection的,如果一个字体文件里只有一种字体,则不需要以下两行
"-ttcname",
"SimSun",
"c:\\WINDOWS\\Fonts\\simsun.ttc", //字体文件位置
"c:\\temp\\simsun.xml", };//生成的xml文件位置
TTFReader.main(parameters);
}
}
Step 2:修改用户定义文件,原说明文档里是这么说的:“Edit conf/userconfig.xml and add the following to the section”,但你是无论如果也找不到conf/userconfig.xml这个文件的,因为相应文件应该是conf/fop.xconf,虽然文件改名了,但说明还是用老版本的,真是无语。那我们就复制一份fop.xconf文件,将文件内容修改为:
<?xml version="1.0"?>
<fop version="1.0">
<base>.</base>
<renderers>
<renderer mime="application/pdf">
<filterList>
<value>flate</value>
</filterList>
<fonts>
<font metrics-url="file:///c:/temp/simsun.xml" kerning="yes" embed-url="file:///c:/WINDOWS/Fonts/simsun.ttc">
<font-triplet name="Simsun" style="normal" weight="normal"/>
<font-triplet name="Simsun" style="normal" weight="bold"/>
<font-triplet name="Simsun" style="italic" weight="normal"/>
<font-triplet name="Simsun" style="italic" weight="bold"/>
</font>
</fonts>
</renderer>
</renderers>
</fop>
注意:上述节点跟说明文档里的不一样,说明文档说是跟Type 1字体一样,其实不是。另外,metrics-url属性值是和你运行FOP的程序的位置有关,是相对路径,而embed-url就是字体文件的位置,子点的name属性就是字体名称,在带引的时候就是使用这个名字。我这里原本是将simsun.xml和c:/WINDOWS/Fonts/simsun.ttc放在fop.xconf相同目录下,将上面路径写为<font metrics-url="simsun.xml" kerning="yes" embed-url="simsun.ttc">,程序不能运行,后来看了一下
fop-0.94/docs/0.94/fonts.pdf 发现 embed-url 要写成"file:///.../simsun.ttc" 格式
Step 3: 修改相应的xsl文件,应用上Simsun字体。在相应的节点上添加字体属性font-family="Simsun" ,例如是字点等。
Step 4:将XML转为PDF,使用FOP自带的例子即可,examples\embedding\java\embedding\ExampleXML2PDF.java,但要修改用户配置文件,在这两行之间插入一行:
FopFactory fopFactory = FopFactory.newInstance();
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
插入以下这行:
fopFactory.setUserConfig("./examples/fop/fop.xconf");//以用户运行目录为准的相对路径
OK,这样就可以利用FOP将XML转为PDF ,并且解决中文显示的问题了!