FPDF: Wie platziere ich Text?
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.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
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 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
$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
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();
// [...]
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();
// [...]
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();
// [...]
![]() ![]() ![]() ![]() |
|
Erstellt am: 14.07.2016 | .Kommentieren |