编程语言
首页 > 编程语言> > 在Java servlet中嵌入Apache fop 2.1

在Java servlet中嵌入Apache fop 2.1

作者:互联网

我有一个使用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输出中.

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();

标签:java,servlets,fonts,fop
来源: https://codeday.me/bug/20190705/1390572.html