我已经在jsp中成功编写了代码,使用itext生成pdf文件。它工作正常但不是立即生成pdf,而是部分生成它。只有当我切换到另一个标签或窗口并切换回原来的标签或窗口时,它才能正确显示整个标签。
解决方案是在服务器中创建一个pdf文件,在浏览器窗口中打开它,并在打开后立即将其从服务器内存中删除。任何人都可以帮助我吗?
[这是程序的浓缩近似值。]
<%@ page trimDirectiveWhitespaces="true" %>
<%@
page import="java.servlet.*,
javax.servlet.http.*,
java.io.*,
java.util.*,
com.lowagie.text.pdf.*,
com.lowagie.text.*"
%>
<%@ include file="connection.jsp" %>
<%
response.setContentType("application/pdf");
Document document = new Document();
try
{
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
PdfWriter.getInstance(document, buffer);
document.open();
PdfPTable table = new PdfPTable(1);
table.addCell("1");
table.addCell("2");
table.addCell("3");
table.addCell("4");
table.addCell("5");
table.addCell("6");
document.add(table);
document.close();
DataOutputStream dataOutput = new DataOutputStream(response.getOutputStream());
byte[] bytes = buffer.toByteArray();
response.setContentLength(bytes.length);
for(int i = 0; i < bytes.length; i++)
dataOutput.writeByte(bytes[i]);
dataOutput.flush();
dataOutput.close();
return;
}
catch(DocumentException e)
{
e.printStackTrace();
}
%>
答案 0 :(得分:0)
如果您复制了实际代码,则表示您正在创建一个从一开始就已损坏的PDF。您正在引入空格和换行符,例如:
%>
<%@ include file="connection.jsp" %>
这需要改为:
%><%@ include file="connection.jsp" %>
当您在PDF中引入不属于那里的字节时。
此外,令我惊讶的是您的代码确实有效,因为当您引入空格或新行时,隐式触发方法response.getOutputStream()
。
当您明确获取输出流时,我希望java.lang.IllegalStateException
说“getOutputStream()
已经为此响应调用了”。
总而言之:使用JSP创建二进制文件是个坏主意。你应该使用servlet。您描述的行为对于损坏的PDF是典型的。我认为由于您使用JSP的方式,您的PDF已被破坏。