Java 在ApacheFop中,如何以编程方式设置字体库,并且仍然使用<;目录>;加载?

Java 在ApacheFop中,如何以编程方式设置字体库,并且仍然使用<;目录>;加载?,java,fonts,xsl-fo,apache-fop,Java,Fonts,Xsl Fo,Apache Fop,我正在使用ApacheFop1.0。代码在不同的服务器上运行,因此我将字体放在每个服务器的实例根中。我的计划是以编程方式设置字体库(到服务器实例根,加上“/fonts/”),并在我的fop配置文件中设置相对于此字体库的字体路径。下面是创建FopFactory的代码片段: private static final String FONT_BASE = System.getProperty("com.sun.aas.instanceRoot") + "/fonts/"; public FO

我正在使用ApacheFop1.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>


德哈维特夫
(在{instance root}/fonts/DejaVuTtf中有几种字体,如果我只给出一个绝对路径,就可以正确加载这些字体——但这不适用于多个服务器,每个服务器可能有不同的实例根目录)

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


谢谢

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

我决定在加载
fopStream
并将其输入
DefaultConfigurationBuilder
之前,使用“预处理器”进行一些变量替换

<fonts>
    <directory>${com.sun.aas.instanceRoot}/fonts/DejaVuTtf</directory>
</fonts>

${com.sun.aas.instanceRoot}/fonts/DejaVuTtf

我最终以一种我没有想到的明显方式解决了这个问题:使用system fonts目录。

在官方文档中写道“目前无法从Java代码轻松配置字体。”
<fonts>
    <directory>${com.sun.aas.instanceRoot}/fonts/DejaVuTtf</directory>
</fonts>