【问题标题】:how to generate pdf from xhtml page dynamically using itext+flying saucer with java如何使用带有java的itext +飞碟从xhtml页面动态生成pdf
【发布时间】:2012-10-15 04:49:51
【问题描述】:

我第一次使用 iText+flying saucer 和 xhtml 页面,使用 JSF 2.0 进行简单的注册表单,带有常规输入字段,如名字、姓氏、电话号码等。一旦用户输入所有数据并单击 " NEXT" 按钮 我必须将此带有用户数据的 XHTML 页面转换为 pdf。我怎样才能准确地获取该页面的源 HTML 以及页面中包含的所有样式并将其转换为 pdf。目前我喜欢这个。

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 获取我的页面的正确方法吗?该 URL 是否在单击 NEXT 按钮时获取带有用户数据的页面并将其转换为 pdf,还是我尝试使用错误的代码。请帮助我。示例赞赏。

【问题讨论】:

    标签: jsf-2 itext flying-saucer xhtmlrenderer


    【解决方案1】:

    这个异常听起来更像是您网站的 (x)html 中的问题。您的 html 中是否有类似 <!-- some -- comments --> 的内容?

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

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

    这里有两个例子:

    【讨论】:

    • 感谢您的快速回答。但是如果我使用上面的 url,是否可以获得包含用户数据的 XHTML 页面?如何打印输入到 PDF 的 HTMl 文档?你认为我的方法是正确的
    • 嘿,我在这里很困惑。您提到的上述两个 API 是 flySaucer 的替代品,还是我需要与 iText+FS 一起使用?如果是,您能否提供有关如何集成 Jsoup 的信息/HTMLCleaner 与 iText+FS
    • 我将它们与 FS 结合使用:HTML --> JSoup 或 HtmlCleaner --> FlyingSaucer -- > PDF。 Jsoup 或 HtmlCleaner 将修复输入 Html 中的许多错误,否则会杀死 FS。两者都可以转义 Html 实体 - 也许这可以解决您在 cmets 中 -- 的问题。
    • 嘿,我现在有了一个明确的想法。谢谢。最后一个问题。哪一个最适合清洁目的 Jsoup 或 HtmlCleaner?
    • 最好两个都测试。如果你只想“清理”你的 Html,HtmlCleaner 就足够了,但如果你用它做进一步的步骤(比如选择标签、更改值等),你最好使用 Jsoup。但总的来说结果应该是一样的。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-25
      • 2016-06-26
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      相关资源
      最近更新 更多