xhtmlrenderer создает PDF-файлы длиной 0 - PullRequest
1 голос
/ 11 февраля 2011

Я новичок в org.xhtmlrenderer.pdf.ITextRenderer и у меня возникла эта проблема:

PDF-файлы, по которым потоки моего тестового сервлета в папку «Загрузки» фактически являются пустыми файлами.

Соответствующий метод, streamAndDeleteTheClob, показан ниже.

Первый блок попытки определенно не является проблемой.

Сервер тратит много времени во второмпопробуй заблокировать.Никаких исключений.

Может кто-нибудь предложить решение этой проблемы или хороший подход к ее устранению?

Может ли кто-нибудь указать мне на по существу похожий код, который действительно работает?* Любая помощь будет высоко ценится.

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;
}

Ответы [ 2 ]

2 голосов
/ 18 февраля 2011

При использовании DocumentBuilder.parse таким образом будет пытаться разрешить DTD, указанный на странице XHTML.Это занимает очень много времени.Самый простой способ избежать этого, если вы используете «Летающую тарелку» (xhtmlrenderer), это создать документ следующим образом:

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

Обратите внимание, что вы также можете использовать XMLResource.load с Reader.

0 голосов
/ 11 февраля 2011

Две вещи, о которых я могу думать.

1) Если документ iText не закрыт, он будет пустым.Похоже, renderer.finish() будет работать, но createPDF(out) должен сделать это уже.

2) Если страниц нет, вы также можете получить пустой документ ... так чтопустой ввод может привести к получению 0-байтового PDF-файла.

3) Возможно, вы получаете совершенно корректный PDF-файл, который не транслируется должным образом.Попробуйте записать в ByteArrayOutputStream и проверить длину там.

4) Почти фанатичное посвящение Папе!

...