Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: h3ct0r en 22 Abril 2011, 07:31 am



Título: Duda con Creación dinamica de PDF en entorno web JAVA con Itext
Publicado por: h3ct0r en 22 Abril 2011, 07:31 am
Buenos días amigos, me he visto en la necesidad de que en mi sitio de e-commerce (Tienda online) se encuentre la opción de imprimir la "factura" o "comprobante" de la compra, así como la capacidad de guardar esa factura en formato PDF.

Estoy utilizando java web para esto, y conseguí una buena y sencilla librería llamada Itext que me permite la creación de los PDF.

Mi pregunta es, ¿Cual seria la manera mas óptima de presentar el PDF a los usuarios?. Estaba pensando en crear el PDF en memoria y mostrárselo al usuario directamente, esto a travez de un servlet que reciba los parámetros de la factura (Nombre, productos, fecha, etc) por GET, POST, o a travez de una variable de sesión (Preferiblemente una variable sesión ya que así me quitaría el dolor de cabeza de algún tipo de mal uso del servlet si se le pasan valores incorrectos por GET o POST), para luego crear el PDF y mostrárselo al usuario. Quisiera evitar en lo posible crear los documentos dentro de algún directorio en el servidor ya que tendría que crear alguna especie de cron para cada cierto tiempo eliminarlos despues de un tiempo específico.

Quisiera saber que opinan ustedes de esta manera de realizarlo, o si existe un mejor enfoque.

Muchisimas gracias!  ;)

PD: Si necesitan que les de mas información o si no se entiende bien la pregunta o el problema por favor avisenme para modificar el tema. Me parece raro que ya mas de 100 personas vean el tema y no opinen nada!


Título: Re: Duda con Creación dinamica de PDF en entorno web JAVA con Itext
Publicado por: madpitbull_99 en 23 Abril 2011, 17:43 pm
Citar
Estaba pensando en crear el PDF en memoria y mostrárselo al usuario directamente,

Es justamente lo que hacen la mayoría de los sitios, crear el PDF "on the fly" y mostrárselo al usuario.

Para que el navegador interprete correctamente el PDF tendrías que usar tipos MIME en las cabeceras HTTP (solo si tu librería no lo hace),
el MIME sería algo así: text/pdf.

El otro proceso(el de crearlo en el servidor, enviarlo al usuario y borrarlo) es más lento y no te lo recomiendo.


Título: Re: Duda con Creación dinamica de PDF en entorno web JAVA con Itext
Publicado por: h3ct0r en 23 Abril 2011, 21:56 pm
Gracias por tu reply madpitbull_99 , efectivamente voy a tomar tu consejo y lo haré en memoria. Comentaré los resultados!

Saludos! ;D


Título: Re: Duda con Creación dinamica de PDF en entorno web JAVA con Itext
Publicado por: mikezero84 en 22 Noviembre 2012, 02:12 am
Buen Día, Hector me he topado con ese mismo problema, hasta el momento lo que había hecho es la manera difícil, crear un pdf en una carpeta temporal pero si es muy tardado, algún ejemplo que me puedas aportar para entender como hacerlo al vuelo?, te lo agradecería.

Saludos

dejo mi codigo:
Código:
<%@page contentType = "text/html" pageEncoding="UTF-8"%>
<%@page import = "java.io.IOException"%>
<%@page import = "java.io.OutputStream"%>
<%@page import = "java.io.FileOutputStream"%>
<%@page import = "java.io.File"%>
<%@page import = "java.io.BufferedWriter"%>
<%@page import = "java.io.OutputStreamWriter"%>
<%@page import = "javax.servlet.ServletException"%>
<%@page import = "javax.servlet.http.HttpServlet"%>
<%@page import = "javax.servlet.http.HttpServletRequest"%>
<%@page import = "javax.servlet.http.HttpServletResponse"%>
<%@page import = "org.xhtmlrenderer.pdf.ITextRenderer"%>
<%@page import = "javax.servlet.http.HttpSession"%>
<%@page import = "java.sql.SQLException"%>
<%@page import = "java.io.PrintWriter"%>


<%@page import = "java.util.Vector"%>
<%@page import = "java.io.InputStream"%>
<%@page import = "java.io.FileInputStream"%>

<%@ page import="java.util.Vector" %>
<%@page import="java.util.ArrayList"%>

