Convertir HTML a PDF (PHP)

TEORÍA

Hay varias librerías en PHP que «prometen» transformar HTML a PDF pero no funcionan demasiado bien dependiendo de la versión de PHP que usemos o interpretan bastante mal los estilos en cascada (CSS), mpdf es un ejemplo de ello. Lo mejor es utilizar un programa externo que permita su ejecución desde la consola de comandos y lanzarlo desde PHP con la función «exec«.

En este caso uno de los programas más útiles (y además open source con licencia GNU) es wkhtmltopdf. No requiere instalación y se puede incluir en alguna carpeta interna del proyecto/sitio web que vaya a hacer uso de ella (así es más «portable» al tener el conversor siempre en una ruta relativa en la carpeta del proyecto).

La desventaja de este método es que no podremos usar la función «exec» en un servidor alquilado (host) por norma general.

PRÁCTICA

Para utlizar este programa desde PHP hay que generar primero un archivo HTML. Para reutilizar código, el archivo HTML a generar lo recogeremos con un «include» (para que PHP pueda interpretar las etiquetas PHP que contenga) y lo guardamos con «fwrite«:

$outputFileName = "blah";
ob_start();
include "paginaHTML.php";
$htmlFile = fopen($outputFileName.'.html', 'w');
fwrite($htmlFile, ob_get_clean());
fclose($htmlFile);

Y luego ejecutamos el programa con la función «exec» indicándole los paths a los archivos entre comillas escapadas.

$cmd = 	"\"".realpath(__DIR__ . "/src/wkhtmltopdf.exe")."\" ".
  "\"".realpath(__DIR__) . "\\{$outputFileName}.html"."\" ".
  "\"".realpath(__DIR__) . "\\{$outputFileName}.pdf"."\" ";
exec($cmd);

NOTA: Si usamos la función «realpath» con el nombre del archivo PDF a generar, nos devolverá la cadena vacía porque dicho fichero aún no existe, es decir:

//Devuelve un string vacío porque
//el archivo PDF aún no existe
realpath(__DIR__ . "\\{$outputFileName}.pdf");

 

Deja una respuesta