Generación de Archivos PDF con PHP 8 utilizando HTML2PDF
En el presente ejemplo de script, he desarrollado una factura en formato HTML con el propósito de generar un archivo PDF mediante el uso de la librería html2pdf. Esta herramienta ha sido parte integral de mis proyectos web desde el año 2014. Sin embargo, he realizado una actualización significativa en el código de la librería html2pdf debido a ciertas limitaciones encontradas en su versión oficial al momento de generar archivos PDF, especialmente en las versiones de PHP que van desde la 7.4 hasta la 8.0.
Esta actualización se ha llevado a cabo con el objetivo de asegurar plena funcionalidad y compatibilidad con las versiones más recientes de PHP. La necesidad de este ajuste se fundamenta en la resolución de inconvenientes identificados en la generación de archivos PDF, aspecto crucial para la efectividad y correcto desempeño de diversos proyectos web gratuitos que he compartido en este blog que utilizan esta funcionalidad.
La adaptación del código de la librería html2pdf representa un esfuerzo destinado a mantener la viabilidad y eficacia de esta herramienta esencial en el contexto actual de desarrollo web, permitiendo así su empleo sin contratiempos en entornos que utilicen versiones actualizadas de PHP.
Requisitos:
- Conocimientos básicos de PHP y HTML.
- Acceso a un servidor web o entorno local para probar el código
A continuación te presento los pasos a realizar para generar el script descrito al principio.
Crear archivo index.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
<?php /*------------------------- Autor: Obed Alvarado Web: obedalvarado.pw Mail: info@obedalvarado.pw ---------------------------*/ session_start(); // get the HTML ob_start(); $sale_number=1; $customer_id=1; $total_sales=250; $descuento=0; $customer_name="Obed Alvarado"; $customer_address="San Miguel"; $customer_city="Moncagua"; $customer_state="El Salvador"; $customer_postal_code="3301"; $customer_work_phone="+503 7070 7070"; $customer_id=1; $sale_date= "10/10/2024"; $customer_email="info@me.com"; /*Datos de la empresa*/ $moneda="$"; $bussines_name="Sistemas Web"; $address="El Salvador"; $city="San Salvador"; $state="San Salvador"; $postal_code="3301"; $phone="+503 7070 7070"; $email="info@me.com"; $logo_url="https://obedalvarado.pw/img/logo.png"; /*Fin datos empresa*/ $tax=13; $tax_txt="IVA"; /*Template*/ $file_template="factura.php"; /*Template*/ require_once(dirname(__FILE__).'/pdf/html2pdf.class.php'); include(dirname('__FILE__').'/pdf/documentos/html/'.$file_template); $content = ob_get_clean(); try { // init HTML2PDF $html2pdf = new HTML2PDF('P', 'LETTER', 'es', true, 'UTF-8', array(0, 0, 0, 0)); // display the full page $html2pdf->pdf->SetDisplayMode('fullpage'); // convert $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); // send the PDF $html2pdf->Output('factura.pdf'); } catch(HTML2PDF_exception $e) { echo $e; exit; } |
Crear plantilla html de factura en la ruta pdf/documentos/html/factura.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
<style type="text/css"> <!-- div.zone { border: solid 0.5mm red; border-radius: 2mm; padding: 1mm; background-color: #FFF; color: #440000; } div.zone_over { width: 30mm; height: 20mm; } .bordeado { border: solid 0.5mm #eee; border-radius: 1mm; padding: 0mm; font-size:12px; } .table { border-spacing: 0; border-collapse: collapse; } .table-bordered td, .table-bordered th { padding: 3px; text-align: left; vertical-align: top; } .table-bordered { border: 0px solid #eee; border-collapse: separate; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .left{ border-left: 1px solid #eee; } .top{ border-top: 1px solid #eee; } .bottom{ border-bottom: 1px solid #eee; } table.page_footer {width: 100%; border: none; background-color: white; padding: 2mm;border-collapse:collapse; border: none;} .page-header { margin: 10px 0 20px 0; font-size: 16px; } --> </style> <page backtop="15mm" backbottom="15mm" backleft="15mm" backright="15mm" style="font-size: 13px; font-family: helvetica" backimg=""> <div> <img src="<?php echo $logo_url;?>" style="width: 175px;"> </div> <table style="width:100%" class='page-header' cellspacing=0> <tr style="vertical-align: top"> <td style="width:70%;border-bottom: 3px solid #2ecc71;padding:4px"> <?php echo $bussines_name;?> </td> <td style="width:30%;text-align:right;border-bottom: 3px solid #2ecc71;"> <small>Fecha: <?php echo $sale_date;?></small> </td> </tr> </table> <br> <table style="width:100%"> <tr style="vertical-align: top"> <td style="width:40%;"> Proveedor<br> <address> <strong><?php echo $bussines_name;?></strong><br> <?php echo $address.", ". $city;?><br> <?php echo $state.", ". $postal_code;?><br> Teléfono: <?php echo $phone;?><br> Email: <?php echo $email;?> </address> </td> <td style="width:40%;"> Cliente<br> <address> <strong><?php echo $customer_name;?></strong><br> <?php echo $customer_address." ". $customer_city;?><br> <?php echo $customer_state." ". $customer_postal_code;?><br> Teléfono: <?php echo $customer_work_phone;?><br> Email: <?php echo $customer_email;?> </address> </td> <td style="width:20%;text-align:right;font-size:16px;"> <b>Factura # <?php echo $sale_number;?></b><br> </td> </tr> </table> <br> <table class="table-bordered" style="width:100%;" cellspacing=0> <tr> <th class='top bottom' style="width: 15%;text-align:center"><small>CODIGO</small></th> <th class='top bottom' style="width: 10%;text-align:center"><small>CANT.</small></th> <th class='top bottom' style="width: 50%"><small>DESCRIPCION</small></th> <th class='top bottom' style="width: 12%;text-align:right"><small>PRECIO UNIT.</small></th> <th class='top bottom' style="width: 12%;text-align:right"><small>TOTAL</small></th> </tr> <?php $sumador_total=250; $cantidad=0; $codigo=""; $producto=""; for ($i = 1; $i <= 4; $i++) { $cantidad+=$i; $codigo="COD-".$i; $producto="Producto ".$i; $precio_unitario=10+$cantidad; $total=$precio_unitario*$cantidad; $sumador_total+=$total; ?> <tr> <td class='bottom' style='width: 15%;text-align:center'><?=$codigo;?></td> <td class='bottom' style='width: 10%;text-align:center'><?=$cantidad;?></td> <td class='bottom' style='width: 50%;text-align:left'><?=$producto;?></td> <td class='bottom' style='width: 12%;text-align:right'><?php echo number_format($precio_unitario,2);?></td> <td class='bottom' style='width: 12%;text-align:right;'><?php echo number_format($total,2);?></td> </tr> <?php } $total_parcial=number_format($sumador_total,2,'.',''); $total_descuento=($total_parcial * $descuento) / 100; $total_neto=$total_parcial-$total_descuento; $total_neto=number_format($total_neto,2,'.',''); $total_iva=($total_neto*$tax) / 100; $total_iva=number_format($total_iva,2,'.',''); $total_compra=$total_neto+$total_iva; $total_compra=number_format($total_compra,2,'.',''); ?> <tr><td> </td></tr> <tr> <td colspan=4 style='text-align:right'><strong>Subtotal <?php echo $moneda;?></strong></td> <td style='text-align:right'><?php echo number_format($total_neto,2);?></td> </tr> <tr> <td colspan=4 style='text-align:right'><strong><?php echo $tax_txt;?> <small><?php echo $tax;?>%</small> <?php echo $moneda;?></strong></td> <td style='text-align:right'><?php echo number_format($total_iva,2);?></td> </tr> <tr> <td colspan=4 style='text-align:right;border-top:3px solid #2ecc71;padding:4px;padding-top:4px;font-size:16px'><strong>Total <?php echo $moneda;?></strong></td> <td style='text-align:right;border-top:3px solid #2ecc71;padding:4px;padding-top:4px;font-size:16px'><?php echo number_format($total_compra,2);?></td> </tr> </table> </page> |
Por último, descarga el conjunto de clases indispensables para la creación del archivo PDF. Este paquete, ubicado en el directorio denominado “pdf”, está organizado con una estructura de archivos y carpetas que sigue el siguiente esquema:
Decidí crear este post como un apoyo a todas aquellas personas que han descargado alguno de mis script que requieran la generación de algún documento PDF, y nos les funcione correctamente en su servidor, esto es debido a que la versión de la librería html2pdf ya no es compatible con dichos script.
Actualizando la librería html2pdf:
Si haz descargado cualquiera de mis script como por ejemplo: “Sistema web para crear presupuestos de trabajo desarrollado con PHP, MySQL y Bootstrap“; y la hora de generar el archivo pdf te lanza un error similar al siguiente:
1 |
Fatal error: Array and string offset access syntax with curly braces is no longer supported in C:\xampp\htdocs\proyectos\inventory_diego\inventory_v6_2\pdf\_tcpdf_5.0.002\tcpdf.php on line 2005 |
Entonces solo actualiza los archivos y carpetas contenidos en este paquete de descarga.
A continuación enumero los archivos/directorios que debes reemplazar de la carpeta “pdf”
- html2pdf.class.php (archivo)
- _class (carpeta)
- _tcpdf_5.0.002 (carpeta)
Conclusiones
La actualización de la librería html2pdf es fundamental para garantizar su compatibilidad con PHP 8 y versiones posteriores. Al seguir estos pasos, podrás resolver los errores relacionados con la generación de archivos PDF en tus scripts PHP.
¡Y eso es todo! Con estos pasos, podrás actualizar la librería html2pdf y generar archivos PDF sin problemas en PHP 8.
Espero que este tutorial te sea de mucha ayuda. Si tienes alguna pregunta o necesitas más detalles, no dudes en dejar tus comentarios.