我有一个使用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是正确的。

我看到两个问题:
  • 更改配置时,即使将其破坏,我也看不到fop运行时的任何反应。
  • 当然,不会加载字体。

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

    最佳答案

    目前,您使用的是配置文件而不是,因此未配置字体,并且字体也未嵌入PDF输出中。
    URI构造函数中的FopFactoryBuilder参数用于解析相对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();
    

    关于java - 在Java Servlet中嵌入Apache FOP 2.1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45926096/

    10-11 20:15