我是org.xhtmlrenderer.pdf.ITextRenderer的新手,并遇到以下问题:

我的测试servlet流到“下载”文件夹的PDF实际上是空文件。

相关方法streamAndDeleteTheClob如下所示。

第一次尝试块绝对不是问题。

服务器在第二个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;
}

最佳答案

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

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


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

10-08 16:13