【问题标题】:xhtmlrenderer creating PDFs of length 0xhtmlrenderer 创建长度为 0 的 PDF
【发布时间】:2011-02-11 13:39:00
【问题描述】:

我是org.xhtmlrenderer.pdf.ITextRenderer 的新手,遇到了这个问题:

我的测试 servlet 流式传输到我的下载文件夹的 PDF 实际上是空文件。

相关方法streamAndDeleteTheClob如下所示。

第一个try块肯定没问题。

服务器在第二个 try 块中花费了大量时间。没有抛出异常。

谁能建议解决这个问题或调试它的好方法?

谁能给我指出真正有效的本质上相似的代码?

任何帮助将不胜感激。

res.setContentType("application/pdf");

ServletOutputStream out = res.getOutputStream();

...

private boolean streamAndDeleteTheClob(int pageid,
                                  Connection con,
                                  ServletOutputStream out) throws IOException, ServletException {
   Statement statement;

   Clob htmlpage;

   StringBuffer pdfbuf = new StringBuffer();

   final String pageToSendQuery = "SELECT text FROM page WHERE pageid = " + pageid;

   // create xhtml file as a CLOB (Oracle large character object) and stream it into StringBuffer pdfbuf

  try {  // definitely no problem in this block
    statement = con.createStatement();
    resultSet = statement.executeQuery(pageToSendQuery);
    if (resultSet.next()) {
      htmlpage = resultSet.getClob(1);
    } else {
      return true;
    }
    final Reader in = htmlpage.getCharacterStream();
    final char[] buffer = new char[4096];
    while ((in.read(buffer)) != -1) {
      pdfbuf.append(buffer);
    }            
  } catch (Exception ex) {       
    out.println("buffering CLOB failed: " + ex);
  }

  // create pdf from StringBuffer

  try {
    DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document doc = builder.parse(new InputSource(new StringReader(pdfbuf.toString())));
    ITextRenderer renderer = new ITextRenderer();
    renderer.setDocument(doc, null);
    renderer.layout();
    renderer.createPDF(out);
    out.close();
  } catch (Exception ex) {
    out.println("streaming of pdf failed: " + ex);

  }

  deleteClob(con, pageid);

  return false;
}

【问题讨论】:

    标签: java itext flying-saucer xhtmlrenderer


    【解决方案1】:

    以这种方式使用 DocumentBuilder.parse 将尝试解析 XHTML 页面中引用的 DTD。这需要很长时间。如果您使用的是飞碟 (xhtmlrenderer),最简单的避免这种情况的方法是这样创建文档:

    Document myDocument = XMLResource.load(myInputStream).getDocument();
    

    请注意,您也可以将 XMLResource.load 与 Reader 一起使用。

    【讨论】:

    • 谢谢,这正是问题的原因。自己偶然发现,用谷歌搜索答案,一切正常。
    • 你还记得你得到了什么样的时间?通过这些优化,FS 仍然需要大约 300 毫秒来呈现一个并不可怕但不是那么好的页面,特别是因为 HTML 是最小的
    【解决方案2】:

    我能想到的两件事。

    1) 如果 iText 文档没有关闭,它将为空。看起来renderer.finish() 会起作用,但createPDF(out) 应该已经这样做了。

    2) 如果没有页面,您也可以得到一个空文档...因此空输入可能会导致一个 0 字节的 PDF。

    3) 您可能会得到一个完全有效的 PDF,但它没有被正确地流式传输。尝试写入 ByteArrayOutputStream 并检查那里的长度。

    4) 近乎狂热地献身于教皇!

    【讨论】:

      猜你喜欢
      • 2014-07-27
      • 2011-02-15
      • 2017-02-01
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多