In FPDF Tabellen erstellen?!

Hi!

Verusche mit FPDF Tabelle zu erstellen. Leider fehlt mir absolut der Durchblick in dem Tutorial das die auf der Seite anbieten.
Hat das schonmal einer von euch gemacht und kann mir das erklären bzw. ein anderes Tutorial (evtl. sogar auf Deutsch) geben?
Kann man die Tabellen Auch über 2 Seiten erstrecken oder muss ich die selbst unterbrechen? Und wie steht es mit der Position und der Größe von Tabellen? Passt sich die Höhe der Zelle dem Text an oder muss das manuell geschehen? Wie löst man das dann wen nder Inhalt variabel ist?

Fragen über Fragen…

Ich hoffe ihr könnt mir helfen.

MfG Chaos

Edit:
Edit:
Weiß jemand von euch wieso ich wenn ich gerade eine PDF erstelle keine Schleifen ausführen oder keine Variable in eine Tabelle schreiben kann?

Code:
for ($i=0; $i=14; $i++)
{
$pdf->Cell(30,10,„Frage $i: $frage[$i]“,1,0,c,0,0);
$pdf->Cell(30,10,"$antwort[$i]",1,0,c,0,0);
$pdf->Ln();
}

Wenn ich das ausführen möchte hängt sich mein Server auf.

Hi!
Bist du dir sicher, dass er sich auhängt?

Edit:
Weiß jemand von euch wieso ich wenn ich gerade eine PDF
erstelle keine Schleifen ausführen oder keine Variable in eine
Tabelle schreiben kann?

Code:
for ($i=0; $i=14; $i++)

Was soll diese for-Schleife? $i wird mit i=0 initialisiert.
Als zweites Argument muss die Bedingung für die Ausführung der Schleife stehen;da steht bei dir wieder eine Zuweisung $i=14.
Aber auch $i==14 würde keinen Durchlauf der Schleife verursachen.
Dann müsste da schon eher $i Cell(30,10,„Frage $i: $frage[$i]“,1,0,c,0,0);

$pdf->Cell(30,10,"$antwort[$i]",1,0,c,0,0);
$pdf->Ln();
}

Wenn ich das ausführen möchte hängt sich mein Server auf.

Ja, ok, das is jetzt nicht mehr mein Problem, das habe ich jetzt auch schon gelöst.

Ich schreibe jetzt die einzelnen Arrays von mir in eine DAtei und lese sie anschließend wieder aus:

class PDF extends FPDF
{

//Load data
function LoadData($file)
{
//Read file lines
$lines=file($file);
$data=array();
foreach($lines as $line)
$data[]=explode(’;’,chop($line));
return $data;
}

function Table($data)
{

for ($i=0;$iCell(100,6,$data[$i][0],1);
$this->Cell(0,6,$data[$i][1],1);
$this->Ln();
}
}
}

$pdf=new PDF();
$pdf->AddPage();
$pdf->SetFont(„Arial“,„B“,12);
$data=$pdf->LoadData(„table.txt“);
$pdf->Table($data);
$pdf->Output();

Leider kapiert mein Skirpt nicht, wann es einen Zeilenumbruch machen soll. Wenn ich einen manuell im Skirpt mache, dann wird eine neue Zelle geschrieben obwohl ich nur die vorherige vergrößert haben will.
Die 2 Arrays sind einmal ein Array mit fragen und einmal ein Array mit Antworten die verschieden lang sind (sich aber immer über 2 Zeilen erstrecken). Muss ich vieleicht was an dem line verändern?

Bitte bitte hilf mir ich habe absolut keine Ahnung mehr wie ich da weiterkomme und ich sitz den ganzen Tag da schon dran… :frowning:

Tschööö

haste schon mit \n bzw \r probiert?

Wenn du nen Zeilenumbruch willst, dann nimm statt $pdf->Cell
lieber $pdf->Multicell

Außerdem gibt es auf der FPDF-Seite noch en Haufen Scripte, welche dir die Funktionalität erweitern (z.B. um Tabellen, auswertung html-tags, usw.).

Jedoch hab ich kein Script gefunden, welches die benötigte Höhe einer Zelle ausrechnen kann.
Kannste aber annähernd bestimmen. Hab das so gelöst:

