我是org.xhtmlrenderer.pdf.ITextRenderer新手,遇到了这个问题:
我的测试servlet传输到我的Downloads文件夹的PDF实际上是空文件。
相关方法streamAndDeleteTheClob如下所示。
第一个try块绝对不是问题。
服务器在第二个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;
}发布于 2011-02-18 05:45:35
以这种方式使用DocumentBuilder.parse将尝试解析XHTML页面中引用的DTD。这需要很长的时间。如果您使用的是飞碟(xhtmlrenderer),避免这种情况的最简单方法是这样创建文档:
Document myDocument = XMLResource.load(myInputStream).getDocument();请注意,您也可以将XMLResource.load与Reader一起使用。
发布于 2011-02-12 04:05:39
我能想到两件事。
1)如果iText文档没有关闭,它将为空。看起来renderer.finish()可以工作了,但是createPDF(out)应该已经可以工作了。
2)如果没有页面,你也可能得到一个空的文档...因此,空输入可能会导致0字节的PDF。
3)您可能会得到一个完全有效的PDF,但没有正确地进行流式传输。尝试写入ByteArrayOutputStream并检查其中的长度。
4)对教皇近乎狂热的献身!
https://stackoverflow.com/questions/4969638
复制相似问题