为什么生成的PDF在Internet Explorer中正常显示,而在FireFox或Chrome中却没有?

我使用lowagie / iTextPDF在Java中生成PDF并且在Firefox和Chrome中显示输出时出现问题,但IE8显示它们很好。

Firefox和Chrome显示乱码,如下所示:

%PDF-1.4% 20 ob​​j streamx 1B1C #@ 0# Tm>}Zh nO?8 1 a y ӓB $ :9XC a. / f { $ o – $?ӨӨ^ c / ‘E j }WT / Y <? 5* endstream endobj 4 0 obj >> / MediaBox [0 0 612 1008] / Rotate 90 >> endobj 1 0 obj endobj 3 0 obj endobj 5 0 obj endobj 6 0 obj endobj xref 0 7 0000000000 65535 f 0000000379 00000 n 0000000015 00000 n 0000000467 00000 n 0000000211 00000 n 0000000530 00000 n 0000000575 00000 n预告片> startxref 697 %% EOF

这是servlet代码的一部分:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); Document reportPDFDocument = (Document)generateReport(request,conn,baos); PdfWriter.getInstance(reportPDFDocument, baos); response.setHeader("Expires", "0"); response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); response.setHeader("Pragma", "public"); response.setContentType("application/pdf"); response.setHeader("Content-disposition","inline; filename=PrintedSchedule.pdf"); ServletOutputStream out = response.getOutputStream(); baos.writeTo(out); out.flush(); 

我已经尝试更新Firefox,更新PDF插件,并确保它设置为使用Adobe的PDF查看器而不是Firefox的查看器。

作为测试,我更改了这一行:

从:

  response.setHeader("Content-disposition","inline; filename=PrintedSchedule.pdf"); 

至:

  response.setHeader("Content-disposition","attachment; filename=PrintedSchedule.pdf"); 

Internet Explorer似乎认识到它是一个正在下载的PDF。 我在IE中看到一个弹出窗口,上面写着:

要打开或保存此文件吗?

名称:PrintedSchedule.pdf类型:ADobe Acrobat文档

但FireFox认为这是一个’htm’文件,并给出了这个:

你选择了开放:

PrintedSchedule.pdf是一个:HTML文档

在Firefox中我然后选择Adobe Reader打开它,它工作正常。 但在标题栏中,我注意到它将’.htm’附加到文件名的末尾。

这可能是问题的线索吗? 如果是这样,我如何强制Firefox将其识别为PDF? 用户希望PDF在浏览器中显示,而不是在弹出窗口中显示,并且他们不希望单独下载PDF文件。

根据http://itextpdf.com/examples/iia.php?id=173,您忘记设置内容长度,请尝试添加response.setContentLength(baos.size());ServletOutputStream out = response.getOutputStream();之前ServletOutputStream out = response.getOutputStream();

尝试添加

 response.setHeader("Expires", "0"); response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0"); response.setHeader("Pragma", "public"); // setting the content type response.setContentType("application/pdf"); // the contentlength response.setContentLength(baos.size()); // write ByteArrayOutputStream to the ServletOutputStream OutputStream os = response.getOutputStream(); baos.writeTo(os); os.flush(); os.close(); 

关闭document.close();

我已经回答了这个问题,我通过在新标签中打开.PDF文件来进行操作,从开发角度看CLICK任一按钮或链接目标应该是balnk例如(target = _blank)