Skripty : MultiCell s maximem řádků

Popis

Stačí malá změna původní funkce MultiCell, která umožňuje stanovit parametr maxline.
Po dosažení tohoto limitu se MultiCell zastaví a vrátí část řetězce, která byla odříznuta.
This allows to have multi-columns with variable width, or column break before end of page.

Zdrojový kód

<?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)
        {
            // Získání dalšího znaku
            $c=$s[$i];
            if($c=="\n")
            {
                // Jednoznačné řádkování
                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)
            {
                // Automatické řádkování
                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 ) 
                    return substr($s,$i);
            }
            else
                $i++;
        }
        // Poslední část
        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 '';
    }
}

?>


Příklad

<?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();
?>


Ukázka

fpdf-multicell-s-maximem-radku.pdf

Download

fpdf-multicell-s-maximem-radku.zip

Informace

Author: Jean-Marie Gervais
License: FPDF