elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
27 Mayo 2012, 23:28  


Tema destacado: ¡Aprende hacking con práctica! - WarZone, el wargame de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java (Moderadores: Debci, Leyer)
| | | |-+  Java JSF exportar flash a pdf [SOLUCIONADO]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Java JSF exportar flash a pdf [SOLUCIONADO]  (Leído 794 veces)
DonVidela


Desconectado Desconectado

Mensajes: 1.617



Ver Perfil WWW
Java JSF exportar flash a pdf [SOLUCIONADO]
« en: 19 Octubre 2011, 15:36 »

Estimados, estoy trabajando con amchart, unos graficos en flash y ademas estoy importando ese flash a pdf, si lo hago con un FileOutputStream funciona bien, pero si lo quiero ver en linea, no me lo genera, voy a publicar el metodo completo para que ustedes puedan ayudarme, de antemano muchas gracias.

Código
  public void doPost() throws ServletException, IOException, DocumentException {
 
       System.out.println("Entre al metodo doPost");
       HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
 
       String heightStr = request.getParameter("height") == null ? "0" : request.getParameter("height");
       String widthStr = request.getParameter("width") == null ? "0" : request.getParameter("width");
       int height = 520;
       int width = 300;
       //int height = Integer.parseInt(heightStr.indexOf(".") == -1 ? heightStr : heightStr.substring(0, heightStr.indexOf(".")));
       // int width = Integer.parseInt(widthStr.indexOf(".") == -1 ? widthStr : widthStr.substring(0, widthStr.indexOf(".")));
       BufferedImage image = new BufferedImage(height, width, BufferedImage.TYPE_INT_RGB);
       Graphics g = image.getGraphics();
 
       String current_row = "";
       Image docImage = null;
       try {
           for (int i = 0; i < height; i++) {
               current_row = request.getParameter("r" + i) == null ? "" : request.getParameter("r" + i);
               System.out.println("Estoy dentro del ciclo y esta es la info : " + request.getParameter("r" + i) == null ? "" : request.getParameter("r" + i));
               String current_col[] = current_row.split(",");
               int current_width = 1;
               for (int m = 0; m < current_col.length; m++) {
                   String pixel[] = current_col[m].split(":");
 
                   if (pixel.length > 1) {
                       g.setColor(this.charColor(pixel[0]));
                       g.drawLine(current_width, i, current_width + Integer.parseInt(pixel[1]), i);
                       current_width = current_width + Integer.parseInt(pixel[1]);
                   } else if (pixel.length == 1) {
                       g.setColor(this.charColor(pixel[0]));
                       g.drawLine(current_width, i, current_width + 1, i);
                       current_width++;
                   }
 
 
               }
           }
 
           docImage = Image.getInstance(image, null);
 
       } catch (Exception e) {
           e.printStackTrace();
       }
       g.create();
 
       Document doc = new Document();
       ByteArrayOutputStream baosPDF = new ByteArrayOutputStream();
       PdfWriter docWriter = null;
       PdfWriter dos = null;
 
       try {
           docWriter = PdfWriter.getInstance(doc, baosPDF);
           dos = PdfWriter.getInstance(doc, new FileOutputStream("C:\\ejemplo.pdf"));
 
           doc.open();
 
           Table table = new Table(1, 1);
           table.setWidth(100);
           table.setTableFitsPage(true);
           table.setAlignment(Table.ALIGN_LEFT);
           table.setBorder(Table.NO_BORDER);
 
           Cell cell = new Cell();
           cell.setBorder(Cell.NO_BORDER);
           cell.setVerticalAlignment(Cell.ALIGN_TOP);
           cell.add(docImage);
 
           table.addCell(cell);
           doc.add(table);
 
           doc.close();
 
       } catch (DocumentException e) {
           e.printStackTrace();
       }
 
 
 
       try {
           FacesContext facesContext = FacesContext.getCurrentInstance();
           HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
              //  response.resetBuffer();
 
           response.setContentType("application/pdf");
 
           response.setContentLength(baosPDF.size());
           System.out.println("Tamaño BAOSPDF : " + baosPDF.size());
           //     System.out.println("RespuestA ? : " + response.getOutputStream().toString());
           //      ServletOutputStream out = response.getOutputStream();
 
           ServletOutputStream out = response.getOutputStream();
           baosPDF.writeTo(out);
           out.write(baosPDF.toByteArray());
           out.flush();
           out.close();
           //   baosPDF.flush();
           //  baosPDF.close();
           facesContext.responseComplete();
       } catch (Exception e) {
           System.out.println("Error : " + e.getMessage());
           e.printStackTrace();
       }
 
 
       System.out.println("Sali del metodo dopost");
 
   }
 

