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