El formato PDF es uno de los que menos me gustan, sin embargo los utilizo bastante y no tengo ninguna duda que es uno de los más populares y que muchas personas eligen a la hora de descargar contenidos de internet.
Hace unos días tuve la necesidad de convertir un documento HTML a PDF utilizando para ello PHP. Las opciones muchas, sin embargo las que dieron mejores resultados muy pocas.
De todas las bibliotecas gratuitas que pude probar con la que mejores resultados obtuve fue con Dompdf. Una biblioteca PHP que se puede descargar y utilizar de forma totalmente gratuita y sin ningún tipo de limitaciones.
Los requerimientos:
- PHP 5, aunque se recomienda utilizar la versión 5.3 o superior.
- Tener habilitada la extensión MBString. Actualmente prácticamente todos los alojamientos la tienen.
- La extensión “DOM” (suele estar instalada, se utiliza principalmente para la gestión de documentos XML)
- Algunas tipografías. Dependiendo de esto vamos a obtener un mejor resultado.
Instalación:
Podemos descargar la extensión directamente desde el apartado de Github del proyecto e incluirla mediante el uso de include(); o bien utilizando composer:
Descarga:
git clone https://github.com/dompdf/dompdf.git git submodule init git submodule update
Instalación con Composer.
{ "require" : { "dompdf/dompdf" : "dev-master" } }
Convertir HTML a PDF con dompdf:
<?php require_once("dompdf_config.inc.php"); $dompdf = new DOMPDF(); $html = '<html><body>'. '<h1>Generar un PDF con PHP</h1>'. '<p>Desde un documentoHTML.</p>'. '</body></html>'; $dompdf->load_html($html); $dompdf->render(); $dompdf->stream("resultado.pdf"); ?>
Con estas pocas lineas de código al ejecutarse el script el navegador va a descargar un archivo en formato PDF con el contenido indicado.
En el archivo dompdf_config.inc.php vamos a encontrar la información y las opciones para personalizar y adecuar según corresponda la forma en que la biblioteca genera el archivo PDF.
Algunas opciones importantes:
- DOMPDF_TEMP_DIR. Directorio temporal donde se genera el PDF.
- DOMPDF_FONT_DIR. Directorio donde se almacenan los archivos de las tipografías.
- DOMPDF_DEFAULT_PAPER_SIZE. Tamaño del papel, por defecto es tipo Letter.
- DOMPDF_DEFAULT_FONT. Tipografía por defecto.
- DOMPDF_DPI. Calidad del PDF.
Guardar el archivo PDF en una ubicación
Es muy normal que nuestro desea sea el de guardar el archivo PDF en alguna ubicación dentro de nuestro servidor. Inclusive se podría considerar una buena practica ya que guardando el PDF generado evitamos al servidor el trabajo de generar el archivo por cada solicitud.
Para lograr esto simplemente ejecutamos:
$dompdf->render(); $output = $dompdf->output(); file_put_contents("/pdfs/salida.pdf", $output);
Recuerden que la carpeta pdfs tiene que tener permisos de escritura.
Paginación
Cuando el archivo PDF generado cuenta con más de una pagina es una buena idea paginar los resultados, para ello dompdf tiene la opción de escribir un pie de pagina de forma casi automática.
Para ello simplemente necesitamos:
$font = Font_Metrics::get_font("helvetica", "bold"); $pdf->page_text(72, 18, "Header: {PAGE_NUM} of {PAGE_COUNT}", $font, 6, array(0,0,0));
Esas son las principales funciones de DomPDF, sin embargo esta biblioteca es muy rica en cuanto a opciones para personalizar el resultado.
Creo que con este pequeño tutorial no tendrán problemas para generar un PDF utilizando como base un documento HTML, no obstante cualquier inconveniente no duden en dejar un comentario con su consulta.
Convertir facilmente HTML a PDF con PHP | the bLack thr3ad
11 años ago
[…] kabytes un colega desarrollador Pablo, posteo una gran herramienta para poder convertir HTML a PDF de una […]
Francisco
11 años ago
Buen recurso. Gracias por compartirlo, siempre viene bien a la mano tener algo así, por si acaso.
Adriana
10 años ago
Estoy intentando generar PDFs que son muy grandes por lo que DOMPDF por lo general no puede hacerlo por el tamaño del buffer. Modifiqué el tamaño de memoria a 1024 (que ya es bastante) con la instrucción:
ini_set(«memory_limit»,»1024M»);
Y aún así hay algunos reportes que no logro generar.
Leí por ahí algo de que se puede generar el PDF por partes, agregando cada vez pedazos al final en un archivo temporal antes de crear el PDF definitivo. ¿Es eso posible? Si ese es el caso, ¿cómo se hace?
Agradecería mucho tu ayuda porque llevo ya bastante tiempo intentando solucionar este problema y lo necesito con urgencia.
Joaquin
10 años ago
Hola, como instalo esta biblioteca en xampp?
Marta
10 años ago
¿Hay posibilidad de guardar el archivo en el servidor pero que no se abra en el navegador?
Javier
10 años ago
a mi me funciono asi
saludos…
require_once(«dompdf_config.inc.php»);
$dompdf = new DOMPDF();
$html = ».
‘Generar un PDF con PHP’.
‘Desde un documentoHTML.’.
»;
$dompdf->load_html($html);
$output = $dompdf->output();
file_put_contents(«salida.pdf», $output);
Alfredo Morales
10 años ago
Cuando trabajo con una pagina algo compleja como una factura, el servidor aborta la ejecución con un error 500, sin embargo con breves textos funciona de maravilla
Javier
10 años ago
Hey amigo mil gracias me funciono a la perfeccion tenia un par de dias intentandolo y en 10 min de tu tutorial salio perfecto en serio mil gracias saludos desde Chihuahua Mexico
Gustavo Portilla
10 años ago
Buenas tardes,
A mi me funciona perfectamente. El problema es que tengo un script que genera de forma masiva PDF usando esta libreria, llega un punto en el que el script agota toda la memoria RAM asignada. Estoy haciendo debug y logro identificar que al ejecutar la siguiente linea:
$dompdf->render();
El consumo de memoria RAM se diapara. Mi pregunta es como puedo liberar la memoria utilizada una ves se genera un PDF.
Ya que lo que logro identificar es que se va acumulando la memoria por cada PDF generado.
Quedo atento a sus comentarios.
Muchas Gracias.
miguel
8 años ago
buenas tardas.
comó puedo convertir un pdf ya que este tienes script dentro del body
<?php
include("conexion.php");
$meses = array('','Ene','Feb','Mar','Abr','May','Jun','Jul','Ago','Sept','Oct','Nov','Dic');
for($x=1;$xquery($query);
while($row=$resultado->fetch_assoc()){
$y=date(«Y», strtotime($row[‘fecha’]));
$mes=(int)date(«m», strtotime($row[‘fecha’]));
$anno=2016;
if($y==$anno){
$dinero[$mes]=$dinero[$mes]+$row[‘cantidad’];
}
}
?>
google.load(«visualization», «1», {packages:[«corechart»]});
google.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
[‘Mes’, ‘Valores’],
<?php
for($x=1;$x
[», ],
]);
var options = {
title: ‘Company Performance’,
hAxis: {title: ‘Grafica Reporte de Ingresos Anual’, titleTextStyle: {color: ‘red’}}
};
var chart = new google.visualization.ColumnChart(document.getElementById(‘chart_div’));
chart.draw(data, options);
}
Grafica SoftUnicorn