jueves, 23 de mayo de 2013

Tutorial Crear / Generar PDF online con PHP y HTML

Buenos días!
Hoy os voy a presentar un tutorial un poco diferente de los que estáis acostumbrados a ver en esta web. Trata sobre .php y de cómo poder generar .pdf online de manera automática con datos dinámicos. Aun siendo algo diferente este tutorial es tan útil como cualquier otro de la web además a sido pedido por nuestra amiga Ana visitante de esta web.

Para realizar un trabajo así vamos a utilizar una librería 'free software' de un tal Renato Coelho. Y yo os voy a explicar cómo poder utilizarla.

Para empezar nos descargamos la librería que la he subido en .rar a otro servidor ya que no me acuerdo de donde la descargué, el link es el siguiente:


http://goo.gl/0C86q
Una vez descargado el archivo lo descomprimiremos lo descomprimiremos y pondremos la carpeta pdf en nuestra raíz /. Pues ya tenemos la librería preparada ahora vamos a hacer el motor que la ara funcionar y le enviara los datos, en este caso le llamaremos crear_pdf.php.
A continuación veréis el código totalmente comentado:

crear_pdf.php:
<?php 
 /*La parte más importante es incluir la librería
   En este archivo PHP*/
 include('pdf/html2fpdf.php');
 
 /*Ahora escribiremos en HTML lo que queramos que se imprima
   Dentro del PDF como véis lo metemos todo dentro de la
   variable $html en este caso será una tabla*/
 $html = '<body>
  PDF creado con el tutorial de www.tutorialeshtml5.com<br />
  <br />
  <br />
  En este caso una tabla con el tiempo:<br />
  <br />
  <table width="200" border="1">
    <tr>
   <td width="113">Viladecans</td>
   <td width="71">21C</td>
    </tr>
    <tr>
   <td>Sant Boi</td>
   <td>19C</td>
    </tr>
    <tr>
   <td>Hospitalet</td>
   <td>20C</td>
    </tr>
    <tr>
   <td>Barcelona</td>
   <td>18C</td>
    </tr>
    <tr>
   <td>El Prat</td>
   <td>20C</td>
    </tr>
  </table>';
 /* Una vez escrito el HTML crearemos el objeto que
    está dentro de la librería que hemos importado
 */
 $pdf = new HTML2FPDF(); 
 //Añadimos una página al pdf
 $pdf -> AddPage(); 
 //escribimos todo el html en esta pagina creada
 $pdf -> WriteHTML($html);
 /*Si necesitáramos más pagina abria que repetir la
 funcion de AddPage() y la de WriteHTML aquí*/
 
 /*Finalmente escribimos el nombre de fichero y la 
 ruta donde lo queremos guardar en este caso la raiz */
 $pdf -> Output('tabla_tiempo.pdf');
 //Escribimos una respuesta por pantalla
 echo "PDF creado con éxito"; 
?>
Una vez creado el crear_pdf.php tan solo tenemos que visitarlo con el navegador y verémos que se a creado el PDF en el servidor en el mismo lugar donde se encuentra éste.

*Si no se creara el archivo .pdf comprueba los permisos de la carpeta que tengan permiso de escritura.

Muchas grácias a todos!
No olvidéis de comentar!!!

