在iframe中显示流式pdf

时间:2014-10-19 15:19:51

标签: java servlets iframe

我有一个servlet,它按照这样的方式传输pdf:

ServletOutputStream out = response.getOutputStream();
byte[] pdfByteArray = JasperExportManager.exportReportToPdf(jasperPrintObject);                 
response.reset();
response.setContentType("application/pdf");
response.addHeader("Content-Disposition","inline;filename=temp.pdf");
out.write(pdfByteArray, 0, pdfByteArray.length);
out.flush();
out.close();

当我调用servlet时这很好用。现在我使用ajax来调用servlet并在iframe中显示pdf。我试着这样做:

$('#form1').on('submit', function(e) {
     $form = $(this);                                                         
     $.post($form.attr('action'), $form.serialize(), function(responseText) { 
         $('#frm').attr('srcdoc', responseText);
     });
     return false;
});

iframe最终会得到以下数据: %PDF-1.4% 40 obj<>streamx Ko7 P@ >, I W{襐m “K I S ( C{ p Yv z~ [ W U7- QT Uw M K hDpѷ ,Vݓ 8 ` {Z(((QX%A \ E_X] WJ ^ MQ” j nԭ ( ' + . < Fa Jx ~T<.¸ ( )g Bx ~ ! 0ɟR g i , o' ( >:I B pt捎J5. k R㢪B]∪{OJ:JTF)ljX\ IKN63oT4gn9 \ dhI's} @

以%EOF结尾。在servlet中,我重置了响应并设置了内容类型。我还应该做些什么来使PDF格式正确显示?

1 个答案:

答案 0 :(得分:1)

我找到了解决上述问题的方法。我按原样保留了servlet代码,但将查询更改为以下内容:

$('#form1').on('submit', function(e) { 
    $form = $(this);
    $.post($form.attr('action'), $form.serialize(), function(responseText) { 
        $('#processing2').fadeOut();
        $('#frm').attr('src', 'theServlet?x=' + $('#x').val() + '&y=' + $('#y').val());                                    
    });
    return false;  
});

所以基本上不是在responseText中使用数据,而是在传递参数时重新调用servlet。当然,这意味着实际代码必须位于servlet的doGet方法中。