В Apache FOP, как да задам базата на шрифта програмно и все още да има заредени шрифтове от ‹directory›?

Използвам 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, които мога да заредя правилно, ако просто дам абсолютен път -- но това не работи при наличието на множество сървъри, всеки от които може да има различни главни директории на екземпляри ).

Как да заредя шрифт с програмно определен път?

Благодаря!


person Nick    schedule 16.09.2010    source източник
comment
В официалния документ е написано В момента не е възможно лесно да се конфигурират шрифтове от Java код.   -  person DrDol    schedule 25.09.2010


Отговори (3)


Вашият Java код трябва да работи добре, тъй като FONT_BASE се определя по време на изпълнение, в зависимост от сървъра - ние правим нещо много подобно на това и то работи добре. Може би вашата системна собственост не ви дава директорията, която смятате, че е?

person CrookedBow    schedule 22.04.2011

Реших да използвам "препроцесор", за да направя някаква замяна на променливи след зареждане на fopStream и преди да го заредя в DefaultConfigurationBuilder

<fonts>
    <directory>${com.sun.aas.instanceRoot}/fonts/DejaVuTtf</directory>
</fonts>
person Frank Schwarz    schedule 26.02.2012

В крайна сметка реших този проблем по очевидния начин, който не ми хрумна: използвам системната директория за шрифтове.

person Nick    schedule 08.11.2012