Por Luis Martínez Ulloa.
Características
Genera documentos pdf en línea usando php, sin extensiones especiales, como descendiente de la clase FPDF[¹].
Modela el documento como celdas de filas (de igual altura) y columnas (de distinto ancho)
Da formato a las celdas con atributos en arreglos asociativos
Imprime automáticamente en el lado del usuario con o sin su intervención
Funciona con Firebug[²]
Esta clase surgió por la necesidad de imprimir en el lado del usuario, sin las limitaciones que tiene el browser. Específicamente, el formato del texto, fondo, y la orientación del papel. Por lo general, no tenemos elección a menos que pudiéramos persuadir al usuario que realice la configuración deseada. A partir de aquí, se hizo notorio usar pdf como formato de salida intermedio. Opté por usar FPDF como base, las pruebas fueron esperanzadoras, gracias al método Cell.
De tablas html a xzypdf[³]
A diferencia del html, el pdf es menos estructurado, pues se necesita “ir pintando” las partes de nuestro documento por coordenadas. Esta estructura se va implementando en xzypdf con respecto a los datos tabulares.
Para pasar del html, tablas, css, necesitaba algo que se comporte como las celdas de una tabla. Se utiliza una matriz de anchos de columna para aproximarse al comportamiento de una tabla formateada en columnas de distinto ancho. Las filas son de igual altura. Las celdas, bajo ciertas restricciones, pueden imprimirse como multilínea automáticamente.
Los atributos permiten la modificación de la apariencia de las celdas en forma más cómoda, cuando se les pasa como arreglos asociativos. Una ventaja adicional de esto es que estos arreglos pueden serializarse y de esta forma almacenarse como cadenas en bases de datos. Por ello, parte de las mejoras futuras serán el paso de métodos nativos a atributos, incluyendo la autoimpresión[⁴].
Inicialmente, al crear una instancia de xzypdf, los atributos son “precargados” con los valores por defecto.
Métodos principales
Sintaxis: _cell($text, $attrs = null)
Su nombre se distingue del método cell original por tener una función distinta.
Imprime el texto, asignándole los atributos en $attrs. Los atributos quedan fijados en el nuevo valor. Ejemplo:
$style1 =
array('col'=>5,'row'=>3,'cols'=>2,'rows'=>1);
$xzypdfinstance->_cell('Hello',$style1);
*A diferencia del método cell, _cell emite texto multilínea dependiendo de los atributos proporcionados; esto es, integra fpdf::cell y fpdf::multiCell en una sola función.
Sintaxis: setvar($attrs)
Fija los atributos según los nuevos valores. Ejemplo:
$pdf->setvars(array('widths'=>$anchoscol,'background'=>$gris));
$pdf->setvars($estilos1['iniciales']);
AutoPrint($dialog=false)
Imprime el documento vía javascript, sin el diálogo de impresión si el parámetro es false.
Por defecto la impresión se dirige a la impresora predeterminada del sistema cliente.
Los atributos y sus valores predeterminados en una instancia de xzypdf son:
'align' => 'L' LCRJ
(Left, Center, Right, Justify)
'border' => 0,
(0,1,
LRTB – Left,Right, Top, Bottom)
'fill' => false,
'attr' => '',
'height' => 6,
(en las
unidades del documento)
'row' => 0,
'col'
=> 0,
'ln' => 0,
(0,1,2 - no se utiliza, ver
documentación del método
fpdf::cell)
'family' => 'Arial',
(fuente)
'style' => '',
'size' => 9,
(en unidades del
documento)
'top' => 0,
'left' => 0,
'rows' => 1,
'cols' => 1,
'multicell' => false,
'clip' => false,
'color'=>0,
(valor de brillo, puede ser un arreglo de valores de
R,G,B)
'background'=>255,
(valor de brillo, puede ser
un arreglo de valores de R,G,B)
'draw'=>0
(valor de
brillo, puede ser un arreglo de valores de R,G,B)
'widths'
(sin definir al inicio)
La clase debe inicializarse como FPDF, indicando orientación, unidad de medida y tamaño de papel, seguido de otros métodos ancestros como agregar páginas según corresponda.
Luego se cargan los atributos iniciales, siendo los principales:
widths: es un arreglo de números, son los anchos de las columnas de la tabulación (en unidades del documento).
top, left: posición de inicio superior izquierda.
height: La altura de la celda es uniforme para todas las celdas.
Al escribir texto con _cell, tenga presente que las filas y columnas comienzan en cero. El atributo cols define cuántas columnas abarca la celda (de izquierda a derecha) y rows define cuántas filas abarca (de arriba hacia abajo).
Si se va a autoimprimir el documento, se debe condicionar la llamada al método AutoPrint; tener en claro que el parámetro (true o false) determina si se mostrará el diálogo de imprimir o no, estar atento.
Al finalizar, llamar al método Output pasando el nombre preferido del reader y el destino (que para la Web será principalmente “I” (ver doc. De Output).
<?php
$autoprint
= false;
$gris = 216; //negro = 0, blanco = 255 (colores rgb o de
pantalla)
$orientacion = 'L';
//(Landscape, Portrait)
$unid =
'mm';
$formato = 'A4';
$autopage = false;
$breaklimit =
10;
$linewidth = 0.2;
(en unid. del documento, en este caso
mm)
$title = 'doc 1';
$filename = 'lista.pdf';
$outputstyle
= 'I';
$anchoscol = array(40,80,30,40,30,30,30);
$estilos1
= array(
'iniciales'=>array('top'=>8,'left'=>8,'border'=>1,'height'=>4.37,'size'=>'8'),
'encabezado'=>array('border'=>1,'style'=>'B','size'=>'8'),
'centrado'=>array('align'=>'C'),
'filas'=>array('border'=>'LR','style'=>'','clip'=>true),
'ultima'=>array('border'=>'LRB','style'=>'','clip'=>true)
);
//----------------------------------------------------------------------------
$pdf
= new xzypdf($orientacion,$unid,$formato); //apaisado, milimetros,
papel
A4
$pdf->SetAutoPageBreak($autopage,$breaklimit);
$pdf->AddPage();
$pdf->setvars(array('widths'=>$anchoscol,'background'=>$gris));
$pdf->setvars($estilos1['iniciales']);
$pdf->SetLineWidth($linewidth);
//integrar pronto a xzypdf
//////////////////////
//ponga
su código aquí
//////////////////////
$pdf->_cell('
',array('row'=>13,'col'=>4,'cols'=>4,'rows'=>2));
$pdf->setvars('cols'=>1,'rows'=>1);
$pdf->_cell('3-May-2011',array('row'=>41,'col'=>4));
$pdf->_cell('06:00
p.m.',array('col'=>5));
$pdf->_cell('3-May-2011',array('row'=>42,'col'=>4));
$pdf->_cell('06:00
p.m.',array('col'=>5));
$pdf->_cell('3-May-2011',array('row'=>43,'col'=>4));
$pdf->_cell('06:00
p.m.',array('col'=>5));
if ($autoprint) {
$pdf->AutoPrint(true);
}
$pdf->setTitle($title);
$pdf->AliasNbPages();
$pdf->Output($filename,$outputstyle);
?>
Intregrar el método ancestro SetlineWidth como atributo
Integrar la inicialización del ancestro y la autoimpresión como atributos iniciales
Imprimir filas completas
avance de fila automático
filas de alturas diferentes
Imprimir tablas
4. FPDF - JavaScript support y autoimpresión
Por Luis Martínez Ulloa (lmartinez at ecol0gic-peru d0t c0m) 1210050611