2016-04-26 69 views
2

我试图在xslt中为PDF生成使用外部图形。大多数图像工作正常,但现在又一次是'未找到'despite being viewable on a web browser。这里的错误FOP吐出:未找到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

难道是服务器端问题吗?使用FOP 1.1时,错误消息显示“打开URL时出错”http://memesvault.com/wp-content/uploads/Derp-Meme-031.jpg':服务器返回的HTTP响应代码:403代表URL:http:// memesvault.com /可湿性粉剂内容/上传/ DERP - 米姆,031.jpg'。也许该网站被配置为拒绝具有/不具有特定用户代理的请求,以避免网站欺骗? – lfurini

+0

@lfurini这很可能 - 我猜他们改变了2.1的错误代码。你知道在fop中设置用户代理的方法吗? – cscan

回答

2

所以发生这种情况的原因是,正如lfurini所建议的那样,服务器由于用户代理而阻止了请求。一个可以解决此通过使用自定义的URIResolver与FOP:

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