2013-05-06 30 views
2

我使用lowagie/iTextPDF在Java中生成PDF,并且在Firefox和Chrome中显示输出时出现问题,但IE8显示它们正常。为什么生成的PDF在Internet Explorer中正确显示,但没有在FireFox或Chrome中显示?

Firefox和铬显示乱码,这样的:

%PDF-1.4%2 0 OBJ <>流x1B1C#@ 0#TM>}深航 nO?8 1 a غ y ӓB $ :9XC a./f { $ o - $?Ө^c/012'E j }WT/Y<? 5* endstream endobj 4 0 obj < >>>/MediaBox [0 0 612 1008]/Rotate 90 >> endobj 1 0 obj <> endobj 3 0目标<> endobj 5 0目标<> endobj 6 0目标<> 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预告片<] /信息6 0 R /尺寸7 >> 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文件。

+0

请随时检查此:http://stackoverflow.com/questions/6089904/itext-generated-pdf-not-shown-correctly-in-chrome – NMALKO 2013-05-06 21:02:25

+0

你有任何这个问题的现场例子,你可以链接到?如果firefox和chrome都不认为它是PDF,那么我猜测头文件有问题。 – 2013-05-14 21:31:53

+0

不幸的是,我没有任何公开的示例。另外,我尝试更改我的servlet代码以完全匹配以下链接的关节,并且它不起作用。 http://itextpdf.com/examples/iia.php?id=173 – robz1330 2013-05-15 16:04:40

回答

1

http://itextpdf.com/examples/iia.php?id=173你忘记设置内容长度,尽量ServletOutputStream out = response.getOutputStream();

+0

我试过了,不幸的是它没有工作。我甚至更改了我的servlet代码,使其与您发布的链接完全匹配,但仍然无效。 – robz1330 2013-05-15 16:02:49

+0

在http://itextpdf.com:8180/book/上为您服务吗? – async5 2013-05-15 22:52:40

+0

也尝试清除缓存(从前面步骤中生成的无效条目) – async5 2013-05-15 22:55:31

-1

我的答案在此之前加入response.setContentLength(baos.size());,我sucessed通过在新标签中打开.pdf文件,从更新发育的角度对单击按钮或链接目标应该是balnk e。克(目标= _blank)

0

尝试增加

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后();

+0

这对我很好 – Ved 2017-01-24 06:59:41

相关问题