【问题标题】:Not finding font Arial.ttf with apache fop 1.0使用 apache fop 1.0 找不到字体 Arial.ttf
【发布时间】:2012-03-16 11:12:23
【问题描述】:

我用:

  • Apache fop 1.0
  • Java

我需要处理 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。

有解决这个问题的建议吗?

【问题讨论】:

    标签: apache-fop


    【解决方案1】:

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

    解决方案是在 fopFactory 中添加一个自己的 URIResolver。

    【讨论】:

    【解决方案2】:

    This solution 不适合我。这是因为ClassLoader.getSystemResourceAsStream(href); 返回null

    我找到了another solution,但它有一个不同的问题 - 如果您有一些其他资源使用绝对系统路径添加到 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());
    
    [...]
    

    【讨论】:

      【解决方案3】:

      您在 标记之外有 。为了解决我们的字体问题,我们将 放在 标记中。 我们不使用额外的 配置,而只是使用通过

      检测到的系统字体

      【讨论】:

        【解决方案4】:

        不确定这是否是您的问题,但我发现由于某些版本的相对路径在 Fop 配置文件中不起作用。对我来说,如果我提供一个绝对路径(以“/”开头)或在路径前加上“file:”前缀,比如“file:.”,它就会起作用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-12-30
          • 1970-01-01
          • 2013-11-15
          • 1970-01-01
          • 2018-06-17
          • 1970-01-01
          • 2012-04-22
          • 1970-01-01
          相关资源
          最近更新 更多