MultiCell with maxline

Just a small modification of the original MultiCell function which allows specifying a maxline parameter

Informations

Author: Jean-Marie Gervais
License: 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 $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", '', $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(); ?>
View the result here.

Download

ZIP | TGZ

Quelle

http://www.fpdf.org/en/script/script16.php, zuletzt abgerufen 02.10.2016 14:09