这是我在这里的第一个问题,我希望我做对了。抱歉我的英语不好:)
我正在使用 JSF 2.0 (Eclipse IDE),并且正在尝试使用 Apache FOP 1.0 生成一些 PDF 文件。
我可以使用Apache Fop 网站上的说明制作简单的 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 文件(其他所有内容都在那里),并且在控制台中显示以下消息:
严重:从 URI 解析返回的源不包含 URI 的 InputStream:logo.jpg 2010 年 11 月 18 日下午 5:16:49 org.apache.fop.events.LoggingEventListener processEvent 严重:找不到图像。URI:徽标.jpg。(没有可用的上下文信息)
我尝试使用 'logo.jpg' 而不是 url('logo.jpg'),将图像放在 WebContent 文件夹内的各个位置并使用不同的导航(“./logo.jpg”),但它没有用。
如果我设置绝对路径(例如“d:/fop/images/logo.jpg”),它工作正常,但我需要在我的应用程序中恢复。
在搜索时,我发现这与 fopFactory.setURIResolver() 和/或 userAgent.setBaseURL() 有关。尝试了一些东西,但没有成功。
我是 JSF 和 FOP 的新手,这种图像问题困扰了我很长一段时间。有人可以帮我解决这个问题,或者至少指导我阅读一些关于“如何配置 FOP 以使用相对路径”的教程吗?
编辑:我不希望任何绝对路径和应用程序应该独立于其在计算机上的位置工作(可发布)。我的搜索告诉我它与配置 FOP 有关,但我不知道该怎么做 :)
提前致谢。
PS这是显示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();
}