Uso TCPDF Ejemplo 20
Cálculo de alturas MultiCell puede ser una pesadilla si las células/columnas terminan en diferentes páginas.
El uso de transacciones u objetos pdf adicionales puede hacer las cosas muy lentas.
El uso de funciones como getNumLines() y getStringHeight() para calcular la altura 'estimada' (ver documentos) antes de imprimir las celdas no siempre funciona correctamente. Especialmente si el texto termina justo antes o justo después del borde derecho de la celda, lo que hace que las filas se impriman una sobre otra.
I prefieren la técnica utilizada en Example 20 cuando el valor máximo Y de las distintas páginas se utilizan para calcular la posición de la nueva fila.
El ejemplo imprime solo dos columnas, pero cambié su función principal para poder imprimir una matriz de columnas. Obviamente, se podría añadir más datos a la matriz, como la fuente de cada columna, bordes, etc.
public function MultiRow($columnsArray) {
$page_start = $this->getPage();
$y_start = $this->GetY();
$pageArray = array();
$yArray = array();
// traverse through array and print one column at a time.
$columnCount = count($columnsArray);
for($i=0; $i<$columnCount; $i++)
{
if($i+1 < $columnCount)
{
// Current column is not the last column in the row.
// After printing, the pointer will be moved down to
// the right-bottom of the column - from where the
// next multiCell in the following loop will use it
// via $this->GetX().
$ln = 2;
}
else
{
// Current column is the last column in the row.
// After printing, the pointer will be moved to new line.
$ln = 1;
}
$this->MultiCell(30, 0, $columnsArray[$i], 1, 'L', 1, $ln,
$this->GetX() ,$y_start, true, 0);
$pageArray[$i] = $this->getPage();
$yArray[$i] = $this->GetY();
// Go to page where the row started - to print the
// next column (if any).
$this->setPage($page_start);
}
// Test if all columns ended on the same page
$samePage = true;
foreach ($pageArray as $val) {
if($val != $pageArray['0'])
{
$samePage = false;
break;
}
}
// Set the new page and row position by case
if($samePage == true)
{
// All columns ended on the same page.
// Get the longest column.
$newY = max($yArray);
}
else
{
// Some columns ended on different pages.
// Get the array-keys (not the values) of all columns that
// ended on the last page.
$endPageKeys = array_keys($pageArray, max($pageArray));
// Get the Y values of all columns that ended on the last page,
// i.e. get the Y values of all columns with keys in $endPageKeys.
$yValues = array();
foreach($endPageKeys as $key)
{
$yValues[] = $yArray[$key];
}
// Get the largest Y value of all columns that ended on
// the last page.
$newY = max($yValues);
}
// Go to the last page and start at its largets Y value
$this->setPage(max($pageArray));
$this->SetXY($this->GetX(),$newY);
}
Ambos getNumLines() y getStringHeight() sólo dar una 'altura estimada' (ver documentos). Estas funciones no siempre funcionan correctamente si el texto termina justo antes o justo después del borde derecho de la celda, lo que hace que las filas se impriman una sobre otra. Más bien use la técnica en el ejemplo 20. –