Me lo contaron y lo olvidé, lo leí y lo entendí, lo hice y lo aprendí.





viernes, 22 de marzo de 2013

Crear PDF con PHP [Dompdf]

Dompdf es una librería de PHP que permite tomar una página HTML y renderizarla (convertirla) a un PDF; aunque realmente no se crea un archivo PDF pero para el usuario de la página web se verá un auténtico archivo de éste tipo y podrá imprimirlo, guardarlo y tratarlo en su totalidad como uno.

Su uso es muy sencillo, pondré un sencillo ejemplo de su uso básico:

Tenemos una página HTML con éste código:


<html>
<head>
<title>Archivo pdf</title>
</head>
<body>
<center>
<h1>P&aacute;gina renderizada a PDF</h1>
</center>
</body>
</html>


La página se llama "pagina1.html". (Se ve así: http://unrinconenlaweb.webcindario.com/programas/pdf/pagina1.html)
Ahora, para renderizarla a un PDF es necesario crear una página php con el siguiente código:


<?php
require_once("dompdf/dompdf_config.inc.php"); //Aquí se incluye la librería php del Dompdf
$file = file_get_contents("pagina1.html"); //Se "extrae" la página que se convertirá a PDF

$dompdf = new DOMPDF(); //Se crea un objeto del tipo DOMPDF
    $dompdf->load_html($file); //Se le "carga" la página que convertiremos
    $dompdf->render(); //Se manda a llamar el método para renderizar
        
    header('Content-type: application/pdf'); //Ésta es simplemente la cabecera para que el navegador interprete todo como un PDF
    echo $dompdf->output(); //Y con ésto se manda a imprimir el contenido del pdf
?>


El resultado será éste: http://unrinconenlaweb.webcindario.com/programas/pdf/ejemplo1.php
Como se nota, hay que abrir la página .php en lugar de la .html

Ahora, en más de la mitad de las ocasiones se requerirá que la información a mostrar en el PDF varíe, como puede ser una fecha, el nombre del usuario o cualquier otro dato.
Para eso, hay que poner en la página .html palabras "claves" que después serán reemplazadas por los valores dinámicos a la hora de renderizar.
Es éste ejemplo voy a poner 3 valores numéricos aleatorios en el PDF.
Para empezar, aquí está la página html (Se llama "pagina2.html")

<html>
<head>
<title>Archivo pdf</title>
</head>
<body>
<center>
<h1>P&aacute;gina renderizada a PDF</h1>
</center>
<br />
<br />
<li><b>Dato 1:</b> {#dato1}</li>
<li><b>Dato 2:</b> {#dato2}</li>
<li><b>Dato 3:</b> {#dato3}</li>
</body>
</html>


Se ve así: http://unrinconenlaweb.webcindario.com/programas/pdf/pagina2.html
Como se puede notar, están escritas "{#dato1}" "{#dato2}" y "{#dato3}" que en éste caso servirán de "palabras clave" que reemplazaré por número generados aleatoriamente.
La página php contiene lo siguiente:


<?php
require_once("dompdf/dompdf_config.inc.php"); //Se incluye la librería Dompdf
$file = file_get_contents("pagina2.html"); //Se "extrae" la página a renderizar

$dato1=rand(1,100); //guardo en una variable un número random entre 1 y 100
$dato2=rand(101,200); //guardo en otra variable un número aleatorio entre 101 y 200
$dato3=rand(300,10000); // y guardo en una tercera variable un número aleatorio entre 300 y 10000
$dompdf = new DOMPDF(); //creo un objeto de la clase DOMPDF
                                                              
         /*En la siguiente función reemplazo las "palabras clave" por los valores aleatorios de las variables que creé arriba*/
$html = str_replace( //a la variable $html guardo lo que me arroja la función str_replace
        array(
"{#dato1}","{#dato2}","{#dato3}" //éstas son las palabras claves a reemplazar
        ), 
        array(
$dato1,$dato2,$dato3 //éstos son los datos que sustituirán las palabras claves
        ), 
        $file //y se reemplazará de la página cargada en ésta variable, lo que hice más arriba
    );
    $dompdf->load_html($html); //Se carga la página que convertiremos ya con los reemplazos
    $dompdf->render(); //mandamos a llamar el método para renderizar
        
    header('Content-type: application/pdf'); //ponemos la cabecera para PDF
    echo $dompdf->output(); //se imprime el documento PDF
?>


El resultado será así: http://unrinconenlaweb.webcindario.com/programas/pdf/ejemplo2.php
Cada vez que se recarga la página, se muestran 3 valores diferentes en los campos.

Para descargar los ejemplos y la librería, aquí está el enlace:
https://dl.dropbox.com/u/46960544/pdf.rar

10 comentarios:

  1. ¿Y cómo cambias el margen y el tamaño de la letra?

    ResponderEliminar
    Respuestas
    1. El formato del archivo es el HTML; si quieres trabajar con el estilo hazlo con CSS. Pones la sección style y allí pones los estilos. Considera que estás creando una página HTML que después convertirás a PDF.

      Eliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. Y esto error : dompdf/include/functions.inc.php on line 790

    ResponderEliminar
    Respuestas
    1. Es de la librería DOMPdf; comúnmente es por que lo que quieres renderizar no está correcto (No es texto, hay algún error de php o MySQL, no tiene la sintaxis de HTML correcta)... lo que recomiendo es que revises el resultado de lo que intentas renderizar (haz un echo a la variable que renderizas para que veas qué errores tienes).

      Eliminar
  4. No me genera el archibo en pdf me dice error al abrir el archivo.pdf

    ResponderEliminar
    Respuestas
    1. Eso podría ocurrir por que tu script PHP manda un error (sintaxis, semántica, operación imposible...); para checar si es así, comenta las últimas 2 líneas:

      header('Content-type: application/pdf'); //ponemos la cabecera para PDF
      echo $dompdf->output(); //se imprime el documento PDF

      Eliminar
  5. HAZ INTENTADO ABRIR LA VENTANA DE IMPRESION INMEDIATAMENTE QUE SE ABRA EL PDF??

    ResponderEliminar
    Respuestas
    1. Pues, podrías intentar abrir la ventana en un pop-up y luego imprimir el pop-up con JavaScript.

      Algo como:
      var ventana=window.open("destino.php");
      ventana.print();


      Aunque no estoy 100% seguro que funcione a la primera.

      Eliminar
    2. Ya lo intente, pero no me funciono...

      Eliminar