Add-On MultiCell with maxline
Informations
Author:Jean-Marie GervaisLicense: FPDF
Description
Just a small modification of the original MultiCell function which allows specifying a maxline parameter.When reaching this limit, MultiCell stops and returns the part of the string which was cut.
This allows to have multi-columns with variable width, or column break before end of page.
Source
<?php
require('fpdf.php');
class PDF extends FPDF
{
function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false, $maxline=0)
{
// Output text with automatic or explicit line breaks, at most $maxline lines
if(!isset($this->CurrentFont))
$this->Error('No font has been set');
$cw=$this->CurrentFont['cw'];
if($w==0)
$w=$this->w-$this->rMargin-$this->x;
$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
$s=str_replace("\r", '', (string)$txt);
$nb=strlen($s);
if($nb>0 && $s[$nb-1]=="\n")
$nb--;
$b=0;
if($border)
{
if($border==1)
{
$border='LTRB';
$b='LRT';
$b2='LR';
}
else
{
$b2='';
if(is_int(strpos($border, 'L')))
$b2.='L';
if(is_int(strpos($border, 'R')))
$b2.='R';
$b=is_int(strpos($border, 'T')) ? $b2.'T' : $b2;
}
}
$sep=-1;
$i=0;
$j=0;
$l=0;
$ns=0;
$nl=1;
while($i<$nb)
{
// Get next character
$c=$s[$i];
if($c=="\n")
{
// Explicit line break
if($this->ws>0)
{
$this->ws=0;
$this->_out('0 Tw');
}
$this->Cell($w, $h, substr($s, $j, $i-$j), $b, 2, $align, $fill);
$i++;
$sep=-1;
$j=$i;
$l=0;
$ns=0;
$nl++;
if($border && $nl==2)
$b=$b2;
if($maxline && $nl>$maxline)
return substr($s, $i);
continue;
}
if($c==' ')
{
$sep=$i;
$ls=$l;
$ns++;
}
$l+=$cw[$c];
if($l>$wmax)
{
// Automatic line break
if($sep==-1)
{
if($i==$j)
$i++;
if($this->ws>0)
{
$this->ws=0;
$this->_out('0 Tw');
}
$this->Cell($w, $h, substr($s, $j, $i-$j), $b, 2, $align, $fill);
}
else
{
if($align=='J')
{
$this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0;
$this->_out(sprintf('%.3F Tw', $this->ws*$this->k));
}
$this->Cell($w, $h, substr($s, $j, $sep-$j), $b, 2, $align, $fill);
$i=$sep+1;
}
$sep=-1;
$j=$i;
$l=0;
$ns=0;
$nl++;
if($border && $nl==2)
$b=$b2;
if($maxline && $nl>$maxline)
{
if($this->ws>0)
{
$this->ws=0;
$this->_out('0 Tw');
}
return substr($s, $i);
}
}
else
$i++;
}
// Last chunk
if($this->ws>0)
{
$this->ws=0;
$this->_out('0 Tw');
}
if($border && is_int(strpos($border, 'B')))
$b.='B';
$this->Cell($w, $h, substr($s, $j, $i-$j), $b, 2, $align, $fill);
$this->x=$this->lMargin;
return '';
}
}
?>
Example
<?php
require('multicellmax.php');
$pdf=new PDF();
$pdf->AddPage();
$txt='';
for ($i=1; $i<19; $i++)
$txt.='all work and no play makes jack a dull boy ';
$pdf->Rect(20, 20, 100, 100);
$pdf->Rect(80, 20, 40, 40);
$pdf->Rect(20, 80, 40, 40);
$pdf->SetXY(20, 20);
$pdf->SetFont('Arial', '', 10);
$txt=$pdf->MultiCell(60, 5, $txt, 0, 'J', 0, 8);
$txt=$pdf->MultiCell(100, 5, $txt, 0, 'J', 0, 4);
$pdf->SetX(60);
$txt=$pdf->MultiCell(60, 5, $txt, 0, 'J', 0, 8);
$pdf->Output();
?>