在Apache FOP中,如何以编程方式设置字体库,并且仍然从<directory>中加载字体?</directory>

时间:2010-09-16 17:39:08

标签: java fonts xsl-fo apache-fop

我正在使用Apache FOP 1.0。代码在不同的服务器上运行,因此我将字体放在每个服务器的实例根目录中。我的计划是以编程方式设置字体库(到服务器实例根目录,再加上“/ fonts /”),在我的fop配置文件中,设置相对于此字体库的字体路径。这是制作FopFactory的代码片段:

    private static final String FONT_BASE = System.getProperty("com.sun.aas.instanceRoot") + "/fonts/";

public FOPWrapperBean() throws Exception {
    ClassLoader loader = this.getClass().getClassLoader();
    InputStream fopStream = loader.getResourceAsStream("META-INF/fop.xconf");
    logger.log(Level.FINE, "InputStream: {0}", fopStream.toString());
    DefaultConfigurationBuilder cfgBuilder = new DefaultConfigurationBuilder();
    Configuration cfg = cfgBuilder.build(fopStream);
    this.fopFactory = FopFactory.newInstance();
    this.fopFactory.setUserConfig(cfg);
    fopFactory.getFontManager().setFontBaseURL("file://" + FONT_BASE);
    logger.log(Level.FINE, "Font base url: {0}", fopFactory.getFontManager().getFontBaseURL());
    fopStream.close();
}

fop.xconf几乎完全是默认的。它包含

<base>.</base>

<fonts>
    <directory>DejaVuTtf</directory>
</fonts>

({instance-root} / fonts / DejaVuTtf中有几种字体,如果我只提供一个绝对路径,我可以正确加载 - 但是这对于拥有多个服务器是不行的,每个服务器可能有不同的实例根目录)。

如何使用以编程方式确定的路径加载字体?

谢谢!

3 个答案:

答案 0 :(得分:1)

您的java代码应该可以正常工作,因为FONT_BASE是在运行时确定的,取决于服务器 - 我们正在做一些非常类似的事情并且它工作正常。也许您的系统属性没有提供您认为的目录?

答案 1 :(得分:1)

我决定使用“预处理器”在加载fopStream之后并在将其输入DefaultConfigurationBuilder

之前进行一些变量替换
<fonts>
    <directory>${com.sun.aas.instanceRoot}/fonts/DejaVuTtf</directory>
</fonts>

答案 2 :(得分:0)

我最终以一种显而易见的方式解决了这个问题:使用系统字体目录。