Seitenumbruch bei Multicell

Alles andere zum Thema FPDF und PDF Format
Anonymous

Seitenumbruch bei Multicell

Beitragvon Anonymous » Do 8. Apr 2004, 15:24

Hallo zusammen,

Ich schreibe über eine while-Schleife die Ergebnisse aus einer MySQL-Datenbank in eine mit fpdf generierte 'Tabelle' .Die einzelnen Spalten der Tabelle sind MultiCells.
Überschreiten die Einträge nicht die erste Seite sieht alles wunderbar aus. Kommen aber mehrere Einträge dazu, und es muss ein PageBreak gemacht werden, befindet sich die erste Spalte auf der ersten pdf-Seite, die zweite Spalte auf der zweiten......etc.
Weiss jemand Hilfe??

Danke & Gruß
thosch

fpdf.de
Erfahrener Benutzer
Beiträge: 185
Registriert: Di 6. Apr 2004, 08:32

Beitragvon fpdf.de » Mi 28. Apr 2004, 12:01

Kannst Du die Schleife bitte hier aufführen?

Anonymous

Beitragvon Anonymous » Mi 28. Apr 2004, 14:12

$standort=$_GET['standort'];

$result=mysql_query("SELECT Standort.S_ID, Standort.S_Name, Mitarbeiter.MA_Name, Mitarbeiter.MA_Vorname, Mitarbeiter.MA_PIN, Mitarbeiter.MA_Zimmer, Rufnummer.Rufnummer, Mitarbeiter.MA_Nr, Endgeraet.E_Bez, MAEG.Zusatzleistung, MAEG.Bemerkung FROM Standort,STMA,Mitarbeiter, Rufnummer,RNMA, Endgeraet, MAEG WHERE Mitarbeiter.Ma_Nr = STMA.Ma_Nr AND Standort.S_Name='$standort' AND Standort.S_ID = STMA.S_Nr AND Mitarbeiter.Ma_Nr=MAEG.Ma_Nr AND MAEG.E_Nr=Endgeraet.E_Nr AND Mitarbeiter.Ma_Nr=RNMA.Ma_Nr AND RNMA.R_ID=Rufnummer.R_ID ORDER BY Ma_Name ASC");
$number_of_mitarbeiter = mysql_numrows($result);


//For each row, add the field to the corresponding column
while($row = mysql_fetch_array($result))
{
$sname = $row["S_Name"];
$nn = $row["MA_Name"];
$vn = $row["MA_Vorname"];
$rn= $row["Rufnummer"];
$eg= $row["E_Bez"];
$pin= $row["MA_PIN"];
$raum= $row["MA_Zimmer"];
$zu= $row["Zusatzleistung"];
$bem= $row["Bemerkung"];

$column_sname = $column_sname.$sname."\n";
$column_nn = $column_nn.$nn."\n";
$column_vn = $column_vn.$vn."\n";
$column_rn = $column_rn.$rn."\n";
$column_eg = $column_eg.$eg."\n";
$column_pin = $column_pin.$pin."\n";
$column_raum = $column_raum.$raum."\n";
$column_zu = $column_zu.$zu."\n";
$column_bem = $column_bem.$bem."\n";

}
mysql_close();

//Create a new PDF file
$pdf=new FPDF();
$pdf->Open();
$pdf->AddPage(L);
$pdf->SetAutoPageBreak(true);

$pdf->SetFont('Arial','BI',14);
$pdf->Text(15,15,"accom");
$pdf->SetFont('Arial','',14);
$pdf->Text(15,20,"Stadt Aachen");
$pdf->Text(15,25,"Telefonie");
$pdf->SetFont('Arial','B',16);
$pdf->Text(140,40,"Mitarbeiterliste");
$pdf->SetFont('Arial','',14);
$pdf->Text(15,55,"Standort: ");
$pdf->Text(38,55,$sname);

//Fields Name position
$Y_Fields_Name_position = 60;
//Table position, under Fields Name
$Y_Table_Position = 66;

//First create each Field Name
//Gray color filling each Field Name box
$pdf->SetFillColor(232,232,232);
//Bold Font for Field Name
$pdf->SetFont('Arial','B',10);
$pdf->SetY($Y_Fields_Name_position);
$pdf->SetX(15);
$pdf->Cell(40,6,'Name',1,0,'L',1);
$pdf->SetX(55);
$pdf->Cell(30,6,'Vorname',1,0,'L',1);
$pdf->SetX(85);
$pdf->Cell(30,6,'Rufnummer',1,0,'L',1);
$pdf->SetX(115);
$pdf->Cell(30,6,'Endgerät',1,0,'L',1);
$pdf->SetX(145);
$pdf->Cell(30,6,'PIN',1,0,'L',1);
$pdf->SetX(175);
$pdf->Cell(40,6,'Raum',1,0,'L',1);
$pdf->SetX(215);
$pdf->Cell(40,6,'Zusatzleistung',1,0,'L',1);
$pdf->SetX(255);
$pdf->Cell(40,6,'Bemerkung',1,0,'L',1);

$pdf->Ln();