<%@page import= "java.sql.Timestamp"%>
<%@page import= "java.util.Date"%>
<%@page import= "java.text.SimpleDateFormat"%>



<%
   
    String strCadena = "";
    String htmlPDF = "";
    String strOrientacion = "";
    String strResultado = "";
    String strDependencia = "";
    String DATE_FORMAT = "yyMMddHHmmss";
    String fecha = "";
   
    int iPagina = 1;
    int iTotalEmpleados = 0;
    int iPaginaInicio = 0;
    int iPaginaFinal = 0;
    long iTotalPaginas = 0;
    int iOpcion = 0;
    int iRangoDesde = 0;
    int iRangoHasta = 0;
    int iOrdenar = 1;
    int iRegsXpagina = 10000;
   
    ArrayList vcResultado = null;
    Vector vcColumnas = null;

    int iColumnas = 0;
   
    File inputFile;
   
    ResultSQL result = null;
   
    try{
       
        if (request.getParameter("input-opcion")!= null
                && !request.getParameter("input-opcion").equals("undefined")){
                String tmp = request.getParameter("input-opcion");
            iOpcion = Integer.parseInt(tmp);
            }
       
         if (iOpcion == 4){
                    if (request.getParameter("input-rangoDesde")!= null
                        && !request.getParameter("input-rangoDesde").equals("undefined")){
                        iRangoDesde = Integer.parseInt(request.getParameter("input-rangoDesde"));
                    }
                   
                    if (request.getParameter("input-rangoHasta")!= null
                        && !request.getParameter("input-rangoHasta").equals("undefined")){
                        iRangoHasta = Integer.parseInt(request.getParameter("input-rangoHasta"));
                    }
            }else{
                if (request.getParameter("input-buscarCadena")!= null
                    && !request.getParameter("input-buscarCadena").equals("undefined")){
                    strCadena = request.getParameter("input-buscarCadena");
                }
            }
       
            if(request.getParameter("ordenar")!= null
                && !request.getParameter("ordenar").equals("")
                && !request.getParameter("ordenar").equals("undefined")){
            iOrdenar = Integer.parseInt(request.getParameter("ordenar"));
            }

            if (request.getParameter("orientacion")!= null
                && !request.getParameter("orientacion").equals("undefined")){
            strOrientacion = request.getParameter("orientacion");
            }
       
        //**XHTML
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
        fecha += sdf.format(date);
        inputFile = new File(getServletContext().getRealPath("tmp/temporal"+fecha+".xhtml"));

        if(!inputFile.exists()){ 
            inputFile.createNewFile();
        }
       
        result = new ResultSQL();
        result.setStrSever(request.getHeader("host"));
        result.setStrUbicacion(getServletContext().getRealPath("").toString());
        result.setiRegistrosXPagina(iRegsXpagina);
       
        result.resultSQLConecta("logsweb");
       
        String strTempEmpleados = "";
       
        if (iOpcion !=  4){
            vcResultado = (ArrayList) result.getConsultaEmpleados(strCadena, iOpcion, false, iPagina, iOrdenar, strOrientacion, true);
        }
        else{
            vcResultado = (ArrayList) result.getConsultaEmpleadosRangos(iRangoDesde,iRangoHasta, false, iPagina, iOrdenar, strOrientacion, true);
        }
                       
        Empleado empleado = null;
       
        strResultado +="    <div id='tbConsultasRecibidas' class='tabla-seguimiento'> "+
                                     "    <table class='tabla' id='tbConsultasRecibidas-tabla' align='center'>"+
                                     "              <thead>"+
                                     "    <tr class='thead'>";
       
        if (iOpcion != 2){
       
            strResultado +="                              <th>Dependencia</th>"+
                                         "                              <th>Nombre</th>"+
                                         "                              <th>Puesto</th>"+
                                         "                              <th>Sueldo Bruto (Incluye prestaciones)</th>"+
                                         "                              <th>Prima Vacacional</th>"+
                                         "                              <th>Aguinaldo</th>"+
                                         "                              <th>Pagos Anuales</th>"+
                                         "    </tr>"+
                                         "              </thead>"+
                                         "              <tbody>";
        }
        else{
                strResultado +="                              <th>Nombre</th>"+
                                         "                              <th>Puesto</th>"+
                                         "                              <th>Sueldo Bruto (Incluye prestaciones)</th>"+
                                         "                              <th>Prima Vacacional</th>"+
                                         "                              <th>Aguinaldo</th>"+
                                         "                              <th>Pagos Anuales</th>"+
                                            "    </tr>"+
                                            "              </thead>"+
                                            "              <tbody>";
        }
       
        for(int i = 0 ; i < vcResultado.size(); i++){

                empleado = (Empleado) vcResultado.get(i);

                String strOpcion = "";
                   
                if (iOpcion != 2){
                   
                    strResultado += "<tr class='fila1'>  "+
                                                  "     <td id='cadena'>"+empleado.getStrDependencia() + "</td>"+
                                                  "     <td id='cadena'>"+empleado.getStrNombre() + "</td>"+
                                                  "     <td id='cadena'>"+empleado.getStrPuesto() + "</td>"+
                                                  "     <td id='moneda'>"+empleado.getStrSueldo() + "</td>"+
                                                  "     <td id='moneda'>"+empleado.getStrPrimaVacacional() + "</td>"+
                                                  "     <td id='moneda'>"+empleado.getStrAguinaldo() + "</td>"+
                                                  "     <td id='moneda'>"+empleado.getStrPagosAnuales() + "</td>";
                    strResultado += "</tr>" ;
                   
                    }else{
                       
                            strResultado += "<tr class='fila1'>  "+
                                                          "     <td id='cadena'>"+empleado.getStrNombre() + "</td>"+
                                                          "     <td id='cadena'>"+empleado.getStrPuesto() + "</td>"+
                                                          "     <td id='moneda'>"+empleado.getStrSueldo() + "</td>"+
                                                          "     <td id='moneda'>"+empleado.getStrPrimaVacacional() + "</td>"+
                                                          "     <td id='moneda'>"+empleado.getStrAguinaldo() + "</td>"+
                                                          "     <td id='moneda'>"+empleado.getStrPagosAnuales() + "</td>";
                            strResultado += "</tr>" ;
                            strDependencia = empleado.getStrDependencia().toUpperCase();
                    }
        }
        strResultado+="             </tbody> "+
                                    "               <tfoot>  "+
                                    "               </tfoot> "+
                                    "           </table> "+
                                    "       </div>";
       
       
        htmlPDF +=     "<!DOCTYPE html>  "+
                                "<html> "+
                                "<head> "+
                                "<meta charset='UTF-8'></meta> "+
                                "<title>Sueldos de Personal</title> "+
                                "<link rel='stylesheet' media='print' href='../css/print.css' type='text/css'></link> "+
                                "</head> "+
                                "<body> "+
                                "<div class='contenedor-Principal'> "+
                                "    <div class='titulos'> "+
        if (iOpcion == 2){
            htmlPDF +="        <h4>"+strDependencia+"</h4> ";
        }
            htmlPDF +="    </div> "+
                                "    <br/> "+
                                "    <br/> "+
                                "    <br/> "+
                                        strResultado+
                                "</div> "+
                                "</body> "+
                                "</html>";
       
        BufferedWriter Fescribe=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(inputFile,false), "utf-8"));   
        Fescribe.write(htmlPDF); 
        Fescribe.close();

        //***PDF
        String outputFile = getServletContext().getRealPath("tmp/sueldosplantilla"+ fecha +".pdf");

        OutputStream os = new FileOutputStream(outputFile);
               
        ITextRenderer renderer = new ITextRenderer();
       
        renderer.setDocument(inputFile);   
        renderer.layout();
        renderer.createPDF(os);
        os.close();

        //***Borrar XHTML
        if(inputFile.exists()){   
            inputFile.delete();   
        }
       
     }catch(Exception e){
        out.println("-1");
        Bitacora bitacora = new Bitacora();
        bitacora.setStrServer(request.getHeader("host"));
        bitacora.setStrUbicacion(getServletContext().getRealPath("").toString());
        bitacora.setITipoBitacora(1);
        bitacora.setStrInformacion(e, request.getServletPath());
        bitacora.grabaBitacora();
    }finally{
       
    }

%>
<!DOCTYPE html>
<html>
  <head>
    <title>
    </title>
      <script type='text/javascript' src='js/jquery-1.8.2.js'></script>
      <script type="text/javascript">
          window.location.replace("../tmp/sueldosplantilla<%=fecha%>.pdf");
      </script>
  </head>
  <body>
    <header>Header</header>
    <div id='content'>Content</div>
    <div id='footer'>Footer</div>
  </body>
</html>