使用itext生成pdf并在浏览器上显示

时间:2014-05-14 09:09:58

标签: jsp pdf itext

我已经在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();
}

%>

1 个答案:

答案 0 :(得分:0)

如果您复制了实际代码,则表示您正在创建一个从一开始就已损坏的PDF。您正在引入空格和换行符,例如:

%>

<%@ include file="connection.jsp" %>

这需要改为:

%><%@ include file="connection.jsp" %>

当您在PDF中引入不属于那里的字节时。

此外,令我惊讶的是您的代码确实有效,因为当您引入空格或新行时,隐式触发方法response.getOutputStream()

当您明确获取输出流时,我希望java.lang.IllegalStateException说“getOutputStream()已经为此响应调用了”。

总而言之:使用JSP创建二进制文件是个坏主意。你应该使用servlet。您描述的行为对于损坏的PDF是典型的。我认为由于您使用JSP的方式,您的PDF已被破坏。