I've used this extension to the FPDF class. It introduces the MultiCell method (for my convenience wrapped in the OutputLines method). In this method you can specify the maximum number of lines. Any part of the string that won't fit, will be returned from the function. In that case you can create a new function and call MultiCell again, until it returns ''
.
<?
require 'fpdf.php';
// Class voor implementate van handige aanvullende features.
class EPDF 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
$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("",'',$txt);
$nb=strlen($s);
if($nb>0 && $s[$nb-1]=="
")
$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;
$shy=-1;
$shy1=-1;
$brk=-1;
$lshy=0;
$cx = '';
$i=0;
$j=0;
$l=0;
$ns=0;
$nl=1;
while($i<$nb)
{
//Get next character
$c=$s[$i];
if($c=="
")
{
//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;
$shy=-1;
$shy1=-1;
$brk=-1;
$cx='';
$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++;
}
// Soft break (­)
if ($c==$GLOBALS["hyphen"])
{
// Afbreektekentje. Onthouden van laatste en voorlaatste positie.
$shy1=$shy;
$shy=$i;
$lshy1=$lshy;
$lshy = $l;
$l-=$cw[$c];
}
if ($c=='-')
{
$brk=$i;
$ls = $l + $cw[$c];
$ns++;
$cy = '-';
}
$l+=$cw[$c];
if($l>$wmax)
{
// Woord past niet meer. Kijken of het af te breken is op een hard afbreekstreepje
if ($brk>$shy)
{
if ($brk>$sep)
{
$sep=$brk;
$cx='-';
}
}
elseif ($shy > $sep) // Of op een soft afbreekstreepje
{
if ($lshy + $cw['-'] > $wmax)
{
if ($shy1 > $sep)
{
$sep = $shy1;
$ls = $lshy1;
$cx = '-';
}
}
else
{
$sep = $shy;
$ls = $lshy;
$cx = '-';
}
}
//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).$cx,$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).$cx,$b,2,$align,$fill);
$i=$sep+1;
}
$sep=-1;
$shy=-1;
$shy1=-1;
$cx = '';
$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 '';
}
function OutputLines($w, $h, $text, $maxline = 0)
{
return $this->MultiCell($w, $h, $text, 0, 'L', false, $maxline);
}
}