All paar Monate greife ich mal wieder auf FPDF zurück und stolpere immer wieder über die etwas gewöhnungsbedürftigen Funktionen der Text-Platzierung.

In welcher Einheit sind die Einheiten? Welche zig Parameter muss ich der Methode übergeben und wie erstelle ich mehrzeiligen Text?

X/Y und Höhenangaben

Die x/y-Positionen, Breite und Höhe sind zum Glück in Millimetern, so braucht man nicht all zu viel umzurechnen.
Allerdings bezieht sich die y-Position oft auf die erste Grundlinie der Textbox. Und oft auf etwas ganz anderes.

Kann man bei einer Textbox die Höhe angeben, wird der Text in den meisten Fällen auf diese Höhe gestreckt – der Zeilenabstand also so gewählt, dass der Text die gesamte Höhe der Textbox füllt.
Umgehen kann man dies mit einem separaten Addon, auf das ich später zurück komme.

Unterschiedliche Methoden für unterschiedliche Ansprüche

x- und y-Position der verwendeten Befehle habe ich jeweils mit einer roten, respektiven blauen, Linie markiert, um zu sehen, dass die y-Position nicht immer da ist, wo man sie erwartet.

Als PDF | Zugehöriger Skriptcode

text()

$pdf->text(x, y, text);

Text läuft einzeilig rechts aus der Seite raus. Dokumentation

write()

$pdf->write(zeilenhoehe, text [, link]);

Text läuft mehrzeilig, die angegebene Höhe ist die Zeilenhöhe des enthaltenen Textes, nicht die Gesamthöhe der Textbox.
Vorhergehende Positionsangabe per
$pdf->setXY(x, y);
, wobei die Position nicht so genau dem entspricht, was man von der Funktion
$pdf->text()
 her kennt. Dokumentation

cell()

$pdf->Cell(breite [, höhe] [, text] [, border] [, ln] [, align] [, fill] [, link]);

border  Entweder             0*: ohne Rahmen 1: mit Rahmen
        Oder Kombination aus L: links T: oben R: rechts B: unten
ln      x/y-Position nach der Ausgabe
        0*: rechts von der Zelle
        1:  direkt unter der Zelle
        2:  kein Zurücksetzen auf den linken Seitenrand beim Zeilenumbruch
align   L*: linksbündig  C: zentriert  R: rechtsbündig
fill    0*: transparent  1: mit SetFillColor() gefüllt

* = Standard

Auch wieder einzeilig und vorhergehende Positionsangabe per

$pdf->setXY(x, y);
nötig (sofern man nicht Zelle hinter Zelle setzen will).
Mann muss sich das Resultat wie eine Tabellen-Zelle vorstellen, bei der der Text im Zweifelsfall rechts raus läuft.
Die Breite hat somit mit der Textbreite nicht wirklich was zu tun; der Text läuft so oder so bis zum rechten Blattende, sollte er länger sein. Vertikal wird der Text zentriert platziert, was eine genauere Platzierung meiner Ansicht nach erschwert. Dokumentation

MultiCell()

$pdf->MultiCell(breite, zeilenhöhe, text [, border] [, align] [, fill]);

border  Entweder             0*: ohne Rahmen 1: mit Rahmen
        Oder Kombination aus L: links T: oben R: rechts B: unten
align   L*: linksbündig  C: zentriert  R: rechtsbündig
fill    0*: transparent  1: mit SetFillColor() gefüllt

* = Standard

Hier läuft der Text nun im Gegensatz zu
$pdf->Cell()
mehrzeilig. Die Höhe des Textrahmens ergibt sich aus der Zeilenhöhe und Textmenge. Dokumentation

Weitere Möglichkeit mit Plugin

Die Gretchenfrage ist nun allerdings: Was tun, wenn ich – wie man es aus einem Layoutprogramm kennt – einen Textrahmen will, der genau 10 cm breit und 5 cm hoch ist, der Text mit einem gesunden Zeilenabstand platziert ist und sollte es mehr Text geben, als rein passt, dieser abgeschnitten wird, da er in den meisten Fällen sonst über das nächste feste Formularfeld läuft.

Für diesen Zweck habe ich auf der FPDF-Homepage das AddOn TextBox gefunden.

drawTextBox()

Verwendung:
$pdf->drawTextBox(text, breite, höhe [, align [, valign [, border]]]);

align   L*: linksbündig  C: zentriert  R: rechtsbündig  J: ?!?
valign  T*: oben  M: mittig B: unten
border  true*: Mit Rand  false: ohne Rand

* = Standard

Installation

Quelltext von der AddonOn-Seite kopieren und in ein neues php-Dokument einfügen.
Achtung: Sofern man noch andere AddOns verwendet, muss der Klassenname hinter extends entsprechend angepasst werden.

<?php

class PDF_TextBox extends FPDF { // <-- Standard
//class PDF_TextBox extends FPDI { // <-- Falls man z.B. zusätzlich das Template-AddOn verwendet

function drawTextBox($strText, $w, $h, $align='L', $valign='T', $border=true) {
    $xi=$this->GetX();
    $yi=$this->GetY();
    // [...]

Und im Skript, welches das PDF erstellt initiiert man sein Objekt nun mit

PDF_TextBox();
statt mit
FPDF();
oder
FPDI();

<?php

require_once('../_lib/pdf/fpdf.php');
require_once('../_lib/pdf/fpdi.php');
require_once('../_lib/pdf/fpdf_tpl.php');
require_once('../_lib/pdf/fpdf_addon_textbox.php');

//$pdf = new FPDF(); // <-- Ohne AddOn
$pdf = new PDF_TextBox();
$pdf->AddPage();
// [...]