2016-04-26 40 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); 
     } 
    } 
}