这是我在这里的第一个问题,我希望我做对了。对不起,我的英语不好。

我正在使用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/

10-11 00:00