The immediate solution would be to invoke the servlet by GET, and to put this URL in de src attribute of the iframe, but in this case I want to invoke the servlet by POST.
Servlet code:
@WebServlet(urlPatterns="/sello") public class SelloRegistroServlet extends HttpServlet { private static final long serialVersionUID = 1L; private final SelloService selloService = new SelloServiceImpl(); @Override protected void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException { final DatosSello datos = recuperarDatosSello(request); final ConfiguracionSello config = recuperarDatosConfig(request); final ByteArrayOutputStream baos = selloService.generarSello(datos, config); response.setContentType("application/pdf"); response.setContentLength(baos.size()); response.setHeader("Content-Disposition", "inline;filename=\"selo.pdf\""); response.setHeader("filename", "selo.pdf"); final OutputStream outStream = response.getOutputStream(); outStream.write(baos.toByteArray()); outStream.flush(); outStream.close(); } private DatosSello recuperarDatosSello(final HttpServletRequest request) { (...) } private ConfiguracionSello recuperarDatosConfig(final HttpServletRequest request) { (...) } }
HTML code:
<html> <head> <script type="text/javascript"> var urlSello = 'http://localhost:8080/registro-itext/sello'; var generarSello = function() { var data = { numeroRegistro: document.getElementsByName("numReg")[0].value, fechaRegistro: document.getElementsByName("fechaReg")[0].value, codigoOficina: document.getElementsByName("codigoOfi")[0].value, nombreOficina: document.getElementsByName("nombreOfi")[0].value, codigoUnidad: document.getElementsByName("codigoUnidad")[0].value, nombreOficina: document.getElementsByName("nombreOfi")[0].value }; var params = Object.keys(data).map(function(key) { return key + '=' + encodeURI(data[key]); }).join('&'); var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){ if (this.readyState == 4 && this.status == 200){ console.log(this.response, typeof this.response); var urlBuilder = window.URL || window.webkitURL; document.getElementById("iFramePDF").src = urlBuilder.createObjectURL(this.response); document.getElementById("iFramePDF").style.display = 'block'; } }; xhr.open('POST', urlSello, true); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.setRequestHeader("Content-length", params.length); xhr.responseType = 'blob'; xhr.send(params); }; </script> </head> <body> <div id="contenido"> <button id="btnSello" type="button" onclick="generarSello();">Generar Sello</button> <table> <tr><td>Numero de registro: </td> <td> <input name="numReg" type="text" value="899998"></td></tr> <tr><td>Fecha de registro</td> <td> <input name="fechaReg" type="text" value="2015/01/01 10:10:00"></td></tr> <tr><td>Codigo de oficina</td> <td> <input name="codigoOfi" type="text" value="000"></td></tr> <tr><td>Nombre de oficina</td> <td> <input name="nombreOfi" type="text" value="Rexistro Xeral \nProbas"></td></tr> <tr><td>Codigo de unidad</td> <td> <input name="codigoUnidad" type="text" value="V0"></td></tr> </table> </div> <iframe id="iFramePDF" name="iFramePDF" src="" width="100%" height="100%" frameBorder="0" styele="display:none"></iframe> </body> </html>
The important parts are:
- You create an object with all the params to serialize it in the way "name=value&" and to send the outcome string to the servlet.
- You invoke the servlet by using XMLHttpRequest. In the callback function, you convert the whole response to a new URL and pass it to the iframe
No hay comentarios:
Publicar un comentario