//Now show the columns
$pdf->SetFont('Arial','',8);
$pdf->SetY($Y_Table_Position);
$pdf->SetX(15);
$pdf->MultiCell(40,6,$column_nn,1);
$pdf->SetY($Y_Table_Position);
$pdf->SetX(55);
$pdf->MultiCell(30,6,$column_vn,1);
$pdf->SetY($Y_Table_Position);
$pdf->SetX(85);
$pdf->MultiCell(30,6,$column_rn,1);
$pdf->SetY($Y_Table_Position);
$pdf->SetX(115);
$pdf->MultiCell(30,6,$column_eg,1);
$pdf->SetY($Y_Table_Position);
$pdf->SetX(145);
$pdf->MultiCell(30,6,$column_pin,1);
$pdf->SetY($Y_Table_Position);
$pdf->SetX(175);
$pdf->MultiCell(40,6,$column_raum,1);
$pdf->SetY($Y_Table_Position);
$pdf->SetX(215);
$pdf->MultiCell(40,6,$column_zu,1);
$pdf->SetY($Y_Table_Position);
$pdf->SetX(255);
$pdf->MultiCell(40,6,$column_bem,1);

$pdf->Output();
?>

Also das ganze sieht dann so aus, dass zuerst die erste Spalte (MultiCell )vollgeschrieben wird, dann die zweite usw....


Danke & Gruß
thosch

fpdf.de
Erfahrener Benutzer
Beiträge: 185
Registriert: Di 6. Apr 2004, 08:32

Beitragvon fpdf.de » Do 29. Apr 2004, 16:07

Ok, habe das Problem verstanden. Als Workaround für dieses Verhalten kann das Add-On Table with MultiCells genutzt werden (siehe "downloads & add-ons"). Ich habe den Code (ausgenommen der Query) entsprechend angepasst, evtl. müssen noch ein paar Schönheitskorrekturen vorgenommen werden.

Add-On:

Code: Alles auswählen

class PDF_MC_Table extends FPDF
{
   var $widths;
   var $aligns;

   function SetWidths($w)
   {
      //Set the array of column widths
      $this->widths=$w;
   }

   function SetAligns($a)
   {
      //Set the array of column alignments
      $this->aligns=$a;
   }

   function Row($data)
   {
      //Calculate the height of the row
      $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);
      //Draw the cells of the row
      for($i=0;$i<count($data);$i++)
      {
         $w=$this->widths[$i];
         $a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';
         //Save the current position
         $x=$this->GetX();
         $y=$this->GetY();
         //Draw the border
         $this->Rect($x, $y, $w, $h);
         //Print the text
         $this->MultiCell($w, 5, $data[$i], 0, $a);
         //Put the position to the right of the cell
         $this->SetXY($x+$w, $y);
      }
      //Go to the next line
      $this->Ln($h);
   }

   function CheckPageBreak($h)
   {
      //If the height h would cause an overflow, add a new page immediately
      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("r", '', $txt);
      $nb=strlen($s);
      if($nb>0 and $s[$nb-1]=="n")
         $nb--;
      $sep=-1;
      $i=0;
      $j=0;
      $l=0;
      $nl=1;
      while($i<$nb)
      {
         $c=$s[$i];
         if($c=="n")
         {
            $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;
   }
}


Entsprechend modifiziertes Skript:

Code: Alles auswählen

$pdf=new PDF_MC_Table();
$pdf->Open();
$pdf->AddPage(L);
$pdf->SetAutoPageBreak(true);

//Set width fro table columns
$pdf->SetWidths(array(40, 30, 30, 30, 30, 40, 40, 40));

//Create document headline
$pdf->SetFont('Arial','BI',14);
$pdf->Text(15,15,"accom");
$pdf->SetFont('Arial','',14);
$pdf->Text(15,20,"Stadt Aachen");
$pdf->Text(15,25,"Telefonie");
$pdf->SetFont('Arial','B',16);
$pdf->Text(140,40,"Mitarbeiterliste");
$pdf->SetFont('Arial','',14);
$pdf->Text(15,55,"Standort: ");
$pdf->Text(38,55,$_GET['standort']);

//Fields Name position
$Y_Fields_Name_position = 60;
//Table position, under Fields Name
$Y_Table_Position = 66;

//First create each Field Name
//Gray color filling each Field Name box
//Bold Font for Field Name
$pdf->SetFont('Arial','B',10);
$pdf->SetY($Y_Fields_Name_position);
$pdf->SetFillColor(232,232,232);

// Add headline
$pdf->Row(array('Name', 'Vorname', 'Rufnummer', 'Endgerät', 'PIN', 'Raum', 'Zusatzleistung', 'Bemerkung'));

//For each row, add the field to the corresponding column
while($row = mysql_fetch_array($result))
{
   //Take details
   $sname = $row["S_Name"];
   $nn = $row["MA_Name"];
   $vn = $row["MA_Vorname"];
   $rn= $row["Rufnummer"];
   $eg= $row["E_Bez"];
   $pin= $row["MA_PIN"];
   $raum= $row["MA_Zimmer"];
   $zu= $row["Zusatzleistung"];
   $bem= $row["Bemerkung"];

   //Add new row
    $pdf->Row(array($nn, $vn, $rn, $eg, $pin, $raum, $zu, $bem));
}

//Finish document
$pdf->Output();


Bei dieser Variante bleibt die Kopfzeile der Tabelle trotz SetFillColor() weiß statt grau und die Fusszeile entfällt. Ich schau' mal woran es liegt und melde mich zu diesem Verhalten noch.

cu
José

Anonymous

Beitragvon Anonymous » Fr 30. Apr 2004, 13:29

:lol:
WOW! Vielen, vielen Dank. Das sieht ja schon hervorragend aus !!

gruß
thosch


Zurück zu „Sonstiges“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste