我有一个使用 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 - 在 java servlet 中嵌入 Apache fop 2.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46096144/