在 java servlet 中嵌入 Apache fop 2.1

Embedding Apache fop 2.1 in java servlet

我有一个使用 Apache FOP 生成 PDF 文件的应用程序。一切都很好,除了生成的 PDF 中的西里尔字母。据我了解,我应该将具有西里尔字母的字体与应用程序捆绑在一起。

所以,我将应用设置如下: 我在 ../src/main/resources/conf/fop.xml 中有配置文件(几乎是 PDF 渲染器的默认配置文件)并像这样初始化 FOP:

FopFactoryBuilder fopBuilder =
  new FopFactoryBuilder(fileLoader.getFile("conf/fop.xml").toURI(),
    new ClasspathResolverURIAdapter());
fopFactory = fopBuilder.build();

fileLoader 是我自己的读取文件的实用程序,XSLT 由它加载并且一切正常。我尝试了另一种方法,但没有成功。 Fop 本身很好用,除了字体。

在配置中我有:

<renderers>
    <renderer mime="application/pdf">
      <filterList>
        <value>flate</value>
      </filterList>
      <fonts>
        <directory recursive="true">./</directory>
        <auto-detect/>
      </fonts>
    </renderer>
  </renderers>

字体在 conf/ 下的子目录中。

我的 XSLT 引用了字体并且通过命令行一切正常,我得到了我想要的结果,所以我猜 XSLT 是正确的。

我看到两个问题:

可能我在这里遗漏了一些非常明显的东西,希望有人能指导我。

目前您使用您的配置文件,因此字体未配置且未嵌入 PDF 中输出。

FopFactoryBuilder构造函数中的URI参数用于解析相对URI,不加载配置文件

根据 embedding instructions,您的代码应该与此类似:

import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;

...

DefaultConfigurationBuilder cfgBuilder = new DefaultConfigurationBuilder();
Configuration cfg = cfgBuilder.buildFromFile(new File("conf/conf.xml"));
FopFactoryBuilder fopFactoryBuilder = new FopFactoryBuilder(new File(".").toURI()).setConfiguration(cfg);
FopFactory fopFactory = fopFactoryBuilder.build();