如何使用带有java的itext + fly saucer动态生成来自xhtml页面的pdf

时间:2012-10-15 04:49:51

标签: jsf-2 itext flying-saucer xhtmlrenderer

我首次使用iText +飞碟使用JSF 2.0使用xhtml页面进行简单的注册表格,使用常规输入字段,如firstName,lastName,电话号码等。一旦用户输入所有数据并点击“ NEXT “按钮我必须将这个带有用户数据的XHTML页面转换成pdf.How我可以准确地获取该页面的源HTML,其中包含页面中包含的所有样式并将其转换为pdf.Currently我就像此

public void createPDF() {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    HttpSession session = (HttpSession) externalContext.getSession(true);
    String url = "http://localhost:8080/MyPROJECT/faces/page1.xhtml;JSESSIONID=" + session.getId();
    try {
    ITextRenderer renderer = new ITextRenderer();
    renderer.setDocument(url);
    renderer.layout();
    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
    response.reset();
    response.setContentType("application/pdf");
    response.setHeader("Content-Disposition","C://user//first.pdf");
    OutputStream browserStream = response.getOutputStream();
    renderer.createPDF(browserStream);
    browserStream.close();
    session.invalidate();
    } catch (Exception ex) {
       ex.printStackTrace();
    }
    facesContext.responseComplete();
}

但它让我这个例外。

ERROR:  'The string "--" is not permitted within comments.'
org.xhtmlrenderer.util.XRRuntimeException: Can't load the XML resource (using TRaX transformer). org.xml.sax.SAXParseException: The string "--" is not permitted within comments.

这是使用上面的URL获取我的页面的正确方法。当点击NEXT按钮时,该URL获取我的页面用户数据并将其转换为pdf或我尝试使用错误的代码。请帮助我。举例赞赏。

2 个答案:

答案 0 :(得分:1)

此异常听起来更像是您网站的(x)html中的问题。你的HTML中有<!-- some -- comments -->之类的内容吗?

Flying Saucer抛出此异常,因为注释块中某处有--。检查一下,如果可能的话,在--<!--之间不用-->进行试用。

但是,由于FS会在(X)HTML / XML中的每一个小错误中失败(如自述文件中所述),因此在处理网站之前使用HTML Cleaner通常是一个好主意。

以下是两个例子:

答案 1 :(得分:0)

如果您对HTML有部分控制并且只需要转义某些项目,那么您可以执行的另一件事是遵循java.net article中的示例,通过在ContentCaptureServletResponse中替换它们来替换不需要的元素:

public String getContent(){
    writer.flush();
    String xhtmlContent = new String(contentBuffer.toByteArray());
    xhtmlContent = xhtmlContent.replaceAll("<thead>|</thead>","");
    return xhtmlContent; 
}