Crear PDF con páginas de tamaño dinámico
marzo 24, 2016 Publicado en Software y HardwareLa mayoría de los PDF tienen páginas del mismo tamaño, pero en casos particulares se hace evidente la necesidad de buscar una alternativa dinámica. como por ejemplo la impresión de varias boletas con una impresora para facturas que hace el corte según el tamaño de cada página.
El siguiente código emplea la librería mpdf para generar el documento, una plantilla sobre la cuál se irán generando las distintas boletas, y dos arreglos con los títulos y párrafos para cada versión.
El algoritmo maneja una instancia del generador de documentos PDF que será la encargada del documento final, y otra donde se irá creando cada nueva boleta y que será empleado para conocer el tamaño del documento impreso. Una vez conocida esta información crearemos una nueva página con este tamaño dentro de la instancia que almacena el documento final, de tal manera que en esta nueva página quepa la nueva boleta.
<?php
//Librerías para generador de pdf y parser de plantillas
require('libs/mpdf/mpdf.php');
//PDF en donde imprimiremos las boletas
$pdf = new mPDF('en', array('74mm', '100mm'), 8, '', 5, 5, 4, 4);
//Sistema de Plantilla
$template = "<style>
div.pagina { /*font-family: DejaVuSansMono;*/ }
h1, table.logos td { text-align: center; }
table.logos { width: 100%; }
</style>
<div class='pagina'>
<h3>%titulo%</h3>
%parrafo%
</div>";
//Títulos
$titulos = array(
'Vivamus elementum rutrum mattis',
'Donec consequat aliquet lorem vel',
'Fusce mattis tellus vel nulla'
);
//Párrafos
$parrafos = array(
'Pellentesque tellus diam, sollicitudin a semper ac, semper et augue. Duis orci nulla, ornare a orci ut, consequat tempus lorem. Morbi venenatis nisi et rutrum ultricies. Nulla pulvinar posuere malesuada. Aliquam id odio feugiat, mattis ante ac, viverra magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut libero dui, eleifend at pulvinar sed, volutpat eu augue. Nullam non metus non felis suscipit pulvinar. Praesent at magna ex. Etiam blandit diam id interdum faucibus. Phasellus ac blandit nulla, id scelerisque lacus. Donec hendrerit eros in bibendum lobortis. Nulla tincidunt tellus at erat pulvinar tempus a commodo mauris. Vestibulum blandit arcu justo, non ultrices elit egestas quis. Integer fringilla non risus quis ullamcorper.',
'Donec pulvinar, enim eu interdum egestas, nibh nunc pellentesque enim, quis egestas quam urna id ligula. Curabitur lobortis felis ex, vel viverra est feugiat ut. Fusce sed nisi et turpis consequat eleifend. Curabitur congue rhoncus volutpat. Suspendisse purus leo, euismod at malesuada ac, commodo a ex. Pellentesque consectetur mi facilisis ullamcorper consequat.',
'Aenean in nisi sit amet magna congue dapibus at nec nulla. Nullam sit amet nisi magna. Curabitur egestas tellus lectus, eget malesuada enim imperdiet non. Cras vestibulum nunc ut aliquam dignissim. Nunc consequat sed tellus a elementum. Phasellus pharetra erat et metus consectetur sollicitudin. Praesent aliquet sed neque hendrerit tempor. Suspendisse lobortis id lacus et sollicitudin. Proin et justo ac mauris pellentesque egestas. Maecenas sit amet nisl vitae mauris luctus mollis. '
);
//Crearemos tantas páginas como items hay en el
//arreglo de nombres
foreach( $titulos as $key => $titulo ) {
//PDF con el que calcularemos el tamaño de la página
$pdf_aux = new mPDF('en', array('74mm', '100mm'), 8, '', 5, 5, 4, 4);
//Reemplazar las variables y obtener el HTML para esta página
$data = str_replace(
array('%titulo%', '%parrafo%'),
array($titulos[$key] ,$parrafos[$key]),
$template
);
//Agregar los datos al pdf de referencia
$pdf_aux->WriteHTML($data);
//Calcular el tamaño de la zona impresa como
//Total de páginas impresas completas multiplicado por la zona
//que se puede imprimir en cada página, mas la zona que se uso
//en la última hoja mas el margen inferior
$calculado = ((($pdf_aux->page - 1) * ($pdf_aux->fh - $pdf_aux->lMargin - $pdf_aux->bMargin)) + ($pdf_aux->y)) + $pdf_aux->bMargin;
//Añadir al pdf que vamos a imprimir la nueva página
//usando el tamaño calculado
$pdf->AddPageByArray(
array(
'orientation' => 'P',
'sheet-size' => array('74mm', $calculado.'mm')
)
);
//Teniendo ya la nueva página, agregar
//los datos
$pdf->WriteHTML($data);
}
//Descargar PDF
$pdf->Output();
?>