Потоковый PDF открывается как текст в браузере

#java #pdf #filter #http-headers

#java #PDF #Фильтр #http-заголовки

Вопрос:

Я пишу фильтр, который передает PDF в браузер. Но он не запрашивает открытие PDF-файла. Я получаю содержимое PDF-файла, отображаемого в окне браузера, как показано ниже:

 %PDF-1.4 %âãÏÓ 4 0 obj <>stream xKoÂ0ïû æØJ±CGo<-¤£ªIIIJEüû:Qi9 V¾xvw>ÍÚ{ê âp-Á*amp;_ÑöÄï:'21Ñý- )½¾qÄÔµárÙÌç$¥ÇL÷¢wݵ·´Ô£Wש^¨ÐØæTamp;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…÷÷ ž›.ñ’amp;ME‡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
  

Я пробовал:

  • Установка содержимого для вложения
  • Без содержимого-расположение
  • Установка MIME для приложения / загрузка
  • Установка для элемента управления Cache значения maxage = 1
  • Установка для Pragma значения public
  • Я также установил тип MIME в Tomcat web.xml
  • Создал новое стандартное веб-приложение и использовал тот же код, и PDF-файл был сгенерирован без сбоев.

Комментарии:

1. Вы когда-нибудь это понимали. У меня такая же проблема

Ответ №1:

Ниже приведены вещи, которые вы должны убедиться, что они есть в вашем сервлете, прежде чем писать ответ на outputstream :

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

тег вложения используется для указания того, что документ открывается не в браузере, а с помощью какого-либо приложения для чтения PDF (например, Adobe Acrobat)

filename — это имя используемого файла по умолчанию.

Комментарии:

1. Заголовки content-type и content-disposition, похоже, настроены правильно. Я могу просмотреть заголовки в HTTP Analyzer

2. с каким браузером вы пытаетесь? Не могли бы вы попробовать использовать Mozilla Firefox или Opera

3. Это происходит в IE, Firefox и Chrome

4. Это странно: (Не могли бы вы проверить, происходит ли это со всеми типами файлов? Что, если вы отправите фиктивный файл .vcf и установите тип содержимого как text / x-vcard. Я думаю, что то, что мы пытаемся сделать, правильно, и его браузер плохо себя ведет: (

5. Я думаю, что, возможно, один из других 6 фильтров в приложении делает что-то забавное. Причина, по которой я говорю это, заключается в том, что я создал простое веб-приложение и перенес в него свой фильтр без каких-либо изменений, и все это работало нормально. Тем не менее, заголовки ответов и содержимое обоих веб-приложений идентичны, за исключением даты курса.

Ответ №2:

В моем случае эта проблема возникает при создании отчета с помощью jasperreports. Я нахожу решение, устанавливающее это:

 response.setContentType( "application/pdf" );
  

перед установкой этого:

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

Ответ №3:

Один из приемов заключается в добавлении фиктивного аргумента к URL-адресу, который заканчивается на .pdf .

Комментарии:

1. Извините, я не понимаю. Что это значит?

2. Пример: yourcompany.com/reports/gen.aspx?id=4398amp;dummy=doc.pdf id — это реальный аргумент, а dummy — фиктивный… Браузеры будут учитывать .pdf, чтобы принять решение об открытии подключаемого модуля для чтения PDF.