2010-11-18 121 views
9

這是我的第一個問題,我希望我做對了。對不起,我的壞英語提前:)FOP:如何指定圖片的src相對路徑?

我使用JSF 2.0(Eclipse IDE),我試圖用Apache FOP 1.0生成一些PDF文件。

我能夠使用Apache Fop site上的說明製作簡單的PDF文件,但我無法從我的應用程序文件夾插入任何圖像。我的文件夾結構是這樣的: 在我的應用程序的WebContent我有(其中包括其他) pdf_transform/XSLT/transformFile.xsl和 pdf_transform/XSLT/logo.jpg

在transformFile.xsl我有

<fo:block><fo:external-graphic src="url('logo.jpg')"/></fo:block> 

,但是當我在短聲我的servlet「showPDF」按鈕,我得到的PDF文件沒有圖像(一切是存在的),並在控制檯此消息:

嚴重:源即返回 FR om URI解析不包含 InputStream for URI:logo.jpg Nov 18, 2010 5:16:49 PM org.apache.fop.events.LoggingEventListener processEvent SEVERE:找不到圖像。 URI:logo.jpg。 (無上下文信息 可用)

我試圖用「logo.jpg」,而不是網址(「logo.jpg」),將在各個地方的圖像WebContent文件夾內,並使用不同的導航(」 ./標誌.jpg「),但它沒有奏效。

它工作正常,如果我設置絕對路徑(例如「d:/fop/images/logo.jpg」),但我需要resurces美白我的應用程序。

在搜索時,我發現這與fopFactory.setURIResolver()和/或userAgent.setBaseURL()有關。嘗試了一下,但沒有成功。

我對JSF和FOP都很陌生,這種形象的狀況一直困擾着我。有人可以幫我解決這個問題,或者至少可以直接給我一些關於「如何爲相對路徑使用配置FOP」的教程?

編輯:我不想要任何絕對路徑和應用程序應該獨立於其在計算機上的位置(可發佈)工作。我的搜索告訴我這與配置FOP有關,但我不知道該怎麼做:)

在此先感謝。

P.S.這是方法,該方法被調用來顯示PDF:

public void printExchangeRateList(ActionEvent event) { 

    BufferedOutputStream output = null; 

    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = facesContext.getExternalContext(); 
    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse(); 

    String path = externalContext.getRealPath("/"); 


    try { 

     response.reset(); 
     response.setHeader("Content-Type", "application/pdf"); 
     output = new BufferedOutputStream(response.getOutputStream(), 10240); 

     File xsltfile = new File(path+"/pdf_transform/xslt/transformFile.xsl"); 

     FopFactory fopFactory = FopFactory.newInstance(); 
     FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); 

     try { 
      Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, output); 

      TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
      Transformer transformer = transformerFactory.newTransformer(new StreamSource(xsltfile)); 

      Source src = new DOMSource(makeXML()); // my method 
      Result res = new SAXResult(fop.getDefaultHandler()); 

      transformer.transform(src, res); 


     } finally { 
      if (output != null) output.close(); 
      /*try { 
       out.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }*/ 
     } 

    } catch (Exception e) { 
     // TODO Auto-generated catch block 
    } 

    facesContext.responseComplete(); 
} 

回答

2

如果你訪問該網頁的網址爲圖片你可以生成報表時,即http://localhost/images/logo.jpg使用爲好。

不過,雖然我仍然有局部圖像在Web服務器上,我包括路徑XML文件中的應用程序,並用它這樣的:

<xsl:variable name="base_path" select="base-path"/> 
<xsl:variable name="logo" select="companies/company/logo"/> 
<fo:external-graphic src="url({$base_path}{logo})"/> 

凡XML結構可能是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<base-path>/path/to/app/</base-path> 
<companies> 
    <company> 
    <logo>images/company1.jpg</logo> 
    </company> 
    <company> 
    <logo>images/company2.jpg</logo> 
    </company> 
</companies> 
+0

感謝您的回答。但那不是我想要的。當你製作xml時,「/ path/to/app /」字符串必須看起來像「C:\ Eclipse \ workspace \ myProject \ .. etc」(如果我正確的話)。我使這個應用程序是可發佈的,所有XML數據和圖像即時訪問必須引用和白色應用程序範圍(對不起,沒有寫在我的問題明確,我現在編輯它)。 – Nikola 2010-11-18 21:27:42

10

我找到了解決我的問題。我以爲我嘗試過,但似乎我當時犯了一些小錯誤。總之,用下面的代碼

FacesContext facesContext = FacesContext.getCurrentInstance(); 
ExternalContext externalContext = facesContext.getExternalContext(); 
String basePath = externalContext.getRealPath("/"); 

FopFactory fopFactory = FopFactory.newInstance(); 
fopFactory.setBaseURL(basePath); 
FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); 
foUserAgent.setBaseURL(fopFactory.getBaseURL()); 

Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, output); // for some output 

您可以使用您的應用程序的WebContent文件夾開始的相對路徑XSLT文件訪問圖像(和其他資源)。就我而言,我可以訪問logo.jpg這樣

<fo:external-graphic src="url('pdf_transform/xslt/logo.jpg')"/> 

我花時間弄清楚這一點,我不明白爲什麼在網上與這些基本的東西沒有例子(或者我找不到他們:)

0

我有同樣的問題,並試圖此解決方案:

FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); 
    Request request = RequestCycle.get().getRequest(); 
    //sort of a hack to find the path to the files that are in /img folder. 
    String baseUrl = request.getUrl().getProtocol()+"://"+request.getUrl().getHost()+":"+request.getUrl().getPort(); 
    foUserAgent.setBaseURL(baseUrl); 

然後,XSL我使用:

<fo:external-graphic src="/img/image.png" /> 

至T如果這是工作,你應該能夠看到協議上的圖像:// link:port/img/image.png