我尝试使用xslt的外部图形生成PDF。大多数图像工作正常,但不时发现一个图像没有找到' despite being viewable on a web browser。这是FOP吐出的错误:
11:29:15.653 [main] ERROR org.apache.fop.apps.FOUserAgent - Image not found. URI: http://memesvault.com/wp-content/uploads/Derp-Meme-031.jpg. (No context info available)
这是我的外部图片部分:
<xsl:variable name="mediaUrl">
<xsl:value-of select="mediaUrl" />
</xsl:variable>
<fo:external-graphic src="url('{$mediaUrl}')"
height="200"
max-width="200"
content-width="scale-to-fit" />
知道我做错了吗?
编辑:看起来这个问题与不允许访问自动请求的服务器有关。有没有办法在fop 2.1中设置用户代理的URIResolver?看来这个功能存在于以前的版本中,但我似乎无法通过2.1找到一种方法。
答案 0 :(得分:2)
所以之所以发生这种情况,是因为正如lfurini所建议的那样,服务器因为用户代理而阻止了请求。可以通过使用带FOP的自定义URIResolver来解决这个问题:
URIResolverAdapter uriResolverAdapter = new URIResolverAdapter(new UserAgentUriResolver());
FopFactoryBuilder builder = new FopFactoryBuilder(URI.create("/"), uriResolverAdapter);
fopFactory = builder.build();
这是一个非常简单的URIResolver,可以在用户代理中添加。
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;
import javax.xml.transform.stream.StreamSource;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
public class UserAgentUriResolver implements URIResolver {
private static final String USER_AGENT = "whatever";
@Override
public Source resolve(String href, String base) throws TransformerException {
try {
URL url = new URL(href);
URLConnection connection = url.openConnection();
connection.setRequestProperty("User-Agent", USER_AGENT);
return new StreamSource(connection.getInputStream());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}