FOP 2+XSL生成PDF图片丢失:如何配置图片基础URL?
迁移服务器后,使用FOP 2+XSL生成PDF时图片无法显示,日志提示:
[FOUserAgent] Image not found. URI: test/myimg2/logo.png (No context info available)
XSL中使用相对路径,图片完整路径为/myserv/mydir/test/myimg2/logo.png。已知FOP 2可通过FopFactoryBuilder设置基础URL,但当前代码通过FopConfParser读取userconfig.xml创建builder,现询问:
- 如何指定图片基础URL?
- 是否可在
userconfig.xml中配置? - 调试发现fop对象的BaseUri指向
userconfig.xml,此情况是否正常?该BaseUri是否为图片搜索所用的基础URL?
注:未使用Servlet、JSF。
1. 代码中指定图片基础URL
通过FopConfParser创建FopFactoryBuilder后,直接调用builder的setBaseURL()方法即可指定图片根路径,示例代码如下:
// 读取userconfig.xml创建解析器 FopConfParser parser = new FopConfParser(new File("path/to/userconfig.xml")); FopFactoryBuilder builder = parser.getFopFactoryBuilder(); // 将本地路径转为URL格式,设置为基础路径 builder.setBaseURL(new File("/myserv/mydir/").toURI().toString()); // 后续创建FopFactory及Fop对象 FopFactory fopFactory = builder.build();
设置后FOP会自动把XSL中的相对路径和这个基础URL拼接,定位到正确的图片文件。
2. 在userconfig.xml中配置基础URL
可以直接在配置文件里配置,在<fop>根节点下添加<base-url>元素,填写图片根目录的URI(本地路径需用file协议):
<fop version="2.0"> <!-- 其他原有配置 --> <base-url>file:/myserv/mydir/</base-url> </fop>
解析该配置文件后,FopFactoryBuilder会自动读取这个值作为图片搜索的基础URL,无需额外代码设置。
3. BaseUri指向userconfig.xml的相关问题
这种情况是正常的。当通过FopConfParser读取配置文件时,FOP默认会将配置文件所在路径设为初始BaseUri,但这个值不是图片搜索依赖的基础URL。图片搜索使用的是你通过setBaseURL()方法或配置文件<base-url>设置的路径,和这个默认BaseUri没有关联,只需按前两种方式设置正确的基础路径即可。
内容的提问来源于stack exchange,提问作者Thomazzz

