流式PDF在浏览器中以文本形式打开

时间:2011-10-11 03:20:06

标签: java pdf filter http-headers

我正在编写一个将PDF流式传输到浏览器的过滤器。但它没有提示打开PDF。我得到的是浏览器窗口中显示的PDF内容如下:

%PDF-1.4 %âãÏÓ 4 0 obj <>stream xKoÂ0ïû+æØJ±CGo<-¤£ªIIIJEüû:Qi9 V¾xvw>ÍÚ{ê+âp-Á\*&_ÑöÄï:'21Ñý- )½¾qÄÔµárÙÌç$¥ÇL÷¢wݵ·´Ô£Wש^¨ÐØæT&Bg$ L¨wmUÀ2á89ºÓÝ8ª¬Ø Å«C®Ó$O0ØEYQYå÷jÛä¿ó,Æ[ïéµDLÊ´@guj`íà .:ÜîOòky#Ü/ªMõÃ_å2Ù:tk¾ôýBµð}eÀÀ,X¨ñ P¾¡ú±zËÁãSo6ÄÔWà?²ë1!Zôs|fÉÉ@QÖ8WzÁ:±.?Îßæçô¾RuÛ endstream endobj 1 0 obj<>>>/MediaBox[0 0 595.28 841.88]>> endobj 3 0 obj<> endobj 2 0 obj<> endobj 5 0 obj<> endobj 6 0 obj<> endobj 7 0 obj<> endobj xref 0 8 0000000000 65535 f

我检查了响应标题,它们显示如下:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Disposition: attachment; filename=example.pdf
Connection: keep-alive
Keep-Alive: timeout=5
Accept-Ranges: bytes
Content-Type: application/pdf;charset=ISO-8859-1
Transfer-Encoding: chunked
Date: Thu, 13 Oct 2011 01:56:17 GMT

3db
%PDF-1.4
%âãÏÓ
3 0 obj <</Length 145/Filter/FlateDecode>>stream
xœMŽ1Â0…÷÷+ž›.ñ’&M\E‡B ƒ¸U+%µ´‹ßT¨È-÷½û8Þˆ}„0X­B`lpˆ¨0B”Þñ
Ãs¾wЮ7aƒ¢d7û=œÛ)N¥›1«ëÏz¢Æ+¿gjç
Û£¦±Œèoªi
½÷Ê:ÆëÓ=¥õ0¥fµ‰ÝR³ÂÁ¾(V
endstream
endobj
1 0 obj<</Parent 4 0 R/Contents 3 0 R/Type/Page/Resources<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]/Font<</F1 2 0 R>>>>/MediaBox[0 0 595.28 841.88]>>
endobj
2 0 obj<</BaseFont/Times-Bold/Type/Font/Encoding/WinAnsiEncoding/Subtype/Type1>>
endobj
4 0 obj<</Type/Pages/Count 1/Kids[1 0 R]>>
endobj
5 0 obj<</Type/Catalog/Pages 4 0 R>>
endobj
6 0 obj<</Producer(iText 2.0.8 \(by lowagie.com\))/ModDate(D:20111013145617+13'00')/CreationDate(D:20111013145617+13'00')>>
endobj
xref
0 7
0000000000 65535 f 
0000000227 00000 n 
0000000389 00000 n 
0000000015 00000 n 
0000000477 00000 n 
0000000527 00000 n 
0000000571 00000 n 
trailer
<</Root 5 0 R/ID [<f6f88fa439f0fb7ffd89bb5bcc013692><d7556c8d673d80e2889958cdface8dba>]/Info 6 0 R/Size 7>>
startxref
702
%%EOF

0

我试过了:

  • 将内容处置设置为附件
  • 没有Content-disposition
  • 将MIME设置为application / download
  • 将Cache-Control设置为maxage = 1
  • 将Pragma设置为public
  • 我还在Tomcat web.xml中设置了MIME类型
  • 创建了一个新的标准网络应用程序,并使用了完全相同的代码,并且PDF生成顺利。

3 个答案:

答案 0 :(得分:0)

在编写对outputstream的响应之前,您应确保在Servlet中确定以下内容:

res.setContentType( "application/pdf" );
res.setHeader("Content-disposition",
                  "attachment; filename=" +
                  "Example.pdf" );

附件标签用于表示不在浏览器中打开文档但使用某些PDF Reader应用程序(如Adobe Acrobat)

filename是要使用的文件的默认名称。

答案 1 :(得分:0)

一个技巧是向URL添加一个以.pdf结尾的伪参数。

答案 2 :(得分:0)

在我的情况下,使用jasperreports生成报告时会出现此问题。 我找到了一个解决方案:

response.setContentType( "application/pdf" );
设置之前

JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, new HashMap(), cn);