/**
* Stellt fest, wieviel mm hoch ein Text $text bei einer Zeilenbreite $b und der Zeilenhöhe $h wird.
* Sollte keine Zeilenhöhe angegeben sein, wird die vorhergehende verwendet.
* Es wird annähernd errechnet. D.h. bei sehr langen Texten kann es ungenau werden.
* Auch wenn viele lange Worte im Text vorkommen, wird der Algorithmus ungenau.
* Sobald Zeilenumbrüche vorkommen, Ist keine genauigkeit mehr gegeben.
*
* @param string $text Der Text
*
* @param double $b Die Breite des Textes bzw. der Spalte in mm
*
* @param double $h Die Höhe der Zeile. Default: letzte Zeilenhöhe in mm
*
* @return double $height Die Höhe des Textblocks in mm
*
* @access public
*
* @todo Evtl. Zeilenumbrüche verarbeiten
*/
function getTextHeight($text, $b ,$h=’’)
{
if (is_string($h))
{
$h=$this->lasth;
}
$b=$b*0.89; // Geschätzter Verlust durch Wörter 11%
$textlen=$this->GetStringWidth($text);
if ($textlen==0)
{
return 0;
}
$anzZeilen=(int)(($textlen/$b)+0.99);
$height=$anzZeilen*$h;
return $height;
}

Wegen dem Seitenumbruch:
Wenn berechnet hast, wie hoch dein Text wird, kannst du feststellen, ob noch genug Platz auf der Seite ist und dann einen Seitenumbruch machen.
Sollen die Zellen auf 2 Seiten aufgespalten werden, dann schau dir die Erweiterung " MultiCell with maxline " an.

Grüße

haste schon mit \n bzw \r probiert?

Ja hab’ ich!

Danke erstmal für die Antworten.
Hab’ jetzt das PDF mit so einem Script von FPDF hingefrimelt. Bin aber noch nciht ganz zufrieden.
Das Script mach automatisch eine neue Seite wenn die Tabelle größer als eine Seite ist.
Ich hab’s zwar jetzt geschafft meine Fußzeile in die Funktion dafür mit rein zustricken, aber nen Text schreiben kann ich leider noch nicht.
Außerdem kann ich die Tabelle nicht so wie ein Bild justieren. Wie kann man die Tabelle sonst noch ausrichten?

MfG Chaos

Das Script mach automatisch eine neue Seite wenn die Tabelle
größer als eine Seite ist.
Ich hab’s zwar jetzt geschafft meine Fußzeile in die Funktion
dafür mit rein zustricken, aber nen Text schreiben kann ich
leider noch nicht.
Außerdem kann ich die Tabelle nicht so wie ein Bild justieren.
Wie kann man die Tabelle sonst noch ausrichten?

Wie meinst das?

MfG Chaos

Wie meinst das?

Die Tabelle fängt am Anfang einer Seite an und hört dann auf wenn sie keine Daten mehr zum einfügen hat. Ich würde aber gerne sagen das die Tabelle erst z.B. in der Mitte des PDF-Files beginnt. Außerdem sollte cih noch andere Dinge in den Seiten einfügen können, als nur die Tabelle.

Mit

$pdf->setXY($x,$y);
bzw.
$pdf->setX($x);
bzw.
$pdf->setXY($y);

Kannst du die aktuelle Position innerhalb deiner Seite setzen, wobei die Koordinaten in der Längeneinheit angegeben werden, wie sie im Konstruktor 2ter Parameter bestimmt wurden (default ist da mm).
Wichtig ist auch zu wissen, dass mit dem manuellen Zeilenumbruch $pdf->ln() die X Position zu left-margin springt und nicht an der aktuellen X Position verweilt.

Achte aber drauf, dass es erst einen Seitenwechsel gibt, wenn du mit der Seite fertigt bist. D.h. erst alles andere und dann die Tabelle weiter machen.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Vielen DAnk ich werde es sofort ausprobieren.

Die Tabelle ghet aber über 3 Seiten und ich möchte in der 2ten Seite Bild einfügen. Wie mache ich das? Ich kann ja nicht in die Funktion eingreifen…

Vielen DAnk ich werde es sofort ausprobieren.

Die Tabelle ghet aber über 3 Seiten und ich möchte in der 2ten
Seite Bild einfügen. Wie mache ich das? Ich kann ja nicht in
die Funktion eingreifen…

Glaube, da bleibt dir nichts anderes übrig, als einzugreifen und evtl. eine eigene Methode zu schreiben, welche dir die Tabelle schreibt.
Also quasi so lange Tabellenzeilen ausgibt, bis eine neue Seite beginnt.
Dann Bilder und so einfügen, dann wieder weiter.

Oder:
Du schreibst die Methode so um, dass in der 2ten Seite erstmal eine eigene Metode aufgerufen wird, welche die Bilder einfügt und die aktuelle Position darunter setzt.

Danke, das werde ich wohl machen.

So, jetzt hätte ich noch eine letze Frage.

Ich möchte am Ende der Tabelle noch einen Text ausgeben.
Wenn die Tabelle aber größer wird, dann wird die Tabelle über den Text drüber geschrieben.
Wie kann ich das verhindern?

Indem du den Text erst nach dem Schreiben der Tabelle dahinter ausgibst.
Per $pdf->getX() und $pdf->getY() kannst du die aktuelle Position ermitteln und dann per Set den Start des Textes drunter setzen.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hat es nun geklappt, wie du wolltest?
[nt]

Ja, vielen Dank! :smiley: