#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Þˆ}„0XB`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.