首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xhtmlrenderer创建长度为0的PDF

xhtmlrenderer创建长度为0的PDF
EN

Stack Overflow用户
提问于 2011-02-11 21:39:01
回答 2查看 1.7K关注 0票数 1

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

我的测试servlet传输到我的Downloads文件夹的PDF实际上是空文件。

相关方法streamAndDeleteTheClob如下所示。

第一个try块绝对不是问题。

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

有没有人能给出这个问题的解决方案或者调试的好方法呢?

有没有人能给我指点一下本质上类似的代码,才能真正起作用?

任何帮助都将不胜感激。

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

发布于 2011-02-18 05:45:35

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

代码语言:javascript
复制
Document myDocument = XMLResource.load(myInputStream).getDocument();

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

票数 2
EN

Stack Overflow用户

发布于 2011-02-12 04:05:39

我能想到两件事。

1)如果iText文档没有关闭,它将为空。看起来renderer.finish()可以工作了,但是createPDF(out)应该已经可以工作了。

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

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

4)对教皇近乎狂热的献身!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4969638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档