Не удается найти шрифт Arial.ttf с apache fop 1.0

Я использую:

  • Апач фоп 1.0
  • Джава

Мне нужно обрабатывать специальные символы, юникод которых выше u0100. Целевой шрифт, который я должен использовать, — Arial. Поскольку я не могу ожидать, что Arial присутствует на целевой платформе (например, Linux), я встроил Arial.ttf в свой jar. Мой фактический файл конфигурации выглядит так:

<fop ...>
<!-- Base URL for resolving relative URLs -->
<base>./</base>

<!-- Font Base URL for resolving relative font URLs -->
<font-base>./</font-base>

<renderers>
    <renderer mime="application/pdf">
        <fonts>

            <font kerning="yes" embed-url="arial.ttf" encoding-mode="auto">
                <font-triplet name="Arial" style="normal" weight="normal"/>
                <font-triplet name="ArialMT" style="normal" weight="normal"/>
            </font>

            <!--<directory>C:/Windows/Fonts</directory>-->

        </fonts>
        <auto-detect/>
    </renderer>
 ...
</fop>

Делая это таким образом, я получаю сообщение об ошибке при загрузке моего файла конфигурации в fop:

org.apache.fop.apps.FOPException: Failed to resolve font with embed-url 'arial.ttf'

Единственный способ, которым мне удавалось заставить его работать до сих пор, - это жестко указать путь к папке в файле конфигурации:

            <font kerning="yes" embed-url="C:/myapp/arial.ttf" encoding-mode="auto">
                <font-triplet name="Arial" style="normal" weight="normal"/>
                <font-triplet name="ArialMT" style="normal" weight="normal"/>
            </font>

Но очевидно, что это не может быть решением!

Использование тега «каталог» будет работать в Windows только потому, что у вас есть Arial. Но, как упоминалось выше, он также должен работать на Linux, Mac и т. д.

Тег «автоматическое обнаружение» также не работал (даже не в Windows) и не является решением, поскольку я не могу ожидать, что на целевой платформе будет установлен Arial.

Любые предложения, чтобы решить эту проблему?


person jahuer1    schedule 16.03.2012    source источник


Ответы (4)


Я наконец нашел ответ. См.: http://www.publicstaticfinal.de/2011/01/26/fop-embedding-fonts-from-classpath/

Решение состоит в том, чтобы добавить собственный URIResolver в fopFactory.

person jahuer1    schedule 20.03.2012
comment
Привет @jahuer1, эта ссылка ниже, которую вы предоставили, не работает. Не могли бы вы предоставить решение здесь, которое вы реализовали. publicstaticfinal.de/2011/01/26/< /а> - person siddhartha; 03.07.2018

Это решение мне не подходит . Это потому, что ClassLoader.getSystemResourceAsStream(href); возвращает null.

Я нашел другое решение, но у него другая проблема - если у вас есть какие-то другие ресурсы, которые вы добавляете в FOP с абсолютным системным путем (например, изображения, выбранные пользователем), то для них используется ваш пользовательский URIResolver, поэтому они разрешаются неправильно.

Если вы хотите исправить эти примеры, просто смешайте их, и вы получите следующее рабочее решение:

import java.io.InputStream;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;
import javax.xml.transform.stream.StreamSource;

public class ClasspathUriResolver implements URIResolver {

    @Override
    public Source resolve(String href, String base) throws TransformerException {
        Source source = null;
        InputStream inputStream = getClass().getResourceAsStream(href);
        if (inputStream != null) {
            source = new StreamSource(inputStream);
        }
        return source;
    }
}

Применение

[...]

FopFactory fopFactory = FopFactory.newInstance();

FOURIResolver uriResolver = (FOURIResolver) fopFactory.getURIResolver();
uriResolver.setCustomURIResolver(new ClasspathUriResolver());

[...]
person knuhol    schedule 02.04.2015

У вас есть ‹auto-detect/› вне тега ‹fonts›. Чтобы решить нашу проблему со шрифтами, мы поместили ‹auto-detect/› внутри тега ‹fonts›. Мы не используем дополнительные настройки ‹font›, а просто используем системные шрифты, обнаруженные с помощью ‹auto-detect/›

person user3665942    schedule 22.05.2014

Не уверен, что это ваша проблема, но я обнаружил, что, поскольку относительные пути некоторых версий не работают в конфигурационном файле Fop. Для меня это сработало, если я либо указал абсолютный путь (начиная с «/»), либо префикс пути с «файл:», например «файл:.».

person Alexandr Kára    schedule 18.05.2015