PDF загружается с расширением txt в safari
Уважаемые Эксперты,
Используемый инструмент: Java
Шаги
1) генерировать PDF (используя jasperireport 3.6.1) java
2) Хранить На Сервере
3)применение электронной подписи хранится на сервере
4) Готов к загрузке на странице.
код ниже
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String newfile = (new StringBuilder("/JCN/PDF/")).append(statementType).append("/").append(jpaccno).append(cnopdfnm).append(".pdf").toString(); OutputStream os = new FileOutputStream(newfile); net.sf.jasperreports.engine.JasperPrint jasperPrint = JasperFillManager.fillReport(CNote, jasperParameter, con); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, os); exporter.setParameter(JRPdfExporterParameter.PERMISSIONS, new Integer(2068)); exporter.exportReport(); os.close(); String coordinateQry = (new StringBuilder("select dg_point from doc_con where rownum=1 and doc_typ='")).append(statementType).append("' ").toString(); rs = st.executeQuery(coordinateQry); rs.next(); String coordinate = rs.getString(1); onlineDigitalSign(newfile, outs, coordinate); outs.close(); } public void onlineDigitalSign(String s, OutputStream outputstream, String coordinate) { try { logger.info((new StringBuilder("New File for online DG.sign...")).append(s).toString()); BaseFont basefont = BaseFont.createFont("/usr/local/fonts/ZurichBT.TTF", "Cp1252", true); FontFactory.register("/usr/local/fonts/ZurichBT.TTF"); KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); keystore.load(new FileInputStream("/mypath/sg.ks"), "prd34".toCharArray()); String s1 = (String)keystore.aliases().nextElement(); PrivateKey privatekey = (PrivateKey)keystore.getKey(s1, "prd34".toCharArray()); java.security.cert.Certificate acertificate[] = keystore.getCertificateChain(s1); PdfReader pdfreader = new PdfReader(s); PdfStamper pdfstamper = PdfStamper.createSignature(pdfreader, outputstream, '\0'); PdfSignatureAppearance pdfsignatureappearance = pdfstamper.getSignatureAppearance(); pdfsignatureappearance.setCrypto(privatekey, acertificate, null, PdfSignatureAppearance.WINCER_SIGNED); pdfsignatureappearance.setReason("Digitally Signed"); pdfsignatureappearance.setLocation("in"); String DGP[] = new String[4]; DGP = coordinate.split(","); Float DGP1 = Float.valueOf(0.0F); Float DGP2 = Float.valueOf(0.0F); Float DGP3 = Float.valueOf(0.0F); Float DGP4 = Float.valueOf(0.0F); DGP1 = Float.valueOf(Float.parseFloat(DGP[0].trim())); DGP2 = Float.valueOf(Float.parseFloat(DGP[1].trim())); DGP3 = Float.valueOf(Float.parseFloat(DGP[2].trim())); DGP4 = Float.valueOf(Float.parseFloat(DGP[3].trim())); pdfsignatureappearance.setVisibleSignature(new Rectangle(DGP1.floatValue(), DGP2.floatValue(), DGP3.floatValue(), DGP4.floatValue()), 1, null); int i = pdfreader.getNumberOfPages(); int j = 0; do { if(j > i) break; if(++j == i) { PdfContentByte pdfcontentbyte = pdfstamper.getOverContent(j); pdfcontentbyte.beginText(); pdfcontentbyte.setFontAndSize(basefont, 9F); pdfcontentbyte.showTextAligned(6, "This is a digitally signed ", 28F, 14F, 0.0F); pdfcontentbyte.endText(); } } while(true); HashMap hashmap = pdfreader.getInfo(); hashmap.put("Subject", "My Statement"); hashmap.put("Title", "My Statement"); hashmap.put("Creator", "my name"); hashmap.put("Producer", "my product Name"); pdfstamper.setMoreInfo(hashmap); pdfstamper.close(); logger.info("Finished.1.."); } catch(Exception e) { logger.info((new StringBuilder("Exception Occured in onlineDigitalSign.....")).append(e.getMessage()).toString()); logger.error((new StringBuilder("Exception Occured in onlineDigitalSign.....")).append(e).toString()); } }
Что я уже пробовал:
мы попробовали setContentType=force-download
response. setContentType ("application / force-download");
ответ.сбросить();
response. setHeader ("Content-Disposition", " attachment;filename=CNotes. pdf");
Richard Deeming
application/force-download
не является допустимым типом MIME. Вам нужно установить тип контента на application/pdf
.
ShaktisinhRathod
Спасибо за ответ, ранее мы установили application / pdf, однако это не сработало, поэтому мы попробовали принудительную загрузку. браузер safari добавляет расширение". txt " в загруженный pdf-файл.
Richard Deeming
Потому что вы не указываете допустимый тип MIME.
Чтобы предотвратить открытие файла в браузере, пользователь Content-Disposition
вместо этого заголовок.
ShaktisinhRathod
Еще раз спасибо за ответ,Пожалуйста, простите меня, если я отнимаю у вас больше времени ...
Я поставил тип содержимого "application/pdf", находящегося по-прежнему сохраняются проблемы.
Тем не менее, когда мы загружаем pdf-файл, он устанавливает .txt, т. е. FileName.pdf.txt"
Огромное спасибо за вашу помощь!
Richard Deeming
Попробуйте удалить response.reset();
линия, или перемещение ее перед setContentType
линия.
ShaktisinhRathod
Спасибо,он работал с Safari, однако мы все еще сталкиваемся с проблемой открытия его с помощью iPhone или iPad
Мы внесли два изменения,
1) Как вы и предлагали, мы написали response.reset () перед setContentType.
2) мы использовали Applicaton/octet-stream вместо Applicaton / pdf
Огромное спасибо за помощь!