Java JSF exportar flash a pdf [SOLUCIONADO]

Iniciado por Pablo Videla, 19 Octubre 2011, 15:36 PM

0 Miembros y 1 Visitante están viendo este tema.

Pablo Videla

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>


adastra

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();                           }               

Pablo Videla

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  ;)