没有找到apache fop 1.0的字体Arial.ttf

时间:2012-03-16 11:12:23

标签: apache-fop

我用:

  • Apache fop 1.0
  • 爪哇

我需要处理unicode高于u0100的特殊字符。我应该使用的目标字体是Arial。由于我不能指望Arial出现在目标平台上(例如Linux),我在我的jar中嵌入了Arial.ttf。 我的实际配置文件如下所示:

<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的目标平台。

有任何解决此问题的建议吗?

4 个答案:

答案 0 :(得分:4)

我终于找到了答案。看到: http://www.publicstaticfinal.de/2011/01/26/fop-embedding-fonts-from-classpath/

解决方案是将自己的URIResolver添加到fopFactory。

答案 1 :(得分:1)

This solution对我不起作用。这是因为ClassLoader.getSystemResourceAsStream(href);会返回null

我找到another solution但它有一个不同的问题 - 如果你有一些其他资源你用绝对系统路径添加到FOP(例如用户选择的图像),而不是你的自定义{{1}用于它们,因此它们被错误地解析。

如果你想纠正这些例子,只需混合它们就可以获得这样的工作解决方案:

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;
    }
}

答案 2 :(得分:0)

你有&lt; auto-detect /&gt;在&lt; fonts&gt;之外标签。为解决我们的字体问题,我们将&lt; auto-detect /&gt;在&lt; fonts&gt;内标签。 我们不使用额外的&lt; font&gt;配置,但只使用通过&lt; auto-detect /&gt;

检测到的系统字体

答案 3 :(得分:0)

不确定它是否是您的问题,但我发现由于某些版本的相对路径不适用于Fop配置文件。对我来说,如果我提供了一个绝对路径(从&#39; /&#39;开始)或者在路径前面添加了&#39;文件:&#39;喜欢&#39;文件:。&#39;。