21 comentarios:

  1. Genial Victor, realmente muy interesante, lo pondré en uso a ver que tal funciona! saludos!

    ResponderEliminar
  2. Muy bueno el tutorial :D pero no entendí bien lo de poner la carpeta pdf en la raíz :( ¿Podras explicarlo con más detalle? ¿Es html5 verdad?

    ResponderEliminar
    Respuestas
    1. No es HTML ya que lo único que utiliza de HTML es la tabla.

      Poner una cosa en la raíz significa que no va dentro de ninguna carpeta que está hay suelto donde el archivo al que nos referimos. Es lo mismo que decir pon el archivo junto al otro sin meterlo dentro de ninguna carpeta.

      Eliminar
  3. Hola Victor, muy bueno el tutorial, está bien para las personas que requieren publicar documentos sin ser unos genios del pdfphp. Observo tambien que al momento de generar el pdf, el navegador muestra dos funciones: ereg() y set_magic_quotes_runtime() que ya están fuera de juego. Aunque no influyen en la creación del pdf, habría que actualizar el código en esos dos detallitos.

    De todas formas, te felicito no solo por hacer el trabajo, sino por publicarlo para que muchos aprendamos de esos momentos en que profundizas conocimientos para compartirlos.

    ResponderEliminar
    Respuestas
    1. Muchas gracias por tu comentario. Y en efecto los tutoriales que aqui publico nunca van a estar 100% perfectos según los entandares, sin embargo los tutoriales que escribo son los que me hubiera encantado encontrar cuando yo empecé en esto :D. Simplemente son de ayuda y para ayudar a expandir la mente en estos mundos. Gracias a todos!

      Eliminar
  4. Estuve intentando crear el PDF siguiendo los pasos del ejemplo, pero genera el siguiente error
    Fatal error: Call to undefined method HTML2FPDF::DisplayPreferences() in C:\carpeta_root\pdf\html2fpdf.php on line 155

    Cyal puede ser el inconveniente.?

    ResponderEliminar
    Respuestas
    1. mmmm.. el error puede estar en la linea 62-63 del archivo html2pdf.php

      son:
      require_once(RELATIVE_PATH.'fpdf.php');
      require_once(RELATIVE_PATH.'htmltoolkit.php');

      intenta afinarlas mejor por ejemplo:
      require_once(RELATIVE_PATH.'../fpdf.php');
      require_once(RELATIVE_PATH.'../htmltoolkit.php');

      o si lo tienes dentro de otra carpeta:
      require_once(RELATIVE_PATH.'../carpeta/fpdf.php');
      require_once(RELATIVE_PATH.'../carpeta/htmltoolkit.php');

      Haz unas cuantas pruebas y me comentas.

      Gracias!

      Eliminar
  5. Hola,

    Gracias por el tutorial. Respecto a los errores:

    error magic_quotes del archivo fpdf.php. En la linea 1804 (aprox) y unas 20 más adelante se puede substituir :

    ## set_magic_quotes_runtime(0);
    ini_set("magic_quotes_runtime", 0);

    y

    ## set_magic_quotes_runtime($mqr);
    ini_set("magic_quotes_runtime",$mqr);

    Respecto al errror de html2fpdf.php en la linea 460 aprox. hay que substituir ereg por la funcion preg_match:

    ## if(ereg('^([^=]*)=["\']?([^"\']*)["\']?$',$v,$a3)) ===> NO FUNCIONA
    if(preg_match( '/^([^=]*)=["\']?([^"\']*)["\']?$/',$v,$a3))

    ResponderEliminar
    Respuestas
    1. Muchísimas gracias!
      Será muy útil a mucha gente, quien lo pruebe que comente resultados.

      Eliminar
  6. Es posible añadir archivos de css y el pdf los respetara? lo que quiero es crear un pdf con estilos, no solo texto plano.
    gracias de antemano.

    ResponderEliminar
    Respuestas
    1. intente añadir el head antes de la etiqueta de body llamando mis estilos externos, tambien intente poner los estilos in-line para ver si de esa manera los respetaba, pero parece no funcionar.

      Hay manera de realizar el PDF con estilos?

      Eliminar
    2. No lo he probado, todo dependerá de la librería utilizada. Seguramente con esta no te lo permita..

      Eliminar
  7. hermano necesito q me resp esta pregunta de urgencia me sale este error cuando le doy generar pdf '; $pdf = new HTML2FPDF(); $pdf -> AddPage(); $pdf -> WriteHTML($html); $pdf -> Output('tabla_tiempo.pdf'); echo "PDF creado con éxito"; ?>

    ResponderEliminar
  8. Hola podrias poner un link del demo, y actualizar la descarga de los archivos?..me parece muy interesante :D!

    ResponderEliminar
  9. el link para descargar la libreria no funciona no lo encuentra

    ResponderEliminar
  10. La url de descarga se ha caido donde puedo encontrar el archivo con la funciones?
    Gracias

    ResponderEliminar
  11. El link no funciona... así que les comento que la librería HTML2PDF se puede descargar desde http://html2pdf.fr/es/default. Los invito a visitar mi blog donde tratamos este mismo tema.
    saludos!

    ResponderEliminar
  12. Muy bueno tu tutorial, mi duda es la siguiente:
    ¿Con que funcion puedo integrar la fecha actual en que se genero el pdf?, ¿con que funcion lo puedo hacer?, espero me ayudes

    ResponderEliminar
  13. me hacen el favor y me dicen como descargo el archivo anexo

    ResponderEliminar
  14. me hacen el favor y me dicen como descargo el archivo anexo

    ResponderEliminar
  15. Hola! cómo puedo mostrar una imagen en una celda en PDF que está en la base de datos?? muchas gracias

    ResponderEliminar