Tutorial 4 - Mehrere Spalten

Verwendung mehrerer Spalten in einem Dokument

Dieses Beispiel ist eine Variante der vorherigen Anleitung und zeigt wie Text über mehrere Spalte verteilt werden kann.

<?php

define('FPDF_FONTPATH','font/');
require('fpdf.php');

class PDF extends FPDF
{
  // Current column
  var $col=0;
  // Ordinate of column start
  var $y0;

  function Header()
  {
    //Page header
    global $title;

    $this->SetFont('Arial','B',15);
    $w=$this->GetStringWidth($title)+6;
    $this->SetX((210-$w)/2);
    $this->SetDrawColor(0,80,180);
    $this->SetFillColor(230,230,0);
    $this->SetTextColor(220,50,50);
    $this->SetLineWidth(1);
    $this->Cell($w,9,$title,1,1,'C',1);
    $this->Ln(10);
    // Save ordinate
    $this->y0=$this->GetY();
  }

  function Footer()
  {
    // Page footer
    $this->SetY(-15);
    $this->SetFont('Arial','I',8);
    $this->SetTextColor(128);
    $this->Cell(0,10,'Seite '.$this->PageNo(),0,0,'C');
  }

  function SetCol($col)
  {
    // Set position at a given column
    $this->col=$col;
    $x=10+$col*65;
    $this->SetLeftMargin($x);
    $this->SetX($x);
  }

  function AcceptPageBreak()
  {
    // Method accepting or not automatic page break
    if($this->col<2)
    {
     // Go to next column
     $this->SetCol($this->col+1);
     // Set ordinate to top
     $this->SetY($this->y0);
     // Keep on page
     return false;
    }
    else
    {
     // Go back to first column
     $this->SetCol(0);
     // Page break
     return true;
    }
  }

  function ChapterTitle($num,$label)
  {
    // Title
    $this->SetFont('Arial','',12);
    $this->SetFillColor(200,220,255);
    $this->Cell(0,6,"Kapitel $num : $label",0,1,'L',1);
    $this->Ln(4);
    // Save ordinate
    $this->y0=$this->GetY();
  }

  function ChapterBody($fichier)
  {
    // Read text file
    $f=fopen($fichier,'r');
    $txt=fread($f,filesize($fichier));
    fclose($f);
    // Font
    $this->SetFont('Times','',12);
    // Output text in a 6 cm width column
    $this->MultiCell(60,5,$txt);
    $this->Ln();
    // Mention
    $this->SetFont('','I');
    $this->Cell(0,5,'(end of excerpt)');
    // Go back to first column
    $this->SetCol(0);
  }

  function PrintChapter($num,$title,$file)
  {
    // Add chapter
    $this->AddPage();
    $this->ChapterTitle($num,$title);
    $this->ChapterBody($file);
  }
}

$pdf = new PDF();
$title='20000 Meilen unter dem Meer';
$pdf->SetTitle($title);
$pdf->SetAuthor('Jules Verne');
$pdf->PrintChapter(1,'Das erste Kapitel','20k_c1.txt');
$pdf->PrintChapter(2,'Das zweite Kapitel','20k_c2.txt');
$pdf->Output();

?>

Die Besonderheit liegt hierbei bei der Verwendung der Callback Methode AcceptPageBreak(). Es ermöglicht die Erlaubnis und die Verweigerung eines automatischen Seitenumbruchs und die Reaktion darauf. Durch die Ablehnung des automatischen Seitenumbruchs und die Veränderung der Seitenabstände und der aktuellen Position wird das Spaltenlayout erzeugt.

Ansonsten hat sich nicht viel geändert. Zwei neue Eigenschaften wurden für die Speicherung der aktuellen Spaltennummer und die Position des Spaltenbeginns. Der Aufruf von MultiCell() definiert eine Spaltenbreite von 6 cm.