В 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 есть несколько шрифтов, которые я могу правильно загрузить, если просто укажу абсолютный путь, но это не работает при наличии нескольких серверов, каждый из которых может иметь разные корневые каталоги экземпляров. ).

Как загрузить шрифт с программно определенным путем?

Спасибо!


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