Skripty : Tabulka s MultiCells

Popis

Cílem tohoto skriptu je ukázat, jak vytvořit tabulku z MultiCells.
Jak s MultiCells přejít na další řádek po výstupu, základní myšlenka spočívá v ukládání aktuální pozice, tisk MultiCell a vynulování pozice. Neni problém, nicméně v případě, že tabulka je příliš dlouhá, následuje odstránkování. Před výstupem je nutné vědět, zda to bude mít za následek přerušení nebo ne. Pokud by to tak bylo, je třeba stránku manuálně přerušit dříve. (To provedete tak, že musíte znát výšku řádku dopředu, je to maximálně na posvátná návrší MultiCells je tvořeno.)
Chcete-li vědět výšku MultiCell, použijte metodu NbLines(): metoda vrací počet řádků, které bude MultiCell zabírat.


Zdrojový kód

<?php
require('fpdf.php');

class PDF_MC_Table extends FPDF

{
var $widths;
var $aligns;

function SetWidths($w)
{
    // Nastaví šířky sloupce pole
    $this->widths=$w;
}

function SetAligns($a)
{
    // Nastaví zarovnání pro sloupce pole
    $this->aligns=$a;
}

function Row($data)
{
    // Vypočtěte výšku řádku
    $nb=0;
    for($i=0;$i<count($data);$i++)
        $nb=max($nb,$this->NbLines($this->widths[$i],$data[$i]));
    $h=5*$nb;
    //Issue a page break first if needed
    $this->CheckPageBreak($h);
    // Vykreslí řadek buněk
    for($i=0;$i<count($data);$i++)
    {
        $w=$this->widths[$i];
        $a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';
        // Uloží aktuální pozici
        $x=$this->GetX();
        $y=$this->GetY();
        // Vykreslí ohraničení
        $this->Rect($x,$y,$w,$h);
        // Tisk textu
        $this->MultiCell($w,5,$data[$i],0,$a);
        // Vloží pozici na pravé straně bunky 
        $this->SetXY($x+$w,$y);
    }
    // Jdi na další řádek
    $this->Ln($h);
}

function CheckPageBreak($h)
{
    // Pokud by výška h způsobit přetečení stránky, přidejte okamžitě novou stránku 
    if($this->GetY()+$h>$this->PageBreakTrigger)
        $this->AddPage($this->CurOrientation);
}

function NbLines($w,$txt)
{
    //Computes the number of lines a MultiCell of width w will take
    $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 and $s[$nb-1]=="
")
        $nb--;
    $sep=-1;
    $i=0;
    $j=0;
    $l=0;
    $nl=1;
    while($i<$nb)
    {
        $c=$s[$i];
        if($c=="
")
        {
            $i++;
            $sep=-1;
            $j=$i;
            $l=0;
            $nl++;
            continue;
        }
        if($c==' ')
            $sep=$i;
        $l+=$cw[$c];
        if($l>$wmax)
        {
            if($sep==-1)
            {
                if($i==$j)
                    $i++;
            }
            else
                $i=$sep+1;
            $sep=-1;
            $j=$i;
            $l=0;
            $nl++;
        }
        else
            $i++;
    }
    return $nl;
}
}

?>


Příklad

Zde je příklad více stránkové tabulky s náhodným obsahem:
<?php
require('mc_table.php');

function GenerateWord()
{
    // Získání náhodného slova 
    $nb=rand(3,10);
    $w='';
    for($i=1;$i<=$nb;$i++)
        $w.=chr(rand(ord('a'),ord('z')));
    return $w;
}

function GenerateSentence()
{
    // Získání náhodné věty 
    $nb=rand(1,10);
    $s='';
    for($i=1;$i<=$nb;$i++)
        $s.=GenerateWord().' ';
    return substr($s,0,-1);
}


$pdf=new PDF_MC_Table();
$pdf->AddPage();
$pdf->SetFont('Arial','',14);

// Tabulka s 20 řádky a 4 sloupci
$pdf->SetWidths(array(30,50,30,40));
srand(microtime()*1000000);
for($i=0;$i<20;$i++)
    $pdf->Row(array(GenerateSentence(),GenerateSentence(),GenerateSentence(),GenerateSentence()));

$pdf->Output();
?>


Ukázka

fpdf-tabulka-s-multisells.pdf

Download

fpdf-tabulka-s-multisells.zip

Informace

Author: Olivier
License: FPDF