Donnerstag, 24. Mai 2012


Artikel

Dezember 2009 | Artikel

PDF-Generierung auf Basis von PHP, FPDF und LIMBAS Fortsetzung, Teil 3

Teil 1   Teil 2   Teil 3   Teil 4   Teil 5   

HinweisHinweis

Grafiken können direkt als Hintergrund oder feste Bestandteile der Vorlage durch das Element GRAPHIK hochgeladen werden. Sie lassen sich zusätzlich einfach modifizieren (SPIEGELN, KONTRAST, GAMMA usw.), wobei LIMBAS im Backend auf ImageMagick zurückgreift. Ihre Größe und Auflösung wird für die Bearbeitung im Editor neu berechnet und verkleinert, sodass auch hochauflösende Bilder kein Problem darstellen. Die Bilder werden immer im Originalformat in das PDF eingebunden. Anstatt Bilder können auch PDF-Dokumente hochgeladen werden, die mithilfe von FPDI automatisch in das Dokument integriert werden.

Neben dem Produktbild fügen wir den Produktnamen und den Preis hinzu. Dazu wählen wir wie beim Bild das entsprechende Tabellenfeld in der Werkzeugleiste aus und schieben sie auf die Positionen X:200, Y:70 und X:200, Y:95. Danach setzen wir die Zeichengröße auf 20 und färben den Preis mit einer beliebigen Farbe. Ein Problem kann auftreten, wenn ein Textelement wie der Produktname so lang ist, dass er einen Zeilenumbruch verursacht. Dafür müssen wir zuerst die Funktionsweise von FPDF verstehen. FPDF versucht, den von LIMBAS zur Verfügung gestellten Textblock an die vorgegebene Position mit der vorgegebenen Breite zu setzen. Dabei wird so lange ein Textumbruch ausgeführt, bis der Block vollständig geschrieben ist. Das Verhalten entspricht dem eines HTML-Blockelements mit der Style-Einstellung overflow=visible. Durch die absolute Positionierung der Elemente würde der Name über den des Nachfolgeelements, also Produktpreis, geschoben. Um das zu verhindern, gibt es in LIMBAS die Möglichkeit der relativen horizontalen Positionierung einzelner Elemente. Dazu wählen wir den Produktnamen aus und merken uns seine Elementnummer, die oben im Kontextmenü angezeigt wird. Danach wählen wir den Produktpreis und wählen im Menüpunkt RELATIV jene Nummer aus. Damit wird das Element Preis relativ in der Y-Position zum Ende des ausgewählten Elements positioniert. Folgeelemente können wiederum relativ zum vorherigen positioniert werden und so weiter.

Eine weitere, oft benötigte Anforderung ist die Reihenfolge der Positionierung. Welche Elemente im Vordergrund stehen, kommt auf die Reihenfolge an, in der sie von FPDF geschrieben werden. Schlussendlich gilt: Die Letzten sind immer die Ersten. LIMBAS bietet zwei Möglichkeiten, darauf Einfluss zu nehmen. Im rechten Werkzeugmenü können die Sortierungsoptionen Z-INDEX oder Y-POS ausgewählt werden. Y-Pos bedeutet, dass die Elemente nach ihrer vertikalen Ausrichtung sortiert werden, also von oben nach unten. Diese Einstellung ist praktisch für Dokumente wie Rechnungen, Datenblätter oder Tabellendarstellungen. Sind zwei Elemente auf gleicher Höhe, kann man eines um einen Pixel nach unten oder oben verschieben, um eine Sortierung zu provozieren. Die Einstellung Z-Index bedeutet, dass nach dem Z-Index des Elements sortiert wird und somit Elemente mit hohem Index über Elementen mit niedrigem Index liegen. Anwendungen wären zum Beispiel Flyer oder Visitenkarten, wo Bild und Textelemente individuell in den Vorder- oder Hintergrund positioniert werden sollen. Die Einstellung IN DEN VORDERGRUND bzw. IN DEN HINTERGRUND im Kontextmenü eines Elements bewirken diese Vergrößerung bzw. Verkleinerung seines Z-Indexes. Der aktuelle Index eines Elements kann im Kontextmenü ausgelesen werden.

Teil 1   Teil 2   Teil 3   Teil 4   Teil 5   

Kommentare

Gravatar A. van Loock 10.12.2009
um 14:06 Uhr
Eine Alternative stellt auch FOP dar. Zwar kann man mit PHP nicht direkt auf FOP zugreifen, allerdings in einem geschlossenem System mittels system("/fop.bat -xsl foo.xsl -xml foo.xml -pdf foo.pdf") um einiges einfacher. Mit StyleVision von Altova kann man dann die Vorlagen bauen und diese dann mit der dazu passenden XML-Datei durch FOP jagen.

Wir machen dies so unter JAVA (Allerdings nicht per Commandline). Sollte also auch in PHP kein Problem sein.

Grüße
#zitieren