这是我在这里的第一个问题,我希望我做对了。对不起,我的英语不好。
我正在使用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文件(其他所有内容),并且在控制台中显示以下消息:
我尝试使用'logo.jpg'代替url('logo.jpg'),将图像放置在WebContent文件夹内的各个位置,并使用不同的导航(“./logo.jpg”),但没有成功。
如果我设置了绝对路径(例如“d:/fop/images/logo.jpg”),则效果很好,但是我需要在我的应用程序中重新使用。
在搜索时,我发现这与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();
}
最佳答案
我找到了解决我问题的方法。我以为我尝试过,但是那时我似乎犯了一些小错误。无论如何,用下面的代码
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')"/>
花了我些时间弄清楚这个问题,我不明白为什么网上没有这样的基本事例(或者我找不到它们:)
注意:在FOP 2.0中没有
setBaseURL()
方法。相反,您将基本URL作为参数传递给FopFactory.newInstance()
。其他许多二传手已移至FopFactoryBuilder。关于jsf-2 - FOP : how to specify image src relative path?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4217517/