1

私は初めてでorg.xhtmlrenderer.pdf.ITextRenderer、この問題を抱えています:

私のテスト サーブレットがダウンロード フォルダーにストリーミングする PDF は、実際には空のファイルです。

関連するメソッド をstreamAndDeleteTheClob以下に示します。

最初の try ブロックは問題ありません。

サーバーは、2 番目の試行ブロックに多くの時間を費やします。例外はスローされません。

誰でもこの問題の解決策やデバッグへの良いアプローチを提案できますか?

実際に機能する本質的に同様のコードを教えてくれる人はいますか?

どんな助けでも大歓迎です。

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

2 に答える 2

2

この方法で DocumentBuilder.parse を使用すると、XHTML ページで参照されている DTD を解決しようとします。本当に長い時間がかかります。空飛ぶ円盤 (xhtmlrenderer) を使用している場合、これを回避する最も簡単な方法は、次の方法でドキュメントを作成することです。

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

XMLResource.load を Reader でも使用できることに注意してください。

于 2011-02-17T21:45:34.850 に答える
0

私が考えることができる2つのこと。

1) iText ドキュメントが閉じられていない場合、空になります。renderer.finish()うまくいくように見えますが、すでにそれcreatePDF(out) を行う必要があります。

2)ページがない場合、空のドキュメントも取得できます...したがって、空の入力により0バイトのPDFが生成される可能性があります。

3) 適切にストリーミングされていない完全に有効な PDF を取得している可能性があります。ByteArrayOutputStream に書き込み、そこで長さを確認してみてください。

4) 教皇へのほぼ狂信的な献身!

于 2011-02-11T20:05:39.427 に答える