我有一个使用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是正确的。
我看到两个问题:
可能我在这里遗漏了一些非常明显的东西,希望有人可以指导我。
答案 0 :(得分:1)
目前您使用配置文件 不 ,因此未配置字体并且它们未嵌入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();