2011-02-11 133 views
1

的PDF文件我是新來org.xhtmlrenderer.pdf.ITextRenderer和有這樣的問題:xhtmlrenderer創建長度爲0

的PDF文檔,我的測試Servlet,流到我的下載文件夾,其實都是空文件。

相關方法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; 
} 

回答

0

我能想到的兩件事。

1)如果iText文檔沒有關閉,它將是空的。看起來像renderer.finish()將工作,但createPDF(out)應該已經這樣做。

2)如果沒有頁面,你也可以得到一個空文檔...所以一個空的輸入可能會導致一個0字節的PDF。

3)您可能會得到一個完全有效的PDF,但沒有正確流式傳輸。嘗試寫入ByteArrayOutputStream並檢查那裏的長度。

4)幾乎是對教皇的狂熱奉獻!

2

以這種方式使用DocumentBuilder.parse將嘗試解析XHTML頁面中引用的DTD。這需要很長時間。該easyest方式aviod,如果您使用的是飛碟(xhtmlrenderer),是創建該文件是這樣的:

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

注意,您可以使用XMLResource.load用讀卡器了。

+0

謝謝,這正是問題的原因。我自己陷入困境,用Google搜索答案,一切正常。 – 2012-03-07 12:47:27