Test Foro de elhacker.net SMF 2.1

Programación => Programación General => Java => Mensaje iniciado por: Pablo Videla en 19 Octubre 2011, 15:36 PM

Título: Java JSF exportar flash a pdf [SOLUCIONADO]
Publicado por: Pablo Videla en 19 Octubre 2011, 15:36 PM
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 (java) [Seleccionar]

  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 (html4strict) [Seleccionar]

<!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 (html4strict) [Seleccionar]

<?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>

Título: Re: Java JSF exportar flash a pdf [SOLUCIONADO]
Publicado por: adastra en 21 Octubre 2011, 09:16 AM
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();                           }               
Título: Re: Java JSF exportar flash a pdf [SOLUCIONADO]
Publicado por: Pablo Videla en 21 Octubre 2011, 14:46 PM
Cita de: adastra en 21 Octubre 2011, 09:16 AM
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  ;)