2012-10-15 134 views
0

我第一次使用iText +飞碟与XHTML页面使用JSF 2.0简单的注册表单与常规输入字段如firstName,lastName,电话号码一旦用户输入所有数据并点击“NEXT”按钮我必须将这个带有用户数据的XHTML页面转换为pdf。我如何能够精确地获得该页面的源HTML以及页面中包含的所有样式以及将其转换为pdf。目前我正在绑定这样的。如何使用itext +飞碟动态生成pdf使用itext +飞碟与java

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.Does该URL让我的网页与用户数据的下一个按钮的点击PDF转换它还是我使用错误的code.Please试图帮助我让我的页面的正确途径。例子感激。

回答

1

这个异常听起来更像是您网站的(x)html中的问题。在你的html中是否有像<!-- some -- comments -->这样的东西?

Flying Saucer会抛出此异常,因为在注释块中有某个--。检查这一点,如果可能的话,在<!---->之间没有--。但是,由于FS会在(X)HTML/XML(正如自述文件中所述)中的每一次小错误都会失败,所以在处理网站之前使用HTML Cleaner通常是一个好主意。

这里有两个例子:

+0

感谢您的快速回答。但是,如果我使用上面的url,是否可以获取带有用户数据的XHTML页面?如何打印输入到PDF的HTMl文档?你是否认为我的方法是正确的 – mdp

+0

嘿,我很困惑这里。你提到的上述两个API是飞碟的替代品,或者我需要与iText + FS一起使用吗?如果是这样,请你提供有关如何集成Jsoup/HTMLCleaner with iText + FS – mdp

+0

我将它们与FS结合使用:** HTML ** - > ** JSoup或HtmlCleaner ** - > ** FlyingSaucer ** - > ** PDF **。 Jsoup或HtmlCleaner将修复输入Html中的许多错误,否则将会杀死FS。两者都可以逃脱Html实体 - 也许这可以解决您的问题与评论中的“ - ”。 – ollo

0

,如果你有在HTML中,某些局部控制,只需要逃避某些项目,你可以做的另一件事是遵循java.net article中的示例通过在ContentCaptureServletResponse中替换它们来替换不需要的元素:

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