El error que me sale es el siguiente "INFO: Error : PWC3990: getWriter() has already been called for this response" He buscado multiples opciones, alternativas, y ninguna me ha servido, por eso acudo a ustedes, espero que me puedan ayudar o darme ideas al respecto, gracias!


PD: Coloque el mime type a word para ver lo que escribe y solo escribe html y body xD , si necesitan mas datos me avisan

PD2: El error esta exactamente acá  ServletOutputStream out = response.getOutputStream();

Después de varios dias de intento, la solución era bastante ridicula y simple xD

en el xhtml que llama el método lo tenia asi :



Código
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:h="http://java.sun.com/jsf/html"
     xmlns:f="http://java.sun.com/jsf/core">
<h:body>
#{pdfMB.doPost()}
</h:body>
</html>
 

Y la solución es así.

La cosa es que al generar la pagina llamaba automaticamente al evento y generaba una excepcion en el response, pero si hacia que yo generara un evento y de ahí lo llamará automaticamente, entonces si funcionaba bien.

Me di cuenta porque si colocaba un boton que llamara al metodo me pintaba en negro el pdf, y no me tomaba los datos, entonces debí automatizar eso,  y aqui la respuesta.

Código
<?xml version='1.0' encoding='UTF-8' ?>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:h="http://java.sun.com/jsf/html"
     xmlns:f="http://java.sun.com/jsf/core">
 
 
   <h:body>
       <h:form>
           <f:event listener="#{pdfMB.doPost()}" type="preRenderView" />
      <!-- <h:commandButton action="{pdfMB.doPost()}" />-->
       </h:form>
   </h:body>
 
 
</html>
 


« Última modificación: 19 Octubre 2011, 20:01 por BadDevil » En línea

Aprendiendo: Java , C# , pl/sql, mysql , sql server, PHP , Access, JSF, Facelets, JSP, CakePHP, JQuery

http://pablovidela.wordpress.com
adastra
Endless Learner
Colaborador
***
Desconectado Desconectado

Mensajes: 626


http://thehackerway.com/


Ver Perfil WWW
Re: Java JSF exportar flash a pdf [SOLUCIONADO]
« Respuesta #1 en: 21 Octubre 2011, 09:16 »

Te aparece en "negro" cuando pones un botón porque en el proceso de renderizado estas invocando directamente al "responseComplete" por ende los demás pasos del ciclo de vida no se llegan a ejecutar... el código podria ser:

if(content != null){
   response.setHeader("Content-Disposition","inline;filename=PDFNAME.PDF");
   response.setContentType("application/pdf");
   response.setContentLength(content.length);
   response.getOutputStream().write(content);
response.getOutputStream().flush();                        response.getOutputStream().close();                           }               


En línea

http://twitter.com/jdaanial
http://thehackerway.com/

"Nunca discutas con un idiota, podria no notarse la diferencia"
Kant.
DonVidela


Desconectado Desconectado

Mensajes: 1.617



Ver Perfil WWW
Re: Java JSF exportar flash a pdf [SOLUCIONADO]
« Respuesta #2 en: 21 Octubre 2011, 14:46 »

Te aparece en "negro" cuando pones un botón porque en el proceso de renderizado estas invocando directamente al "responseComplete" por ende los demás pasos del ciclo de vida no se llegan a ejecutar... el código podria ser:

if(content != null){
   response.setHeader("Content-Disposition","inline;filename=PDFNAME.PDF");
   response.setContentType("application/pdf");
   response.setContentLength(content.length);
   response.getOutputStream().write(content);
response.getOutputStream().flush();                        response.getOutputStream().close();                           }               


Ya esta solucionado, pero cuando retome ese proyecto de nuevo probare tu solución. Se agradece tu respuesta  ;)
En línea

Aprendiendo: Java , C# , pl/sql, mysql , sql server, PHP , Access, JSF, Facelets, JSP, CakePHP, JQuery

http://pablovidela.wordpress.com
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Cual es el mejor formato para exportar en flash?
Diseño Gráfico
denacroxis 2 967 Último mensaje 12 Noviembre 2004, 00:49
por Morris
exportar de photoshop a flash
Diseño Gráfico
rodaelog 2 1,076 Último mensaje 19 Noviembre 2006, 16:23
por rodaelog
Como exportar fuentes en flash ?
Diseño Gráfico
DelmasX 6 2,461 Último mensaje 12 Abril 2007, 16:29
por Azielito
[Solucionado] [C++] Exportar Símbolos
Programación C/C++
vertexSymphony 0 627 Último mensaje 28 Marzo 2009, 19:35
por vertexSymphony
Problema al exportar a SWF, exporta a muy mala calidad (Flash CS4)
Diseño Gráfico
Danfelbm 4 4,359 Último mensaje 26 Septiembre 2009, 02:32
por Castg!
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines