Xml 如何使用JSF(Java)和ApacheFop在浏览器上生成PDF

Xml 如何使用JSF(Java)和ApacheFop在浏览器上生成PDF,xml,jsf,xslt,xsl-fo,apache-fop,Xml,Jsf,Xslt,Xsl Fo,Apache Fop,我是JSF和ApacheFOP环境的新手。我正在使用JSF(2.2.7)Primeface 5.0(EclipseIDE_Luna),并创建了一个名为CreatePDF的方法,通过浏览器上的JSF生成PDF。我正在使用ApacheFop(1.1),它使用XML数据和相应的XSLT(XSL-FO)生成PDF。我已将xml和xslt文件放在Web内容JSF项目文件夹下 我的问题是,当我按下浏览器中的命令按钮时,chrome/Firefox浏览器会显示PDF窗口并显示消息“加载PDF文档失败”。首先我

我是JSF和ApacheFOP环境的新手。我正在使用JSF(2.2.7)Primeface 5.0(EclipseIDE_Luna),并创建了一个名为CreatePDF的方法,通过浏览器上的JSF生成PDF。我正在使用ApacheFop(1.1),它使用XML数据和相应的XSLT(XSL-FO)生成PDF。我已将xml和xslt文件放在Web内容JSF项目文件夹下

我的问题是,当我按下浏览器中的命令按钮时,chrome/Firefox浏览器会显示PDF窗口并显示消息“加载PDF文档失败”。首先我想,这可能是Adobe或我的xml和xsl fo编写问题,但当我在JSP项目中使用这些xml和xslt文件时,浏览器窗口可以轻松地动态生成PDF。在JSP页面中,我使用FOP uriResolver API从应用程序项目文件夹获取数据,但在JSF中,我不知道如何使用此API

所以可能是JSF转换与FOP工厂和文件声明格式有一些问题

JSF Java Clas如下所示:

以及我的JSF的XHTML(Primeface)命令按钮:

JSP Java类:

CreatePDf(){
FacesContext context=FacesContext.getCurrentInstance();
HttpServletResponse=(HttpServletResponse)context.getExternalContext().getResponse();
试一试{
ByteArrayOutputStream out=新建ByteArrayOutputStream();
fopFactory.setURIResolver(uriResolver);
Fop Fop=fopFactory.newFop(MimeConstants.MIME_PDF,out);
Source xslSrc=this.uriResolver.resolve(“servlet上下文:/xsl/peopleconvertor.xsl”,null);
tFactory.setURIResolver(uriResolver);
变压器变压器=t工厂新变压器(xslSrc);
变压器。旋转变压器(旋转变压器);
Result res=新的SAXSult(fop.getDefaultHandler());
Source xmlSrc=uriResolver.resolve(“servlet上下文:/xml/people.xml”,null);
transformer.transform(xmlSrc,res);
response.setContentType(“application/pdf”);
response.setContentLength(out.size());
response.getOutputStream().write(out.toByteArray());
response.getOutputStream().flush();
}捕获(例外e){
e、 printStackTrace(System.err);
}
context.responseComplete();
}

请帮助我如何使用JSF解决这个问题……

您使用JSP文件的目的是什么?只需使用xhtml按钮(必须是非ajax)和托管bean即可。您可以使用Primefaces标记在托管bean中动态生成PDF。然后,将PDF文件包装后返回
DefaultStreamedContent
。@Xtreme Biker,我没有完全理解你的意思。实际上,我使用JSP检查xml和xslt。但是我需要用JSF来运行这个项目。因此,您可以帮助我为Primeface下载标签提供一些相关的代码片段,以便从JSF生成PDF。因为您使用xml+xslt生成PDF,您需要一个引擎来处理和构建它,因为它似乎是您的
fopFactory
。最后得到的是一个
ByteArrayOutputStream
,它是您在响应中包装的东西(您在JSP中所做的事情)。而不是在JSP中,而是在托管bean中进行,并按照我在上面提供的链接中解释的方式进行包装。
    public void CreatePDf(){
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        HttpServletResponse response = (HttpServletResponse)     externalContext.getResponse();
        String basePath = externalContext.getRealPath("/");
        try{
            BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream(), 10240);
            File xsltfile = new File(basePath+"xsl/peopleconvertor.xsl");
            File xmlfile = new File(basePath+ "xml/people.xml");
            FopFactory fopFactory = FopFactory.newInstance();
            fopFactory.setBaseURL(basePath);
            FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
            foUserAgent.setBaseURL(fopFactory.getBaseURL());
            Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer(new StreamSource(xsltfile));
            Source src = new StreamSource(xmlfile);
            Result res = new SAXResult(fop.getDefaultHandler());
            transformer.transform(src, res);
            response.setContentType("application/pdf");
    } catch (Exception e) {
        e.printStackTrace(System.err);}
    facesContext.responseComplete();
}}
 p:commandButton id="tabelle1" action="#{Jsf_PDF.CreatePDf()}"
            immediate="true" icon="ui-icon-check" value="Tabelle erzeugen"
        style="position:relative; margin-top: 20px; right:-950px" ajax="false"
<pre>CreatePDf(){
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletResponse response = (HttpServletResponse)   context.getExternalContext().getResponse();
        try{
        ByteArrayOutputStream out = new ByteArrayOutputStream();

            fopFactory.setURIResolver(uriResolver);
            Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);
            Source xslSrc = this.uriResolver.resolve("servlet-context:/xsl/peopleconvertor.xsl", null);
            tFactory.setURIResolver(uriResolver);
            Transformer transformer = tFactory.newTransformer(xslSrc);  
            transformer.setURIResolver(uriResolver);
            Result res = new SAXResult(fop.getDefaultHandler());
            Source xmlSrc = uriResolver.resolve("servlet-context:/xml/people.xml", null);
            transformer.transform(xmlSrc, res);
            response.setContentType("application/pdf");
            response.setContentLength(out.size());
            response.getOutputStream().write(out.toByteArray());
            response.getOutputStream().flush();
        }catch (Exception e) {
              e.printStackTrace(System.err);   
        }
          context.responseComplete();   
    }