Uso TCPDF Esempio 20
Calcolo altezze multicella può essere un incubo se le cellule/colonne terminano su pagine diverse.
L'utilizzo di transazioni o di oggetti PDF aggiuntivi può rallentare le cose.
L'utilizzo di funzioni come getNumLines() e getStringHeight() per calcolare l'altezza "stimata" (vedi documenti) prima che le celle vengano stampate non sempre funziona correttamente. Soprattutto se il testo termina poco prima o subito dopo il bordo destro della cella, risultando in righe stampate una sopra l'altra.
I preferiscono la tecnica utilizzata in Example 20 dove si utilizza il valore massimo Y di diverse pagine per calcolare la posizione della nuova riga.
L'esempio stampa solo due colonne, ma ho cambiato la sua funzione principale per poter stampare una matrice di colonne. Ovviamente si potrebbe aggiungere altri dati alla matrice, come il carattere di ogni colonna, bordi, ecc
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);
}
fonte
2015-10-22 10:03:53
Entrambi getNumLines() e getStringHeight() solo dare un 'altezza stimata' (vedi documentazione). Queste funzioni non funzionano sempre correttamente se il testo termina poco prima o subito dopo il bordo destro della cella, con il risultato che le righe vengono stampate l'una sull'altra. Piuttosto usa la tecnica nell'esempio 20. –