Не найден шрифт Arial.ttf с apache fop 1.0 - PullRequest
4 голосов
/ 16 марта 2012

Я использую:

  • Apache fop 1.0
  • Java

Мне нужно обрабатывать специальными символами, уникод которых больше, чем 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>

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 20 марта 2012

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

Решение заключается в добавлении собственного URIResolver в fopFactory.

1 голос
/ 02 апреля 2015

Это решение не работает для меня.Это потому, что 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());

[...]
0 голосов
/ 18 мая 2015

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

0 голосов
/ 22 мая 2014

у вас естьвне тега .Чтобы решить нашу проблему со шрифтами, мы ставимвнутри тега .Мы не используем дополнительные конфигурации, а просто используем системные шрифты, обнаруженные с помощью

...