Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Tom Koenig Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Tom Koenig Projektarbeit Universität Kaiserslautern Postfach 3049 D-6750 Kaiserslautern AG Integrierte Kommunikationssysteme Betreuer : Prof. Dr. Paul Müller Dipl.-Inform. Markus Hillenbrand Das Projekt KLinform beschäftigt sich mit der Erstellung eines regionalen Internet Portals für den Landkreis Kaiserslautern. Dem Benutzer dieses Portals sollen über das Web (mittels eines Servers) für ihn relevante Informationen das tägliche Leben betreffend (z.B. Verwaltungsaufgaben, Kinobesuch,... etc ) zur Verfügung gestellt werden. Des weiteren soll es möglich sein, die individuellen Daten eines Benutzers zu verknüpfen und zusammenzuführen, um ihm diese in einem einzelnen Dokument zur Verfügung zu stellen. Dieser Aspekt wird durch ein Einbinden der Daten in ein PDF Dokument abgewickelt. Der Server, der alle Anfragen eines Benutzers verwaltet, soll in der Lage sein, die angeforderten Daten aus einer Datenbank, dem Web oder auch Textdateien in einem PDF Dokument zusammenzuführen. Dieses Dokument soll dem Benutzer anschließend zum Herunterladen angeboten werden, so dass ihm in einem zentralen Dokument alle nötigen und individuell angepassten Informationen zu einer gewünschten Situation (z.B. bei einem Autokauf : günstigster Händler, Zulassungsinformationen, Versicherung etc...) zur Verfügung stehen. In dieser Arbeit werden die Möglichkeiten zur serverseitigen Erzeugung eines PDF-Dokuments ermittelt, analysiert und auf Grundlage dieser Analyse kritisch gegenübergestellt. Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Inhaltsverzeichnis 1. Einführung _______________________________________ 6 1.1 Portable Document Format ______________________________ 6 1.2 Erstellen von PDF Dokumenten ___________________________ 7 1.3 Recherche ___________________________________________ 7 1.4 Anforderungen________________________________________ 8 2. Analyse ________________________________________ 10 2.1 iText ______________________________________________ 10 2.1.1 2.1.2 2.1.2.1 2.1.2.2 2.1.2.3 2.1.2.4 Grundlegende Eigenschaften ______________________________ Metainformationen ______________________________________ Einbinden von Text ______________________________________ Strukturierung eines Dokumentes __________________________ 10 11 11 13 2.1.3.1 2.1.3.2 2.1.3.3 2.1.3.4 2.1.3.5 2.1.3.6 2.1.3.7 2.1.3.8 Formatierung des Textes _________________________________ Strukturierung des Dokumentes ____________________________ Graphiken _____________________________________________ Tabellen ______________________________________________ Importieren von einzelnen HTML Seiten ______________________ Dauer ________________________________________________ Komplexität ____________________________________________ Kosten ________________________________________________ 15 16 16 17 17 17 18 18 2.1.3 2.2 Anforderungen ________________________________________ 15 Thentech ___________________________________________ 18 2.2.1 2.2.2 2.2.3 Versionierung _________________________________________ 18 Beschreibung _________________________________________ 19 Aufbau eines PDF Dokumentes____________________________ 19 2.2.3.1 2.2.3.2 2.2.3.3 Grundlegende Eigenschaften ______________________________ 19 Metainformationen ______________________________________ 20 Einbinden von Text ______________________________________ 21 2.2.4.1 2.2.4.2 2.2.4.3 2.2.4.4 2.2.4.5 2.2.4.6 2.2.4.7 2.2.4.8 Formatierung des Textes _________________________________ Strukturierung des Dokumentes ____________________________ Graphiken _____________________________________________ Tabellen ______________________________________________ Importieren von einzelnen HTML Seiten ______________________ Dauer ________________________________________________ Komplexität ____________________________________________ Kosten ________________________________________________ 2.2.4 2.3 Beschreibung _________________________________________ 10 Aufbau eines PDF Dokumentes____________________________ 10 Anforderungen ________________________________________ 22 22 23 23 25 25 25 25 25 PDFlib _____________________________________________ 26 2.3.1 2.3.2 Beschreibung _________________________________________ 26 Aufbau eines PDF Dokumentes____________________________ 26 2.3.2.1 2.3.2.2 Grundlegende Eigenschaften ______________________________ 26 Metainformationen ______________________________________ 27 Seite 1 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 2.3.2.3 Einbinden von Text ______________________________________ 28 2.3.3.1 2.3.3.2 2.3.3.3 2.3.3.4 2.3.3.5 2.3.3.6 2.3.3.7 2.3.3.8 Formatierung des Textes __________________________________ 30 Strukturierung des Dokumentes ____________________________ 33 Graphiken _____________________________________________ 33 Tabellen _______________________________________________ 34 Importieren von einzelnen HTML Seiten ______________________ 34 Dauer _________________________________________________ 34 Komplexität ____________________________________________ 34 Kosten ________________________________________________ 35 2.3.3 Anforderungen ________________________________________ 30 2.4 retepPDF ___________________________________________ 35 2.5 Etymon PJ __________________________________________ 36 2.6 FOP _______________________________________________ 36 2.6.1 2.6.2 2.6.3 Beschreibung _________________________________________ 36 Aufruf _______________________________________________ 36 Aufbau eines PDF Dokumentes ____________________________ 36 2.6.3.1 2.6.3.2 2.6.3.3 Grundlegende Eigenschaften _______________________________ 37 Metainformationen _______________________________________ 38 Einbinden von Text ______________________________________ 39 2.6.4.1 2.6.4.2 2.6.4.3 2.6.4.4 2.6.4.5 2.6.4.6 2.6.4.7 2.6.4.8 Formatierung des Textes __________________________________ 41 Strukturierung des Dokumentes ____________________________ 43 Graphiken _____________________________________________ 43 Tabellen _______________________________________________ 44 Importieren von einzelnen HTML Seiten ______________________ 45 Dauer _________________________________________________ 46 Komplexität ____________________________________________ 46 Kosten ________________________________________________ 46 2.6.4 2.7 Anforderungen ________________________________________ 41 ClibPDF ____________________________________________ 46 2.7.1 2.7.2 Beschreibung _________________________________________ 46 Aufbau eines PDF Dokumentes ____________________________ 46 2.7.2.1 2.7.2.2 2.7.2.3 Grundlegende Eigenschaften _______________________________ 47 Metainformationen _______________________________________ 49 Einbinden von Text ______________________________________ 49 2.7.3.1 2.7.3.2 2.7.3.3 2.7.3.4 2.7.3.5 2.7.3.6 2.7.3.7 2.7.3.8 Formatierung von Text ___________________________________ 52 Strukturierung des Dokumentes ____________________________ 54 Graphiken _____________________________________________ 54 Tabellen _______________________________________________ 55 Importieren von einzelnen HTML-Seiten ______________________ 55 Dauer _________________________________________________ 55 Komplexität ____________________________________________ 55 Kosten ________________________________________________ 55 2.7.3 2.8 Anforderungen ________________________________________ 52 PrepTool - Java PDF Toolkit ____________________________ 56 2.8.1 Beschreibung _________________________________________ 56 2.8.1.1 2.8.1.2 2.8.1.3 Grundinformationen ______________________________________ 58 Metainformationen _______________________________________ 59 Einbinden von Text ______________________________________ 60 2.8.2.1 2.8.2.2 2.8.2.3 Formatierung des Textes __________________________________ 61 Strukturierung des Dokumentes ____________________________ 62 Graphiken _____________________________________________ 63 2.8.2 Seite 2 Anforderungen ________________________________________ 61 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 2.8.2.4 2.8.2.5 2.8.2.6 2.8.2.7 2.8.2.8 2.9 63 64 64 64 64 Data2pdf ___________________________________________ 65 2.9.1 2.9.2 Aufruf _______________________________________________ 65 Beschreibung _________________________________________ 65 2.9.2.1 2.9.2.2 2.9.2.3 Grundinformationen _____________________________________ 67 Metainformationen ______________________________________ 67 Einbinden von Text ______________________________________ 68 2.9.3.1 2.9.3.2 2.9.3.3 2.9.3.4 2.9.3.5 2.9.3.6 2.9.3.7 2.9.3.8 Formatierung von Text ___________________________________ Strukturierung des Dokumentes ____________________________ Graphiken _____________________________________________ Tabellen ______________________________________________ Importieren von einzelnen HTML-Seiten ______________________ Dauer ________________________________________________ Komplexität ____________________________________________ Kosten ________________________________________________ 2.9.3 3. Tabellen ______________________________________________ Importieren von einzelnen HTML-Seiten ______________________ Dauer ________________________________________________ Komplexität ____________________________________________ Kosten ________________________________________________ Anforderungen ________________________________________ 69 69 70 71 71 72 72 72 72 Vergleich der Werkzeuge __________________________ 73 3.1 Grundfunktionalität ___________________________________ 73 3.2 Formatierung von Text ________________________________ 73 3.3 Strukturierung des Dokumentes _________________________ 74 3.4 Graphiken __________________________________________ 74 3.5 Tabellen ____________________________________________ 74 3.6 Importieren von einzelnen Webseiten _____________________ 75 3.7 Dauer _____________________________________________ 75 3.8 Komplexität _________________________________________ 75 3.9 Kosten _____________________________________________ 76 3.10 4. Gesamtvergleich ___________________________________ 76 Importieren von einzelnen HTML-Seiten _______________ 78 4.1 Eigenschaften von html2ps _____________________________ 79 4.1.1 4.1.2 4.1.3 5. einfache Seite (mit Textformatierung) ______________________ 80 Tabellen _____________________________________________ 81 Framesets ____________________________________________ 82 Anhang ________________________________________ 84 5.1 Installation und Aufruf der Werkzeuge ____________________ 84 5.1.1 iText ________________________________________________ 84 5.1.1.1 5.1.1.2 5.1.1.3 5.1.2 zugrunde liegende Version ________________________________ 84 Umgebung ____________________________________________ 84 Aufruf ________________________________________________ 84 Thentech PDF Driver ____________________________________ 84 Seite 3 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 5.1.2.1 5.1.2.2 5.1.2.3 zugrunde liegende Version_________________________________ 84 Umgebung _____________________________________________ 84 Aufruf _________________________________________________ 84 5.1.3.1 5.1.3.2 5.1.3.3 zugrunde liegende Version_________________________________ 85 Umgebung _____________________________________________ 85 Aufruf _________________________________________________ 85 5.1.4.1 5.1.4.2 5.1.4.3 zugrunde liegende Version_________________________________ 85 Umgebung _____________________________________________ 85 Aufruf _________________________________________________ 86 5.1.5.1 5.1.5.2 5.1.5.3 zugrunde liegende Version_________________________________ 86 Umgebung _____________________________________________ 86 Aufruf _________________________________________________ 86 5.1.6.1 5.1.6.2 5.1.6.3 zugrunde liegende Version_________________________________ 87 Umgebung _____________________________________________ 87 Aufruf _________________________________________________ 87 5.1.7.1 5.1.7.2 5.1.7.3 zugrunde liegende Version_________________________________ 88 Umgebung _____________________________________________ 88 Aufruf _________________________________________________ 89 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.1.8 5.2 PDFlib _______________________________________________ 85 FOP _________________________________________________ 85 ClibPDF ______________________________________________ 86 Data2pdf _____________________________________________ 87 Glance Java PDF Toolkit _________________________________ 88 Ghostscript und html2ps_________________________________ 89 Anwendungsbeispiele _________________________________ 91 5.2.1 iText ________________________________________________ 91 5.2.1.1 5.2.1.2 5.2.1.3 5.2.1.4 5.2.1.5 Anwendungsbeispiel Anwendungsbeispiel Anwendungsbeispiel Anwendungsbeispiel Anwendungsbeispiel 5.2.2.1 5.2.2.2 Anwendungsbeispiel 2-1 _________________________________ 121 Anwendungsbeispiel 2-2 _________________________________ 125 5.2.3.1 5.2.3.2 Anwendungsbeispiel 3-1 _________________________________ 128 Anwendungsbeispiel 3-2 _________________________________ 135 5.2.4.1 5.2.4.2 5.2.4.3 5.2.4.4 Anwendungsbeispiel Anwendungsbeispiel Anwendungsbeispiel Anwendungsbeispiel 5.2.5.1 5.2.5.2 Anwendungsbeispiel 7-1 _________________________________ 163 Anwendungsbeispiel 7-2 _________________________________ 175 5.2.6.1 5.2.6.2 5.2.6.3 5.2.6.4 Anwendungsbeispiel Anwendungsbeispiel Anwendungsbeispiel Anwendungsbeispiel 5.2.7.1 5.2.7.2 Anwendungsbeispiel 9-1 _________________________________ 198 Anwendungsbeispiel 9-2 _________________________________ 202 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.3 Seite 4 1-1 1-2 1-3 1-4 1-5 __________________________________ 91 __________________________________ 98 _________________________________ 101 _________________________________ 114 _________________________________ 117 Thentech PDF Treiber __________________________________ 121 PDFlib ______________________________________________ 128 FOP ________________________________________________ 139 6-1 6-2 6-3 6-4 _________________________________ 139 _________________________________ 148 _________________________________ 150 _________________________________ 160 ClibPDF _____________________________________________ 163 Java PDF Toolkit ______________________________________ 178 8-1 _________________________________ 178 8-2 _________________________________ 185 8-3a ________________________________ 188 8-3b ________________________________ 193 Data2pdf ____________________________________________ 198 Abbildungsverzeichnis________________________________ 205 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 5.4 Tabellenverzeichnis __________________________________ 206 5.5 Beispielverzeichnis __________________________________ 207 5.6 Literaturverzeichnis __________________________________ 208 Seite 5 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 1. Einführung In diesem Kapitel werden neben einer kurzen Einführung in das Portable Document Format die Ziele und Anforderungen dargestellt, die den Rahmen dieser Arbeit bilden. 1.1 Portable Document Format Das Portable Document Format (kurz PDF) findet seinen Ursprung Anfang der neunziger Jahre. Es ist eine von Adobe entwickelte Spezifikation die 1993 im Rahmen der Adobe Acrobat Produktfamilie vorgestellt und seit dem bis heute kontinuierlich weiterentwickelt wurde und nach und nach zum Standard im Bereich des elektronischen Dokumenten-Austausches avancierte. Den Status eines Standards verdankt PDF mehreren Faktoren, deren Zusammenspiel PDF zum einem weltweit bekannten und genutzten Format machten. Auf der einen Seite liegt dies sicherlich am enormen Boom, den das Internet in den letzten Jahren erfahren und somit dem PDF die Möglichkeit zum Austausch von Dokumenten eröffnet hat. Zum anderen sind aber auch die Vorteile des Formats als hervorstechende Faktoren zu nennen. Adobe beschreibt PDF in der PDF Reference [AdoR00] wie folgt: PDF ermöglicht Dokumente in einer Art und Weise zu behandeln, die unabhängig ist von der Applikations Software, der Hardware, sowie dem Betriebssystem, die genutzt wurden, um das Dokument zu erstellen. vom Ausgabemedium, das genutzt wird, um das Dokument darzustellen oder zu drucken. Diese Unabhängigkeit sorgt dafür, dass PDF uneingeschränkt nutzbar wird. Zusätzlich bietet Adobe freien Zugang zur nötigen Software. Das frei erhältliche Software-Paket "Adobe Acrobat Reader" [AdoA01] ermöglicht jedem Nutzer, ein PDF Dokument zu öffnen und darzustellen. Diese Faktoren haben in ihrer Kombination zum weltweiten Erfolg von PDF beigetragen: Das Internet stellt die erforderliche Plattform zum Austausch bereit. Das PDF Format ist unabhängig auf jedem Rechner darstellbar. Die Software ermöglicht die Darstellung. Detaillierte und weitergehende Information zu PDF können der PDF Spezifikation [AdoS99] sowie der PDF Reference [AdoR00] entnommen werden. Neben diesen Vorteilen bietet PDF aber auch ein Manko: das Erstellen eines Dokumentes. Das Erstellen eines Dokumentes ist mit der Adobe Acrobat Reader Seite 6 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Software nicht möglich, hier ist das Adobe Acrobat Paket erforderlich, das durch seinen hohen Preis nicht unbedingt als Standard Software Paket zu bezeichnen ist. Ein Benutzer muss hier (wenn ihm die Kosten von Adobe Acrobat zu hoch erscheinen) den Weg über sogenannte "third party" Werkzeuge suchen, also Werkzeuge die von anderen Unternehmen zu einem geringeren Preis oder gar als Freeware Paket angeboten werden. Die serverseitige Erstellung eines PDF Dokumentes ist zentrales Thema dieser Arbeit. Im folgenden Abschnitt wird diese Thematik näher erläutert. 1.2 Erstellen von PDF Dokumenten Das Erstellen von PDF Dokumenten ist ein Manko des PDF Standards. Das Ziel dieser Arbeit soll es nicht sein, PDF Dokumente in Adobe Acrobat Manier zu erstellen, sondern PDF Dokumente dynamisch zur Laufzeit eines Programms oder einer Web-Applikation zu erzeugen. Ein PDF Dokument soll beispielsweise mittels einer Programmiersprache, wie etwa Java, in Verbindung mit einer Klassenbibliothek (Werkzeug) erzeugt werden. Bei der Erzeugung sollen Daten aus unterschiedlichen Quellen - dem Web, einer Datenbank oder einer Textdatei in das PDF Dokument eingebunden werden können. Das PDF Dokument kann so jederzeit auf individuelle Bedürfnisse angepasst werden. Die Daten, die in einem PDF Dokument zusammengeführt werden, werden also anhand eines (zu ermittelnden) Werkzeuges, auf einem Server dynamisch in ein PDF Dokument eingebunden. Viele der auf dem Markt erhältlichen Werkzeuge scheiden hier bereits aus, da sie nur auf die statische Erstellung eines Dokumentes zugeschnitten sind. Zentraler Aspekt der PDF Erzeugung soll die Möglichkeit sein, das Dokument aus verschiedenen Quellen mittels eines Werkzeuges zur Laufzeit zu erzeugen. Im folgenden wird eine Recherche durchgeführt, die alle geeigneten Werkzeuge ermitteln soll. 1.3 Recherche Anhand der Vorgaben wurde eine Recherche durchgeführt, die in einem ersten groben Schritt jegliche PDF relevanten Werkzeuge ermittelte. In einem zweiten Schritt wurde der Anwendungsbereich jedes Werkzeuges bewertet, um so einschätzen zu können, ob das jeweilige Werkzeug für den Zweck der dynamischen Generierung eines Dokumentes geeignet erscheint. Die Werkzeuge die im Bereich der Erstellung einsetzbar sind, werden einer intensiven Bewertung unterzogen. Dabei soll anhand einer allgemeinen Einführung in das Werkzeug und konkreten Beispielen aufgezeigt werden, wie die Erzeugung eines PDF Dokumentes möglich ist. Die Anforderung der dynamischen Erzeugung des Dokumentes aus verschiedenen Daten-Quellen ist nur die grobe Rahmenbedingung, die das Werkzeug auf jeden Fall erfüllen muss. Zusätzlich zu dieser Anforderung werden nun noch einige Kriterien angeführt, denen die Funktionalität jedes Werkzeuge Seite 7 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten kritisch gegenübersteht. Die Anforderungen zielen dabei vor allem auf den Inhalt des Dokumentes ab, es müssen gewisse Strukturelemente erzeugt werden können, um einer adäquaten Darstellung der Inhalte der Datenquellen zu genügen. Für weitere Informationen im Bereich PDF oder bei der Suche nach PDF Werkzeuge empfehlen sich die folgenden Referenzen: [BinT01], [IntB01] 1.4 Anforderungen Die Kriterien werden im folgenden vorgestellt und kurz erläutert. Formatierung des Textes Es soll möglich, sein Texte zu formatieren unterstreichen) um so gewisse Teile hervorzuheben. (beispielsweise zu Strukturierung des Dokumentes Überschriften sollen spezifiziert werden können, es muss also ein gewisses Maß an Strukturierungsmöglichkeiten gegeben sein. Graphiken Das Dokument sollte Graphiken der Formate GIF und JPEG aufnehmen können. Tabellen Es sollte die Möglichkeit vorhanden sein, mittels des Werkzeuges Tabellen zu generieren. Importieren von einzelnen HTML-Seiten Eine Webseite sollte komplett eingebunden werden können. Dauer Die Zeit die zum Erstellen des Dokumentes benötigt wird sollte möglichst minimal sein. Komplexität Das Erstellen eines Dokumentes sollte ein gewisses Maß an Komplexität nicht übersteigen. Kosten Die mit dem Erwerb des Werkzeuges verbundenen Kosten sollten möglichst minimal sein. Seite 8 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Im folgenden Kapitel werden nun alle Werkzeuge vorgestellt, die während der Recherche ermittelt wurden, und hinsichtlich der oben angeführten Kriterien analysiert: Werkzeug Referenz iText Thentech PDFlib retepPDF ClibPDF Data2pdf Glance FOP Etymon PJ Schnittstelle Bemerkung http://www.lowagie.com/iText Java http://www.thentech.com Java http://www.pdflib.com http://www.retep.org.uk/pdf/ http://www.fastio.com http://www.sanface.com/data2pdf.html http://pdf.glance.ch http://xml.apache.org/fop/ http://www.etymon.com/pj/ Java,C,C++,… Java Analyse wird nicht durchgeführt, Funktionalität zu gering. C Skriptsprache Java Java, XML Java Analyse wird nicht durchgeführt, Funktionalität zu gering Tabelle 1 : Liste der Werkzeuge Seite 9 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 2. Analyse Die in Kapitel 1 Sektion 4 aufgestellten Anforderungen werden im folgenden Kapitel für alle ermittelten Werkzeuge analysiert. Im dritten Kapitel werden anhand dieser Analyse die einzelnen Werzkeuge verglichen, um so das oder die am besten geeigneten Werkzeuge herauszufiltern. 2.1 iText 2.1.1 Beschreibung iText ist eine Java Bibliothek, die es ermöglicht, aus der Programmiersprache Java heraus PDF Dokumente zur Laufzeit zu erzeugen. Neben der Erzeugung von PDF Dokumenten bietet iText darüber hinaus die Möglichkeit HTML- sowie XMLDokumente zu generieren. Es können nur neue Dokumente erzeugt, nicht aber bestehende Dokumente verändert werden. Nun folgend wird der Aufbau eines PDF Dokumentes mittels iText erläutert. Für weitere Informationen bezüglich iText steht die Webseite des Entwicklers zur Verfügung [Lowa01], auf der ein Tutorial (im Aufbau) verfügbar ist, sowie auch eine ausführliche API Referenz [LowJ01]. 2.1.2 Aufbau eines PDF Dokumentes Ein Dokument wird in iText mittels der Document-Klasse beschrieben, es ist das zentrale Objekt, über das alle Informationen das Dokument betreffend eingebunden werden können. Dem Benutzer werden verschiedene Objekte zur Verfügung gestellt, mittels welcher er ein Dokument aufbauen kann. Die Document-Klasse bietet dabei einerseits die Möglichkeit grundlegende Eigenschaften eines Dokumentes zu beschreiben, andererseits können über diese Klasse auch Metainformationen über das Dokument verwaltet werden. 2.1.2.1 Grundlegende Eigenschaften Zu den grundlegenden Eigenschaften gehören bei iText die Angabe der Seitengröße und der Ränder einer Seite. Der Konstruktor der Klasse bietet in seiner speziellsten Form die Möglichkeit an, alle diese Informationen beim Erstellen des betreffenden Objektes anzugeben. Beispiel 1 : Erzeugung eines Dokumentes mittels iText Document document = new Document(PageSize.A4); Document document = new Document(PageSize.A4, 50, 50, 50, 50); Seite 10 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten In diesen Beispielen werden zwei Dokumente konstruiert - beide in Seitengröße A4, wobei bei letzterem noch die Ränder links, rechts, oben und unten gesetzt werden. Die Angabe der Ränder erfolgt in Punkten. 2.1.2.2 Metainformationen Die Document-Klasse stellt neben den allgemeinen Informationen weiterhin Methoden zur Verfügung, welche Metainformationen, also Informationen über das Dokument, an das jeweilige Dokument zu binden. Zu diesen Metainformationen gehören: Autor Titel Thema Schlüsselworte Erstellungsdatum Diese Informationen lassen sich wie in folgendem Beispiel aufgezeigt einfügen: Beispiel 2 : Verwalten von Metainformationen mittels iText document.addAuthor("Tom Koenig"); document.addTitle("Erzeugung von PDF Dokumenten"); document.addSubject("PDF Dokumente"); document.addKeywords("PDF"); document.addCreationDate(); Bisher wurden die zentralen Elemente eines Dokumentes wie etwa Text, Bilder etc. noch nicht erläutert. Diese Objekte sind in iText als eigenständige Klassen implementiert und werden über die Document-Klasse an das Dokument gebunden. Zu diesem Zweck stellt die Document-Klasse eine sehr mächtige Methode zur Verfügung: document.add(Element element) Diese Methode erlaubt es dem Benutzer, Element Objekte in einem Dokument einzubinden. Bei element handelt es sich eigentlich um ein Interface, das von anderen Klassen der iText Bibliothek implementiert wird. U.a. sind dies Klassen wie Chapter, Section, Paragraph, Phrase, Chunk, Gif, Jpeg, Lists, Table, Anchor usw., die durch ihren Namen bereits zeigen, welche Möglichkeiten iText noch bereitstellt. Im folgenden werden die meisten dieser Klassen beschrieben. 2.1.2.3 Einbinden von Text Das grundlegendste Element eines Dokumentes (der Text) kann in iText über drei Klassen eingebunden werden. Seite 11 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Abbildung 1 : Hierarchie der Text Klassen Chunk (Stück), repräsentiert die kleinste textuelle Einheit, die einem Dokument hinzugefügt werden kann. Per Definition [LowJ01] stellt Chunk einen String mit einem gewissen Font dar, ein Chunk kann dabei textuell alles darstellen, vom einzelnen Buchstaben über ein Wort bis hin zu einem kompletten Satz. Ein mittels Chunk erzeugtes Text Fragment wird nicht automatisch durch einen Zeilenumbruch beendet. Beispielhaft könnte man das berühmte "Hello World" anführen: Chunk chunk = new Chunk("Hello world"); Die nächste größere Einheit wird durch Phrase angeben, ein Phrase oder ein Satz kann dabei aus mehreren Chunks bestehen, kann aber auch ähnlich wie Chunk mittels eines Strings konstruiert werden. Phrase phrase = new Phrase("Dies ist ein Satz."); Phrase phrase = new Phrase(new Chunk("this is a phrase")); Die letzte Klasse Paragraph (Absatz) ist Phrase sehr ähnlich, bietet aber zusätzlich zwei Eigenschaften zur Bearbeitung des Textlayouts an. Mittels der beiden Konstrukte Indentation und Alignment ist es möglich Absatzeinzüge anzugeben sowie die Ausrichtung des Textes festzulegen. Paragraph paragraph = new Paragraph("Dies ist ein Absatz."); Die drei Klassen lassen sich also hierarchisch wie in Abbildung 1 dargestellt anordnen. Zu beachten gilt, dass Text, der vor dem Zeilenende umgebrochen werden soll, mit Paragraph erzeugt werden muss, da die Konstrukte Phrase und Chunk an die aktuelle Cursorposition angehängt werden. Um nun den erzeugten Text im PDF Dokument sichtbar zu machen, verwendet man die Methode document.add(Element) wobei Element dann das Seite 12 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten entsprechende Element Phrase, Chunk, Paragraph darstellt. Anwendungsbeispiel 1.1 wird er Einsatz dieser Klassen demonstriert. 2.1.2.4 In Strukturierung eines Dokumentes Abbildung 2 : Strukturierungsbaum Anhand des in Abbildung 2 dargestellten Strukturierungsbaumes lässt sich erläutern, inwiefern es in iText möglich, ist einem Dokument eine Struktur zu verleihen. Die beiden Klassen, die neben der Document-Klasse die für diesen Zweck erforderlich sind heißen, sind Chapter und Section, also Kapitel und Sektion. Diese beiden Klassen ermöglichen es, das Dokument in eine buchähnliche Struktur aufzuteilen: Chapter chapter = new Chapter(new Paragraph("iText"),2); Dieses Beispiel erzeugt dann ein 2. Kapitel mit der Überschrift "iText". Ähnlich dem Kapitel gibt es die Möglichkeit, Sektionen zu erstellen. Diese Sektionen werden dann einem Kapitel zugeordnet: Section section=chapter.addSection(new Paragraph("Sektion",sectionFont),2); Seite 13 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Die Section-Klasse stellt ebenso wie die Chapter-Klasse die Methode addSection zur Verfügung, mittels welcher es möglich ist, eine Sektion weiter in Subsektionen zu unterteilen, wie auch in Abbildung 2 angedeutet. Es ist also folglich möglich über diese Funktion eine beliebig tiefe Schachtelung der Dokumentenstruktur zu erreichen: Section subsection = section.addSection(new Paragraph("SubSektion",sectionFont),3); In Abbildung 2 wird zu jeder der Klassen Document, Chapter, Section usw. ein Ast mit der Bezeichnung Element-Tree angegeben. Dieser Ast gibt an, dass Chapter und Section die gleiche Methode add(Element) besitzen wie die Klasse Document und dass es somit möglich ist, Elemente sowohl an das Dokument selbst wie auch an einzelne Kapitel oder Sektionen zu binden. In der folgenden Abbildung wird der Element Baum detailliert dargestellt: Abbildung 3 : Element Baum Alle Klassen (bis auf Anchor und List, ListItem) werden im folgenden noch besprochen oder wurden bereits erwähnt. Eine Verwendung dieser drei Klassen wird im allgemeinen Anwendungsbeispiel 1-5 aufgezeigt. Seite 14 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Der Element-Baum gibt an, welche Elemente nun mittels der add(Element) Methode eingebunden werden können. Bei der Kapitel-Klasse gilt es zu beachten, dass jegliche Elemente mittels add(Element) dem Kapitel zugeordnet werden, bevor das Kapitel mittels document.add(chapter) an das Dokument gebunden wird, da alle spätere Änderungen am Kapitel ohne Auswirkungen bleiben. Die Möglichkeiten, Kapitel und Sektionen zu definieren wird in den Anwendungsbeispiel 1-1 – 1-3 verwendet, Anwendungsbeispiel 1-4 ist ausschließlich auf die Verwendung von Chapter und Section ausgerichtet und zeigt auf, wie man eine Dokumentenstruktur erzeugt. 2.1.3 Anforderungen Es wurde im vorangehenden Abschnitt erläutert wie man grundsätzlich ein PDF Dokument mittels iText aufbaut. In der nun folgenden Sektion werden die in Kapitel 1 definierten Anforderungen analysiert. 2.1.3.1 Formatierung des Textes iText bietet im Bereich der Formatierung textueller Bereiche die Font-Klasse welche auch in Anwendungsbeispiel 1.1 näher dargestellt wird. Der Konstruktor der Font-Klasse sieht in seiner detailliertesten Form wie folgt aus: Font(int family, int size, int style, Color color) Es besteht die Möglichkeit eine Schriftart Schriftarten zur Verfügung gestellt werden: auszuwählen, wobei folgende Courier Helvetica Times New Roman Symbol ZapfDingbats Die Größe wird über einen ganzzahligen Wert (in Punkten) gesetzt, wie dies auch aus den meisten kommerziellen Produkten wie Word o.ä. bekannt ist. Die Farbe wird mittels der Color-Klasse aus dem Java Klassenpaket gesetzt. Das style Attribut bietet nun die Funktionalität an mit Hilfe welcher man einen Text unterstreichen, ihn fett oder kursiv unterlegen kann u.ä. Die möglichen Werte für style sind: Font.Normal Font.Bold Font.Italic Font.Underline Font.Strikethru Font.BoldItalic Seite 15 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Es sei hier angemerkt, dass auch Kombinationen dieser Werte für das style Attribut möglich sind (wie in Beispiel 1.1 Sektion 2 gezeigt). Wie bereits erwähnt wurde, besteht die Möglichkeit bei Paragraph Absatzeinzüge und die Ausrichtung des Textes festzulegen. Diese Möglichkeiten werden in Anwendungsbeispiel 1.1 Sektion 3 dargestellt. 2.1.3.2 Strukturierung des Dokumentes Die Möglichkeiten, eine Struktur in Dokumenten einzubringen, wurde in Absatz 2.1.2.4 detailliert beschrieben. iText bietet stellt hier die nötigen Mittel, bereit um dieses Kriterium zu erfüllen. 2.1.3.3 Graphiken Das Importieren von Bildern mittels iText ist sowohl für Gif-Bilder wie auch für Jpeg-Bilder möglich. Das Einbinden wird dabei mittels der Klasse Image geregelt: Beispiel 3 : Einbinden von Graphiken mittels iText Image jpeg = Image.getInstance("lotus.jpg"); section.add(jpeg); Image gif = Image.getInstance("vonnegut.gif"); section.add(gif); Der Einsatz von Bildern wird in Anwendungsbeispiel 1.2 dargestellt. Im Zuge der Erstellung des Anwendungsbeispiels 1.2 zur Erläuterung des Einbindens von Bildern wurde festgestellt, dass im Bereich der GIF Graphiken wohl eine Restriktion auf ein gewisse Ausprägung des GIF Formats besteht. Es wurden GIF Graphiken aus dem Internet, als auch selbst erstellte Graphiken getestet, angezeigt wurde aber keines der Bilder. Das einzige Bild in GIF-Format, das korrekt dargestellt wird, ist die Beispiel-Graphik der iText BeispielDistribution (vonnegut.gif aus dem Packet examples.zip). Bei dem verwendeten Format handelt es sich um GIF87a GIF Graphiken, nur dieses spezielle GIF Format kann mittels iText eingebunden werden. Es gibt zwei GIF Formate, das ältere GIF87a Format und das rezentere GIF89a Format, welches heute weitgehend eingesetzt wird. Weitere Informationen zu diesen Formaten können den folgenden Referenzen entnommen werden. [Com87], [Com90] Das Einbinden von Graphiken ist in iText sehr einfach und unkompliziert, denn mittels zweier Zeilen ist es bereits möglich eine Graphik in ein Dokument einzubinden. Graphiken des Typs Jpeg können ohne jegliche Probleme in ein Dokument aufgenommen werden, nur im Bereich der GIF Graphiken gibt es wie oben gezeigt große Probleme, diese überhaupt anzuzeigen. Seite 16 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 2.1.3.4 Tabellen iText bietet die Klassen Table, Cell, Row, mittels welcher Tabellen generiert werden können. Es ist sowohl möglich, einfache als auch komplexere Tabellen zu erstellen, wie dies auch im Detail in Anwendungsbeispiel 1.3 aufgezeigt wird. An dieser Stelle wird explizit auf das Anwendungsbeispiel 1.3 verwiesen, in dem der Einsatz der Klassen zur Erstellung von Tabellen anhand von vier Beispiel-Tabellen erläutert wird. Folgender Screenshot zeigt eine mittels iText erstellte Tabelle: Abbildung 4 : Screenshot iText Vergleichbar ist das Erstellen einer Tabelle mittels iText mit dem einer HTML Tabelle. Die Komplexität des Erstellungsprozesses hält sich dabei in Grenzen, es ist jedoch ein etwas höherer Aufwand erforderlich, um eine Tabelle zu erstellen. 2.1.3.5 Importieren von einzelnen HTML Seiten Das Einbinden einer kompletten HTML Seite wurde nicht berücksichtigt, iText kann also dieses Kriterium nicht erfüllen. 2.1.3.6 Dauer Es wird hier nur die Zeit bewertet die das kompilierte Java Programm benötigt um das jeweilige PDF Dokument zu erstellen, dabei wird vom Vorgang des Kompilierens abstrahiert. Die Zeit, die iText benötigt, um ein PDF Dokument zu erstellen, wurde anhand der bereits erwähnten Beispiele eingeschätzt. Alle Anwendungsbeispiele haben dabei einen Umfang von weniger als 2 Seiten. Die Dauer betrug bei allen Anwendungsbeispielen nur wenige Sekunden. Alle Vorgänge waren dabei unter 10 Sekunden abgeschlossen, was als exzellentes Resultat zu bewerten ist. Seite 17 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 2.1.3.7 Komplexität Der Vorgang des Erstellens eines PDF Dokumentes ist bei iText sehr einfach und verständlich gehalten. Die Namen der Objekte sind meist selbsterklärend und auch der Umgang mit den jeweiligen Methoden ist in den meisten Fällen problemlos. Manche Elemente jedoch sind in der API Referenz [LowJ01] schlecht oder eigentlich gar nicht beschrieben. Da sich das Tutorial noch im Aufbau befindet, können manche Fragen nicht problemlos geklärt werden. Im Bereich der Komplexität ist der Gesamteindruck bezüglich iText jedoch positiv. 2.1.3.8 Kosten iText wird unter der sogenannten GNU LIBRARY GENERAL PUBLIC LICENSE [Fsf91] vertrieben. Der Einsatz der Bibliothek ist damit kostenlos, was die gestellte Anforderung nach minimalen Kosten erfüllt. 2.2 Thentech 2.2.1 Versionierung Thentech ist aktuell (19.Juni 2001) in der Version 1.2 verfügbar und wird in drei Ausgaben angeboten: Ausgabe Kosten Verfügbarkeit Frei nutzbar Limited Freeware Edition (LFE) - Download Unter Einhaltung gewisser Richtlinien Standard Edition (SE) $250 Auf Bestellung Nein Enterprise Edition (EE) $1500 Auf Bestellung Nein Tabelle 2 : Versionierung des Thentech Werkzeuges Von den drei Versionen ist nur eine, die LFE frei verfügbar, darf aber nur unter Einhaltung der Thentech Terms & Conditions [ThoTT01] genutzt werden. Die LFE ist gegenüber den beiden anderen Versionen funktionell eingeschränkt. Eine Liste der in den verschiedenen Ausgaben angebotenen Funktionalität kann auf [Tho01] eingesehen werden. Die Analyse der Bibliothek wird mittels der LFE durchgeführt. Diese ist frei verfügbar und die Einschränkungen gegenüber den Seite 18 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten anderen Ausgaben, sind für die in dieser Arbeit gestellten Anforderungen nicht ausschlaggebend. 2.2.2 Beschreibung Die Thentech Java-Bibliothek bietet die Möglichkeit, PDF Dokumente dynamisch zu erzeugen. Die Bibliothek ermöglicht das Generieren von PDF Dokumenten, nicht aber die Bearbeitung eines bestehenden Dokumentes. Im folgenden Absatz wird der Aufbau eines PDF Dokumentes mittels Thentech dargestellt. 2.2.3 Aufbau eines PDF Dokumentes Ein Dokument wird in Thentech mittels der PDFxDocument-Klasse beschrieben. Diese Klasse ermöglicht es dem Benutzer Objekte zu erstellen, wie z.B. Bild, Seite, Schrift etc. und zusätzlich Informationen, die das Dokument im allgemeinen betreffen, zu verwalten. 2.2.3.1 Grundlegende Eigenschaften Die Angabe der Seitengröße sowie die Ausrichtung der Seite werden nicht direkt über die PDFxDocument-Klasse realisiert, sondern über die PDFxPage-Klasse, die eine Seite in einem PDF Dokument repräsentiert. Es gibt drei Möglichkeiten, eine neue Seite in einem Dokument zu erstellen: createPage() Erzeugt eine Seite mit folgenden Eigenschaften: o o Ausrichtung : Portrait Größe : Size_US_Letter createPage(double width,double height) Erzeugt eine Seite mit folgenden Eigenschaften: o o Ausrichtung : Portrait Größe : Individuell width x height (in inch) createPage(int size,int orientation) Erzeugt eine Seite, bei der sowohl die Größe wie auch die Ausrichtung der Seite aus vordefinierten "Handles" wählbar sind: Seite 19 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Größe: o SIZE_US_LETTER US Letter (8.50 inches x 11.00 inches or 612 units x 792 units) o SIZE_US_LEGAL US Legal (8.50 inches x 14.00 inches or 612 units x 1008 units) o SIZE_ISO_A4 ISO A4 (8.27 inches x 11.69 inches or about 595 units x 841 units) o SIZE_US_ENV_NO_10 US Envelope No. 10 (9.5 inches x 4.125 inches or 684 units x 297 units) o SIZE_ISO_ENV_DL ISO Envelope DL (8.66 inches x 4.33 inches or about 624 units x 312 units) Ausrichtung: o ORIENTATION_LANDSCAPE o ORIENTATION_PORTRAIT Beispiel 4 : Erstellen einer Seite mittels Thentech PDFxPage page = new PDFxPage(); page = document.createPage(PDFxPanel.SIZE_ISO_A4, PDFxPanel.ORIENTATION_PORTRAIT); Dieses Beispiel erzeugt eine neue Seite im PDF Dokument. Die Größe der Seite ist A4 und die Ausrichtung Portrait. 2.2.3.2 Metainformationen Die PDFxDocument Klasse bietet die Möglichkeit, Metainformationen zu verwalten. Zu den Metainformationen, die mittels Thentech, verwaltet werden können gehören: Autor Titel Thema Schlüsselworte Die Informationen werden über folgende Funktion eingebunden: setInfo(String author, String title, String subject, String keywords) Seite 20 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Beispiel 5 : Einfügen von Metainformationen mittels Thentech document.setInfo("Tom Koenig","Erzeung von PDF Dokumenten","PDF Dokumente","PDF"); Neben diesen Informationen, die das Dokument im allgemeinen betreffen, werden nun folgend die Möglichkeiten aufgezeigt, Inhalte wie Text, Bilder etc. an ein PDF Dokument zu binden. Die Inhalte werden in Thentech mittels der PDFxPage-Klasse verwaltet. Im folgenden werden nun einige Methoden dieser Klasse erläutert. 2.2.3.3 Einbinden von Text Text kann in Thentech mittels verschiedener Methoden eingebunden werden. Die meisten dieser Methoden sind nur in der Standard Edition verfügbar, werden also nicht in den Beispielen behandelt. Einige werden folgend kurz angesprochen. Die einzige Methode um Text mittels der Limited Freeware Edition einzufügen ist: drawText(double x, double y, String text) Beispiel 6 : Anzeigen von Text in Thentech page.drawText(100, 100, "Hello World"); In diesem Beispiel wird der Text Hallo Welt an der Position 100,100 auf der Seite angezeigt. Die Methode drawText ist nur auf kurze Sätze, nicht aber auf einen Absatz zugeschnitten, da der Text am Seitenende nicht automatisch umgebrochen wird. Sichtbar ist nur der Teil des Textes, der auf die Breite einer Seite passt. Dieses Problem wird aber in der Standard Edition mittels folgender Methode gelöst: drawTextArea Diese Methode hat drei mögliche beispielhaft dargestellt wird: Ausprägungen, von der folgend eine drawTextArea(double x1, double x2, double yStart, String text) Diese Funktion bietet die Möglichkeit zwei x Werte anzugeben mittels welcher ein in der Breite beschränkter Kasten aufgezogen wird, der sich je nach Textlänge dynamisch in der Höhe ändert, wie in der folgenden Abbildung veranschaulicht: Seite 21 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Abbildung 5 : Methode drawTextArea Es sei noch angemerkt, dass die Methode drawTextArea auch die Ausrichtung des Textes beeinflussen kann. Beispiele zu diesen Themen und zur Funktion drawTextArea im allgemeinen sind nicht möglich, da die Limited Freeware Edition diese nicht verarbeiten kann. Anwendungsbeispiel 2-1 befasst sich mit der Definition eines Textes im Rahmen der Möglichkeiten der LFE. 2.2.4 Anforderungen Die grundsätzlichen Elemente des Thentech PDF Treibers wurden in den vorherigen Abschnitten erläutert. Die folgenden Abschnitte widmen sich der Analyse der an die PDF-Werkzeuge gestellten Anforderungen. 2.2.4.1 Formatierung des Textes Thentech bietet nicht die Möglichkeit, einen String direkt mit einem Font zu versehen. In Thentech setzt der Benutzer global für das Dokument eine neue Formatierung und jeglicher anschließend eingefügte Text, wird mit den zu diesem Zeitpunkt geltenden textuellen Einstellungen versehen. Das Setzen einer neuen Schriftart wird über folgende Methode der PDFxContextKlasse realisiert: setFont(PDFxFont font, double fontPointSize) Die Parameter der Methode sind einerseits die Schriftgröße in Punkten und andererseits die neue Schriftart. Die neue Schriftart font, ein Objekt der PDFxFont-Klasse, wird über folgende Methode der PDFxDocument-Klasse gesetzt: createBaseFont(int handle) Diese Methode liefert als Rückgabewert ein Objekt der PDFxFont-Klasse. Der Parameter der Methode, ein sogenanntes Handle ist ein vordefinierter Wert, der die Schriftart angibt und folgende Ausprägungen annehmen kann: Seite 22 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten COURIER COURIER_BOLD COURIER_OBLIQUE COURIER_BOLD_OBLIQUE HELVETICA HELVETICA_BOLD HELVETICA_OBLIQUE HELVETICA_BOLD_OBLIQUE TIMES_ROMAN TIMES_BOLD TIMES_ITALIC TIMES_BOLD_ITALIC SYMBOL ZAPFDINGBATS Das Rückgabeobjekt kann als Parameter an die oben erwähnte setFont Methode übergeben werden. Im folgenden ein kurzes Beispiel, das den Einsatz der Methoden veranschaulicht und TIMES_BOLD als Schriftart setzt. font = document.createBaseFont(TIMES_BOLD) ; context.setFont(font,10.0); Anwendungsbeispiel 2-1 erläutert den Einsatz dieser Funktionen umfassend. Neben der Schriftart und der Schriftgröße kann mittels Thentech auch die Farbe der Schrift verändert werden. Dies wird mittels der PDFxContext-Klasse realisiert: setFgColor(Color color); Der Parameter ist ein Objekt der Klasse Color aus dem Java Klassenpaket das wie in folgendem Beispiel verwendet werden kann: document.setFgColor(new Color(255, 0, 0)); Die Farbe wird hier auf rot gesetzt. 2.2.4.2 Strukturierung des Dokumentes Thentech bietet nur die Möglichkeit die Seiten eines Dokumentes zu verwalten, eine weitere Ebene der Granularität ist hier nicht vorgesehen. In diesem Bereich kann Thentech die gestellten Anforderungen nicht erfüllen. 2.2.4.3 Graphiken Das Einbinden von Graphiken und Bildern ist in Thentech für folgende Formate vorgesehen: Seite 23 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten JPG GIF PNG Um ein Bild anzuzeigen, muss vorab das Bild mittels folgender Methode der PDFxDocument-Klasse geladen werden: document.createImage(String filename) Um das Bild anzuzeigen wird die Methode drawImage der PDFxPage-Klasse aufgerufen: document.drawImage(double x, double y, double width, double height, PDFxImage image) Beispiel 7 : Einbinden einer Graphik mittels Thentech image=document.createImage("pencil.gif"); context.drawImage(100,100,100,100,image); Dieses Beispiel zeigt die Graphik pencil.gif an der Position 100,100 auf der gewünschten Seite an. Die Breite und die Höhe des Bildes können individuell gesetzt werden. Folgender Screenshot zeigt ein PDF Dokument mit Graphik das mittels Thentech erstellt wurde: Abbildung 6 : Screenshot Thentech Seite 24 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Das Einbinden von Graphiken ist mittels Thentech einfach, wie auch an obigem Beispiel zu sehen ist. Wenige Zeilen genügen hier, um eine Graphik auf einer Seite an einer beliebigen Position anzuzeigen. 2.2.4.4 Tabellen Die Unterstützung zur Generierung von Tabellen ist in Thentech nicht vorgesehen. In den PDF Dokumenten, die das Unternehmen als Beispiel auf der Webseite präsentiert [Tho01], sind Tabellen-Konstrukte dargestellt. Diese wurden aber bei Betrachtung des Java Quelltextes mittels Linien gezeichnet. Diese Art der Tabellengenerierung ist aber extrem umständlich und vor allem zeitintensiv, so dass Thentech in diesem Bereich die gestellte Anforderung nicht erfüllen kann. 2.2.4.5 Importieren von einzelnen HTML Seiten Thentech kann keine HTML Seiten einlesen, ist somit für diese Anforderung ungeeignet. 2.2.4.6 Dauer Die Zeit wird wie bei iText anhand der erwähnten Anwendungsbeispiele 2-1 und 2-2 ermittelt. Beide Anwendungsbeispiele erzeugen Dokumente, deren Umfang bis zu zwei Seiten beträgt. Die Dauer beträgt jeweils nur wenige Sekunden. Das Ergebnis ist als sehr gut zu werten. 2.2.4.7 Komplexität Thentech liefert in der Limited Freeware Edition nur die Java API Dokumentation als Referenz, jegliche weitere Dokumentation wird nur in Verbindung mit dem Erwerb einer kostenpflichtigen Ausgaben ausgeliefert. Der Aufbau eines Dokumentes ist klar und verständlich. Probleme bereiten die nicht vorhandene oder schlechte Beschreibung einiger Funktionen in der Java API Dokumentation. Mittels Thentech ist das Erstellen eines Dokumentes aber sehr einfach möglich und stellt den Benutzer vor wenig Probleme. 2.2.4.8 Kosten Thentech muss kostenpflichtig bezogen werden, falls ein professioneller Einsatz angestrebt wird. Die Kosten belaufen sich auf $250 oder $1500 für die Standard Edition respektive die Enterprise Edition. Diese Beträge können nicht als minimale Kosten angesehen werden, so dass iText in diesem Bereich auch negativ abschneidet. Seite 25 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 2.3 PDFlib 2.3.1 Beschreibung PDFlib ist ein Werkzeug zur Unterstützung der Entwicklung PDF gestützter Applikationen. Das Werkzeug bietet dabei zahlreiche Schnittstellen an, auf die der Entwickler zugreifen kann, um ein PDF Dokument zu erzeugen: Java C C++ Perl PHP ActiveX/COM RPG Python TCL (Tool Command Line) Neben dem Erstellen von PDF Dokumenten ist auch das Bearbeiten bereits bestehender Dokumente mittels des PDI Zusatzwerkzeuges möglich. Im folgenden wird nun die Analyse von PDFlib mittels der Java Schnittstelle durchgeführt und beschrieben. 2.3.2 Aufbau eines PDF Dokumentes PDFlib stellt nur eine Klasse zur Verfügung, mittels welcher PDF Dokumente erzeugt und verwaltet werden. Alle Methoden, die im folgenden Abschnitt beschrieben werden, beziehen sich also auf die PDFlib Klasse: PDFlib document = new PDFlib() : Die Datei zu einem PDFlib Objekt wird folgendermaßen erzeugt: pdf.open_file(String filename); Nachdem die Datei erzeugt wurde, können dem Dokument nun Inhalte und Informationen hinzugefügt werden. 2.3.2.1 Grundlegende Eigenschaften In PDFlib lässt sich nur eine Information verwalten die das Dokument allgemein betrifft - nämlich die Seitengröße. Die Seitengröße wird beim Anlegen einer neuen Seite angegeben und bezieht sich nur auf diese Seite: document.begin_page(float width, float height) Seite 26 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Die Parameter width und height geben die Breite und Höhe der Seite in Punkten an. Folgende Tabelle aus der PDFlib API präsentiert alle Seitenformate übersichtlich mit Angabe der Breite und Höhe in Punkten: Format width height Format width height A0 2380 3368 A6 297 421 A1 1684 2380 B5 501 709 A2 1190 1684 letter 612 792 A3 842 1190 legal 612 1008 A4 595 842 ledger 1224 792 A5 421 595 11x17 792 1224 Tabelle 3 : Angabe der Seitenmaße (in Pt) für verschiedene Seitenformate Eine Angabe der Ausrichtung der Seite wird von PDFlib nicht direkt über den Einsatz zweier Konstrukte wie Portrait und Landscape festgelegt, sondern ebenfalls wie die Seitengröße über die Parameter width und height. Eine Angabe von width > height entspricht der Ausrichtung Landscape, width < height entspricht Portrait. 2.3.2.2 Metainformationen Die Verwaltung von Metainformationen zu einem Dokument ist über PDFlib auch möglich; folgende Informationen können einem Dokument zugewiesen werden: Thema (Subject) Titel (Title) Urheber (Creator) Autor (Author) Schlüsselworte (Keywords) frei definierbar (alles außer CreationDate und Producer) In PDFlib werden Metainformationen sowie andere Informationen und Parameter über ein spezielles System gesetzt. Die Methode, mit welcher die obigen Informationen gesetzt werden, ist: document.set_info(String key, String value); In PDFlib werden Informationen häufig über diese Schlüsselwerte gesetzt, als Parameter für die Methode wird der Schlüssel, z.B. "Title" übergeben und als zweiter Parameter der Wert, den der Schlüssel annehmen soll. Die Schlüssel sind für die Metainformationen in Klammern oben angegeben. Seite 27 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Beispiel 8 : Verwalten von Metainformationen mittels PDFlib document.set_info("Author","Tom Koenig"); document.set_info("Title","Erzeugung von PDF Dokumenten"); document.set_info("Subject","PDF Dokumente"); document.set_info("Keywords","PDF"); 2.3.2.3 Einbinden von Text An dieser Stelle wird kurz das Koordinatensystem erläutert, das PDFlib und somit dem Dokument und den jeweiligen Seiten zugrunde liegt. Der Ursprung des Koordinatensystems ist in der linken unteren Ecke des Bildschirms und nicht wie bei den meisten Systemen links oben. PDFlib bietet hier Abhilfe, da es dem Benutzer ermöglicht diesen Koordinatenursprung zu verändern. In nachfolgendem Beispiel wird der Ursprung nach links oben verlegt. Beispiel 9 : Koordinatenursprung in PDFlib ändern document.begin_page(width, height); document.translate(0, height); document.scale(1, -1); document.set_value("horizscaling", -100); Dieses Beispiel reicht jedoch noch nicht völlig aus, um auch den Text richtig darzustellen, hier muss bei der Schriftformatierung die Schriftgröße negativ angegeben werden, da sonst der Text auf dem Kopf steht. Wie man bereits feststellen kann, ist dies nicht ganz unproblematisch und einfach, was also durchaus zu Problemen führen kann. Das Einbinden von Text wird in PDFlib über zwei Methoden ermöglicht (show und show_boxed), die in verschiedenen Ausprägungen vorhanden sind. Der Einsatz der Methoden hängt von der Art des Textes ab, der dargestellt werden soll. Handelt es sich bei dem Text um ein paar Wörter, also einen kurzen Satz, kann dieser über die show Methode eingebunden werden. Soll jedoch ein ganzer Abschnitt eingefügt werden, in dem der Text automatisch umgebrochen wird, muss die Methode show_boxed verwendet werden, da die Methode show jeglichen Text, der über eine Zeile hinaus geht nicht mehr sichtbar einfügt. Methode show document.show(String text) document.show(String text, float x, float y) Erstere Ausprägung setzt den als Parameter übergeben Text an der aktuellen Position. Die aktuelle Textposition kann mittels folgender Funktion gesetzt werden: document.set_text_pos(float x, float y); Seite 28 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Die zweite Ausprägung setzt den als Parameter übergebenen Text an die als Parameter übergebene Position. Wenn ein Text mittels show gesetzt wurde und in der nächsten Zeile ein weiterer folgen soll, müssen nicht die exakten x, y Werte geschätzt werden, hier kann die Methode continue_text angewendet werden: document.continue_text(String text); Der Text wird bei Anwenden dieser Methode in der nächsten Zeile an der gleichen x Position wie der vorangegangene Text gesetzt. Diese Methode kann nur angewendet werden, wenn keine Formatierung des Textes nach Einfügen der ersten Zeile erfolgt. Methode show_boxed document.show_boxed(String text, float x, float y, float width, float height, String mode, String feature); Der anzuzeigende Text wird in einem aufgezogenen Rechteck umgebrochen und dargestellt. Anders als im vorangegangen Abschnitt 2.2.3.3 für Thentech wird dieses Rechteck nicht dynamisch in y Richtung größer, die Höhe des Rechtecks muss angegeben werden. Die folgende Abbildung veranschaulicht die Funktionsweise: Abbildung 7 : Funktionsweise von show_boxed Die Höhe, die der Text einnehmen wird, muss abgeschätzt werden, was die Berücksichtigung mehrerer Faktoren erfordert. Die Breite des Rechtecks, sowie auch die Schriftgröße spielen hier eine große Rolle. Diese Art der Textdarstellung ist sehr komplex und kann teilweise nur gelöst werden, in dem verschiedene Werte probeweise eingesetzt werden und so lange verändert werden, bis der Text so wie gewollt angezeigt wird. Seite 29 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 2.3.3 Anforderungen 2.3.3.1 Formatierung des Textes Die Formatierung eines Textes wird in PDFlib über zwei Funktionen abgewickelt: document.findfont(String fontname, String encoding, int embed); document.setfont(int font, float fontsize) Die Parameter für die Methode findfont sind einerseits der Name der Schrift, die Kodierung, sowie die Entscheidung ob Informationen über die Schriftart im PDF Dokument eingebettet werden (embed Wert=1). PDFlib muss, um Text einwandfrei auf der Seite positionieren zu können, auf metrische Informationen über Höhe und Breite der Schriftart zugreifen können. Die Kodierung kann aus folgender Liste ausgewählt werden: Kodierung Beschreibung winansi Windows code page 1252 macroman Standard Macintosh character set ebcdic builtin host EBCDIC code page 1047 (IBM AS/400, S/390) Original Kodierung Schriften für nicht-Text und nicht-Latein Text je nach eingesetzter Umgebung Tabelle 4 : Kodierungen der Schriftarten in PDFlib Für weitere Informationen bezüglich der Kodierung wird hier auf die PDFlib API Referenz verwiesen, diese ist Teil der zum Download angebotenen Version und befindet sich im doc Verzeichnis der Installation. PDFlib bietet in der Distribution einige Kern Schriftarten an, bei denen die metrischen Informationen bereits vorhanden sind, diese können als Parameter an die findfont Methode übergeben werden: COURIER COURIER-BOLD COURIER-OBLIQUE COURIER-BOLDOBLIQUE HELVETICA HELVETICA-BOLD HELVETICA-OBLIQUE HELVETICA-BOLDOBLIQUE TIMES-ROMAN TIMES-BOLD Seite 30 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten TIMES-ITALIC TIMES-BOLDITALIC SYMBOL ZAPFDINGBATS Die mittels findfont geladene Schrift kann dann als Parameter an die setfont Methode übergeben werden. Die Schriftart wird dann vom System, mit der angegebenen Schriftgröße (in Punkt) eingestellt. Beispiel 10 : Schriftart ändern in PDFlib int font= document.findfont("TIMES-BOLD","host",0); document.setfont(font,12); Die Angabe der Schriftgröße ist abhängig vom eingestellten BasisReferenzsystem. PDFlib unterstützt neben diesen Möglichkeiten Text zu formatieren noch drei weitere Angaben, einen Text zu unterstreichen, durchzustreichen und überzustreichen. Diese werden mittels der Methode set_parameter gesetzt. document.set_parameter(String key,String value); Der Parameter key kann folgende Ausprägungen annehmen: underline overline strikeout Der Parameter value ist entweder true oder false je nachdem, ob der Modus gesetzt werden soll oder nicht. Beispiel 11 : Text unterstreichen in PDFlib document.set_parameter("underline","true"); Ein weiterer Aspekt der Hervorhebung eines Textes ist die Farbe, die in PDFlib über die Methode setcolor gesetzt wird: document.setcolor(String type, String colorspace,float c1, float c2, float c3, float c4); Der Parameter type bestimmt für welchen Bereich die Farbe gültig ist, für den Füllbereich (fill), für das Auftragen eines Striches (stroke), oder für beides (both). Der Parameter colorspace gibt an welches Farbsystem verwendet wird um die Farbe anzugeben, je nach System werden dann die Parameter c1-c4 gesetzt: Seite 31 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten System c1 c2 c3 c4 gray grau 0 0 0 rgb rot grün blau 0 cmyk zyan magenta gelb schwarz spot punkt-farbe Farbtönung 0 0 pattern muster 0 0 0 Tabelle 5 : Farbsysteme in PDFlib Zu den beiden letzten Möglichkeiten spot und pattern werden die c1 Werte über zwei Methoden makespotcolor() und begin_pattern() gesetzt. Diese Methoden werden nicht weiter erläutert und können in der API Referenz eingesehen werden. Angemerkt sei, dass alle Werte für c1-c4 im Bereich 0-1 liegen müssen. Die Interpretation dieser Werte hängt vom benutzen System ab, das RGB System wird hier beispielhaft erklärt, die anderen Modi sind in der Referenz erläutert. Das RGB System interpretiert die Werte als additive Farben, ein Wert von 1 bedeutet die volle Intensität einer Farbe, 0 hingegen bedeutet, dass diese Farbe nicht zum Einsatz kommt. In folgendem Beispiel werden weiß, blau und rot gesetzt: Beispiel 12 : Farbe ändern in PDFlib document.setcolor("both","rgb",1,1,1,0); //weiss document.setcolor("both","rgb",0,0,1,0); //blau document.setcolor("both","rgb",1,0,0,0); //rot Im Bereich der Formatierung bietet PDFlib eine Vielzahl an Möglichkeiten einen Text hervorzuheben. Der folgende Screenshot veranschaulicht die Textformatierung mittels PDFlib: Seite 32 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Abbildung 8 : Screenshot PDFlib 2.3.3.2 Strukturierung des Dokumentes PDFlib bietet neben der Einteilung eines Dokumentes in Seiten keinerlei Möglichkeiten ein Dokument zu strukturieren. 2.3.3.3 Graphiken Die Methoden open_image_file und place_image bieten die Möglichkeit, Graphiken in ein PDF Dokument einzubinden. document.open_image_file(String type, String filename, String strparam, int intparam); document.place_image(int image, float x, float y, float scale); Die möglichen Bildformate die in PDFlib eingebunden werden können sind: png gif jpeg tiff Der Parameter type der open_image_file Methode muss einem dieser vier Parameter entsprechen. Über die Parameter strparam und intparam können zusätzliche Einstellungen erfolgen, diese können in der API Referenz eingesehen werden. Soll das Bild normal angezeigt werden müssen die Parameter auf "" und 0 gesetzt. Seite 33 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Beispiel 13 : Einbinden einer Graphik mittels PDFlib int pic=document.open_image_file("gif","machine.gif","",0); document.place_image(pic,100,600,1); Die Graphik wird mittels der Methode place_image an der Position x, y angezeigt, der erste Parameter verweist auf den Rückgabewert der jeweiligen open_image_file Methode. Der vierte Parameter gibt die Skalierung an, mittels welcher das Bild dargestellt wird, bei einem Wert von eins wird das Bild originalgetreu angezeigt. Die Position x, y bezieht sich bei der Anzeige auf die linke untere Ecke des Bildes Der Einsatz von Graphiken in PDFlib, insbesondere spezieller Formate wird in Anwendungsbeispiel 3-2 weiter vertieft. Eingehende Informationen die Methoden betreffend können der API Referenz zu PDFlib entnommen werden. 2.3.3.4 Tabellen Im Bereich der Erstellung von Tabellen bietet PDFlib keine Unterstützung. Es kann, wie auch für den Thentech PDF Treiber schon angemerkt wurde (siehe 2.2.2.4), nur auf das indirekte Erstellen einer Tabelle mittels Liniekonstrukten zurückgegriffen werden. Die Anforderung an eine einfache Unterstützung zur Generierung von Tabellen kann PDFlib also nicht erfüllen. 2.3.3.5 Importieren von einzelnen HTML Seiten Das Einlesen und Einbinden einer HTML Seite wird von PDFlib nicht unterstützt. 2.3.3.6 Dauer Bei einem Umfang von maximal zwei Seiten je Anwendungsbeispiel benötigt PDFlib nur wenige Sekunden um das betreffende PDF Dokument zu erstellen. Dieses Ergebnis wird als sehr gut bewertet. 2.3.3.7 Komplexität In einigen Bereichen sind die von PDFlib bereitgestellten Methoden zur Erzeugung gewisser Inhalte nicht einfach einzusetzen. Wie bereits bei der Analyse der Möglichkeiten zur Anzeige von Text angegeben, ist die Methode show_boxed nicht sehr intuitiv. Alle Vorgänge, die automatisiert werden könnten, wie das dynamische Vergrößern des Darstellungsbereiches in der Höhe, wird dem Benutzer überlassen, der mittels des Versuchsprinzips die optimale Darstellung seines Textes zu erzielen versucht. Der Einsatz eines Koordinatensystems mit Ursprung im linken unterer Punkt einer Seite ist im Vergleich zu StandardAnwendungen nicht sehr geschickt gewählt. Die Möglichkeiten, diesen Ursprung zu transformieren sind vorhanden, erfordern aber die Angabe angepasster Parameter bei einigen Methoden. Die setfont Methode erwartet z.B. einen Seite 34 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten negativen Wert bezüglich der Schriftgröße, um den Text korrekt anzeigen zu können. Das Kriterium der geringen Komplexität kann PDFlib nicht erfüllen, da einige Aspekte der PDFlib zu umständlich umgesetzt wurden. 2.3.3.8 Kosten Folgende Tabelle gibt Aufschluss über die Kosten die bei Einsatz von PDFlib anfallen. Es werden grundsätzlich zwei Einsatzgebiete unterschieden: der Einsatz der Software auf einem Server und der Einsatz von PDFlib in eigener Software, die vertrieben wird. Je nach Einsatzgebiet gelten folgende Preise: Einsatz der PDFlib auf einem Server Anzahl an Server CPUs Betrag 1 $1000 5 $3000 10 $4000 Tabelle 6 : Kosten für den Einsatz von PDFlib auf einem Server Erwerb der Verteilungslizenz Hier werden sogenannte "seat packs" vergeben die entscheiden, wie oft die entwickelte Anwendung vertrieben werden darf. Anzahl an seat packs Betrag 100 $1000 1000 $5000 Tabelle 7 : Kosten für den Erwerb der Verteilungslizenz für PDFlib Beide Tabellen geben Aufschluss darüber, dass PDFlib sehr kostenintensiv ist und das Kriterium einer minimalen Kostenstruktur nicht erfüllen kann. 2.4 retepPDF Das Werkzeug retepPDF, eine Java Bibliothek wird in dieser Arbeit nicht analysiert. Die Funktionalität reicht nicht aus um den gestellten Anforderungen Seite 35 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten zu genügen. Es können weder Bilder, noch Tabellen oder HTML Seiten eingebunden werden. 2.5 Etymon PJ Das Werkzeug Etymon PJ - ebenso wie retepPDF eine Java Bibliothek - wird in dieser Arbeit nicht analysiert. Die Funktionalität reicht wie bei retepPDF nicht aus, um den gestellten Anforderungen zu genügen. Es können weder Bilder, noch Tabellen oder HTML Seiten eingebunden werden. 2.6 FOP 2.6.1 Beschreibung FOP ist ein mittels Java entwickeltes Werkzeug, das die Erstellung von PDF Dokumenten ermöglicht. Im Gegensatz zu den bisher vorgestellten Tools wird in FOP das PDF Dokument nicht über Methoden einer Programmiersprache wie Java erzeugt. FOP erstellt PDF Dokumente auf Basis sogenannter Formatting Object Trees aus XSL/XML. Eine Datei, die einen solchen F.O. Baum enthält wird über das Werkzeug in eine PDF Datei konvertiert. XML, die Extensible Markup Language ist eine Auszeichnungssprache, die zur Annotation von Dokumenten im Web verwendet werden kann. XSL, die Extensible Style Language , ermöglicht es die Darstellung eines XML-Dokumentes zu beeinflussen. Die beiden folgenden Seminararbeiten befassen sich grob mit beiden Sprachen: [Tra00], [Koe00] 2.6.2 Aufruf FOP kann in mehreren Variationen ausgeführt werden. fop eingabe.fo ausgabe.pdf Oben angegebener Befehl ist die einfachste Variante fop aufzurufen, als Parameter benötigt das Werkzeug die Eingabe Datei mit Endung .fo, die den F.O. Baum enthält, sowie als Ausgabe den Namen der PDF Datei, die das konvertierte Dokument enthält. Für weitere Optionen, den Aufruf betreffend, steht folgende Referenz [FopR01] zur Verfügung. 2.6.3 Aufbau eines PDF Dokumentes Der Aufbau eines PDF Dokumentes wird indirekt über den Aufbau eines XSL-FO Baumes realisiert. Im folgenden wird die Struktur eines XSL-FO Dokumentes anhand eines Beispiels erläutert. Beispiel 14 : Einfaches XSL-FO Dokument <?xml version="1.0"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> Seite 36 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten <fo:layout-master-set> <fo:simple-page-master master-name="A4"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-name="A4"> <fo:flow flow-name="xsl-region-body"> <fo:block font-size="15pt" font-family="serif" lineheight="30pt"> XSL-FO Dokument </fo:block> <fo:block font-size="20pt" font-family="serif" lineheight="30pt" > Ein XSL-FO Dokument wird ... </fo:block> </fo:flow> </fo:page-sequence> </fo:root> Das fo:root Element ist wie der Name andeutet das Wurzel Element eines XSLFO Dokumentes. Ein fo:root Element enthält immer ein fo:layout-master-set und ein oder mehrere fo:page-sequence Elemente Mittels des fo:layout-master-set Elementes ist es möglich, verschiedene Seiten-Layouts zu erstellen, also die Darstellungsart einer Seite zu beeinflussen. Diese werden über das fo:simple-page-master Element angegeben. Als Parameter erwartet das Element den Namen des zu definierenden Layouts. Innerhalb dieses Elements können nun verschiedene die Seite betreffende Eigenschaften eingestellt werden. 2.6.3.1 Grundlegende Eigenschaften Die Grundeigenschaften können über das fo:simple-page-master Element verwaltet werden, zu diesen gehören: Seite 37 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Eigenschaft Beschreibung master-name Name des Layouts page-height page-width Höhe und Breite der Seite margin-top margin-bottom margin-left margin-right Ränder der Seite Tabelle 8 : Eigenschaften einer Seite Beispiel 15 : Erstellen eines Seitenlayouts in XSL-FO <fo:layout-master-set> <fo:simple-page-master master-name="A4" page-height="842pt" page-width="595pt" margin-top="0.5cm" margin-bottom="0.5cm" margin-left="0.5in" margin-right="0.5in"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> Die Angabe der einzelnen Attribute kann wie unterschiedlichen Einheiten (pt, cm, in) erfolgen. im Beispiel gezeigt in Die Angabe des Elements fo:simple-page-master Elements erlaubt es, das Layout einer Seite zu spezifizieren. Die Spezifikation besagt, dass der Inhalt den Umfang dieser Seite nicht überschreiten darf, also dass alle Inhalte auf diese eine Seite passen müssen. Bei manchen Parsern kann es zu Fehlern kommen, wenn der Umfang einer Seite überschritten wird. FOP erkennt dies nicht als Fehler. Wird der Umfang der Seite überschritten, generiert FOP eine neue Seite, auf der die restlichen Inhalte abgelegt werden. Will man der Spezifikation genau entsprechen, muss in diesem Fall das fo:repeatable-page-master-reference Element als Layoutvorlage verwendet werden. Die Anzahl der Seiten ist bei diesem Element unbegrenzt. Der Einsatz ist analog zum fo:simple-page-master Element. 2.6.3.2 Metainformationen Neben den obigen Eigenschaften, wurde bisher für jedes Tool die Möglichkeit der Verwaltung von Metainformationen untersucht. FOP stellt keine Möglichkeit bereit, diese Informationen an ein Dokument zu binden. Seite 38 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 2.6.3.3 Einbinden von Text Nach dem Erstellen eines oder mehrerer Layouts können nun Text, Grafiken etc. eingefügt werden. Beispiel 16 : Inhalte einfügen in XSL-FO Dokumenten <fo:page-sequence master-name="A4"> <fo:flow flow-name="xsl-region-body"> <fo:block font-size="15pt" font-family="serif" lineheight="30pt"> XSL-FO Dokument </fo:block> <fo:block font-size="20pt" font-family="serif" lineheight="30pt" > Ein XSL-FO Dokument wird ... </fo:block> </fo:flow> </fo:page-sequence> Das fo:page-sequence Element erstellt eine Seite, die das unter master-name angegebene Layout verwendet, das im fo:layout-master-set definiert wurde. Innerhalb eines fo:page-sequence Elements muss ein fo:flow Element definiert werden. Dieses Element beinhaltet den eigentlichen Inhalt, der dargestellt werden soll. Ein fo:flow Element besteht aus einem oder mehreren Elementen vom Typ fo:block, fo:table, fo:list-block etc. und verweist mittels der flow-name Eigenschaft auf den Teil der Seite, auf dem der Inhalt dargestellt werden soll. Die folgende Grafik veranschaulicht die Lage der 5 Bereiche : xsl-region-before xsl-region-after xsl-region-start xsl-region-end xsl-region-body Seite 39 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Abbildung 9 : Strukturierung einer Seite in FOP Das obige Beispiel stellt den Text also im mittleren Seitenbereich dar. Das Einbinden von Text erfolgt über die fo:block oder fo:inline Elemente, die im folgenden besprochen werden. Das fo:inline Element bindet den angegeben Text ein; ist das Ende einer Zeile erreicht wird, der Text umgebrochen und in der nächsten Zeile fortgesetzt. Ein wichtiges Merkmal dieser Art der Textsetzung ist der Textabschluss, der nicht mit einem Zeilenumbruch beendet wird. Der Cursor bleibt hier am letzten Zeichen stehen und der nachfolgend eingegebene Text wird an dieser Stelle fortgesetzt. Das fo:block Objekt verhält sich dem fo:inline Objekt sehr ähnlich, mit der Ausnahme, das am Ende einer Zeile ein Zeilenumbruch stattfindet. Beide Elemente bieten neben der allgemeinen Textdarstellung Möglichkeiten zur Texthervorhebung, sowie zur Textgliederung, die unter Abschnitt 2.6.4.1 erläutert werden. Neben dem fo:flow Element gibt es ein zweites Element, das fo:staticcontent Element, das benutzt werden kann, um beispielweise eine Kopf- oder Fußzeile zu erstellen. Dieses Element wird in Anwendungsbeispiel 6-5 erläutert. Seite 40 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 2.6.4 Anforderungen Im folgenden werden nun die Anforderungen an FOP analysiert. 2.6.4.1 Formatierung des Textes FOP bietet im Bereich der Textformatierung mehrere Möglichkeiten an. Das fo:block Objekt bietet die Möglichkeit, mittels Parameterangabe die Schriftart, die Schriftgröße, den Schriftstil sowie die Schriftdicke einzustellen. font-size font-family font-style Beispiel 17 : Textformatierung in XSL-FO <fo:block font-size="15pt" font-family="Helvetica" font-style="italic" font weight="bold"> ... </fo:block> Folgende Schriftarten stehen zur Verfügung: Courier Helvetica Times New Roman Symbol ZapfDingbats Im Bereich des Schriftstils gibt es folgende grundlegende Einstellungen: normal italic oblique reverse-normal reverse-oblique Die Schriftdicke nimmt folgende Werte an: 100, 200, ... 900 bold bolder lighter normal Seite 41 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Neben diesen Möglichkeiten zur Hervorhebung eines Textes existieren noch zwei weitere grundsätzliche Möglichkeiten. Das fo:inline Element stellt die Eigenschaft text-decoration zur Verfügung, die folgende Werte annehmen kann: none underline overline line-through blink Diese Eigenschaft bietet die Möglichkeit, Textelemente zu unterstreichen, überzustreichen oder durchzustreichen. Beispiel 18 : Text unterstreichen mittels XSL-FO <fo:inline text-decoration="underline"> unterstrichener Text </fo:inline> Die zweite Möglichkeit besteht in der farblichen Veränderung des Textes. Diese Veränderung wird über die Eigenschaft color des fo:inline Elements gesetzt. Beispiel 19 : Farbe ändern in XSL-FO <fo:inline color="green"> Dieser Text ist gruen </fo:inline> Neben diesen Möglichkeiten der Textformatierung stehen noch weitere zur Verfügung, die in Anwendungsbeispiel 6-1 näher erläutert werden. XSL-FO bietet die Möglichkeit der Absatzformatierung für einen mittels fo:block erstellten Absatz. Zu diesen Möglichkeiten zählen: Textausrichtung text-align (mit zentralen Ausprägungen) left (wird vom Parser als ungültig erkannt) right (wird vom Parser als ungültig erkannt) center justify Folgende Graphik veranschaulicht die weiteren Eigenschaften, die verändert werden können. Zu diesen zählen die Ränder (margin), das "padding", also der Abstand zwischen der Textbox und dem Rand, sowie der Rand. Die Breite des Randes kann über border-before-width, border-after-width, borderleft-width, border-right-width angegeben werden. Seite 42 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Abbildung 10 : Eigenschaften für fo:block Element Neben diesen Eigenschaften gibt es noch zwei weitere: start-indent und endindent, die sich jeweils aus der Summe der Breiten von padding, border und margin ergeben. Alle diese Eigenschaften werden in Anwendungsbeispiel 6-1 näher erläutert. 2.6.4.2 Strukturierung des Dokumentes FOP bietet in diesem Bereich nur die Möglichkeit der Erstellung einer Seite. 2.6.4.3 Graphiken Das Einbinden von Bildern ist in FOP für die Formate GIF und JPEG vorgesehen. Die Grafik wird über das fo:external-graphic Element eingefügt. Beispiel 20 : Einbinden von Graphiken in XSL-FO Dokumente <fo:external-graphic src="audi.jpg"/> Der Einsatz von Bildern in FOP ist völlig unproblematisch und unkompliziert, da bereits eine Zeile zum Einbinden einer Graphik genügt. Seite 43 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Anwendungsbeispiel 6-2 erläutert das Einbinden von Graphiken näher. 2.6.4.4 Tabellen FOP unterstützt das Erstellen von Tabellen mittels des fo:table Elements. Folgendes Beispiel demonstriert den Einsatz des fo:table Elements. Beispiel 21 : Einfache Tabellendefinition in XSL-FO <fo:table space-after="1cm"> <fo:table-column column-width="50mm"/> <fo:table-column column-width="50mm"/> <fo:table-column column-width="50mm"/> <fo:table-body> <fo:table-row> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" textalign="center" font-weight="bold"> 1.Spalte 1.Zelle </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" textalign="center" font-weight="bold"> 2.Spalte 1.Zelle </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" textalign="center" font-weight="bold"> 3.Spalte 1.Zelle </fo:block> </fo:table-cell> </fo:table-row> </fo:table-body> </fo:table> Innerhalb des fo:table Elements muss mittels Angabe von fo:table-column Elementen die Spaltenanzahl der Tabelle angegeben werden. Die Anzahl an Spalten ist die einzige Größe die vor Einbinden der Tabelle bekannt sein muss. Nach Angabe der Spaltenanzahl wird das fo:table-body Element gesetzt. Innerhalb dieses Blocks wird der Inhalt der Tabelle spezifiziert. Die Tabelle wird erstellt, in dem eine neue Reihe angelegt wird, innerhalb welcher dann Zellen definiert werden. Eine Reihe wird mittels des fo:table-row Elements erstellt, die zugehörigen Zellen werden innerhalb dieses Blocks, wie im Beispiel oben zu sehen, mit dem fo:table-cell Element erstellt. Alle zum Einbinden einer Tabelle nötigen Elemente wurden aufgezählt, jedes dieser Elemente bietet aber die Möglichkeit, verschiedene die Tabelle betreffende Eigenschaften zu spezifizieren. Nun folgend werden einige zentrale Eigenschaften erläutert, weitere Eigenschaften und deren Spezifikation sind der folgenden Referenz zu entnehmen: [Har01] , Anwendungsbeispiel 6-3 Seite 44 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Eigenschaft Element Erklärung Beispiel colum-width fo:table-column Breite der Spalte 50mm border-width fo:table-cell Breite des Randes 0.5mm border-style fo:table-cell legt den Stil des Randes fest solid backgroundcolor fo:table-cell, fo:table-row, fo:tablecolumn Hintergrundfarbe des jeweiligen Elements red Tabelle 9 : Grundeigenschaften einer Tabelle Der folgende Screenshot stellt ein PDF Dokument dar, das mittels FOP erstellt wurde: Abbildung 11 : Screenshot FOP 2.6.4.5 Importieren von einzelnen HTML Seiten Das Importieren einzelner HTML Seiten wird seitens des FOP Werkzeuges nicht unterstützt. Seite 45 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 2.6.4.6 Dauer Die Dauer der Erstellung der Beispiele hält sich bei allen Beispielen, die im Umfang bis zu vier Seiten fassen, im Bereich bis zu 10 Sekunden. Dieses Ergebnis wird als sehr gut bewertet. 2.6.4.7 Komplexität Das Erstellen eines PDF Dokumentes setzt das Verständnis der F.O. Bäume voraus, die von der Komplexität her mit HTML Elementen vergleichbar sind. Einzig der Umfang eines XSL-FO Dokumentes kann bei größeren Dokumenten sehr schnell anwachsen und unübersichtlich werden. 2.6.4.8 Kosten FOP kann unter Einhaltung der Apache Software Lizenz [ApS99] kostenlos genutzt werden. 2.7 ClibPDF 2.7.1 Beschreibung ClibPDF, eine C-Bibliothek, ermöglicht das Erzeugen von PDF Dokumenten. Die Bibliothek kann in zwei Umgebungen eingesetzt werden: Erstellen ausführbarer C-Programme ClibPDF ermöglicht die Erstellung eines ausführbaren C Programms, das aufgerufen wird um, das zugehörige PDF Dokument zu erzeugen. Erstellen von CGI-Programmen ClibPDF bietet die Möglichkeit CGI (Common Gateway Interface) Programme zu erstellen, die zur dynamischen Erzeugung von PDF Dokumenten auf Web-Servern eingesetzt werden können. Im folgenden werden die Methoden und die verwendete Syntax, die beiden Umgebungen zugrunde liegt, vorgestellt. 2.7.2 Aufbau eines PDF Dokumentes Ein PDF Dokument wird in ClibPDF mittels der Struktur CPDFdoc abgebildet. Nahezu alle Operationen, die das Dokument betreffen erwarten diese Struktur als Übergabeparameter. Die Bibliothek enthält zwei Funktionstypen: optional benötigt Seite 46 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Es gibt fünf Funktionen, die in einem C Programm, das ClibPDF nutzt, vorkommen müssen. Folgendes Beispiel stellt einen minimalen Quelltext eines solchen C Programms dar. Beispiel 22 : Minimales C-Programm - ClibPDF #include "cpdflib.h" pdf = cpdf_open(0, NULL); cpdf_init(pdf); cpdf_pageInit(pdf, 1, PORTRAIT, A4, A4); cpdf_finalizeAll(pdf); cpdf_close(pdf); Im folgenden Teil werden diese fünf Grundfunktionen vorgestellt. 2.7.2.1 Grundlegende Eigenschaften In ClibPDF können sowohl die Seitenausrichtung, als auch die Seitengröße beeinflusst werden. Weiterhin können mittels der oben angegebenen Grundstruktur weitere dokumentenübergreifende Informationen verwaltet werden. Die Funktion CPDFdoc *cpdf_open(int mode, CPDFdocLimits *docLimits); muss zwingend die erste aufgerufene Funktion sein, da sie die CPDFdoc Struktur erzeugt. Der erste Parameter ist immer null (momentan unbenutzt), der zweite Parameter verweist auf eine CPDFdocLimits Struktur, die Informationen das Dokument betreffend (Seitenanzahl,... etc.) verwaltet. Die Struktur sieht wie folgt aus (in Klammern Standardwerte): typedef struct { int nMaxPages; int nMaxFonts; int nMaxImages; int nMaxAnnots; int nMaxObjects; } CPDFdocLimits; // // // // // (100) (180) (100) (100) (5000) Wird der Parameter bei Aufruf der cpdf_open Funktion auf NULL gesetzt, wird ein Dokument mit Standardwerten erzeugt. Die nächste Funktion void cpdf_init(CPDFdoc *pdf); initialisiert das Dokument. Unterschieden wird hier zwischen der Erzeugung eines Datenstroms in den Speicher oder der Erzeugung eines Datenstroms in eine Datei. Letztere Form wird bei vorhergehendem Aufruf der cpdf_setOutputFilename Funktion durchgeführt. Seite 47 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Die dritte Funktion void cpdf_pageInit(CPDFdoc *pdf, int pagenum, int rot, const char *mediaboxstr, const char *cropboxstr); ermöglicht es nun, die Seitenausrichtung als auch die Seitengröße zu setzen. Hier sind die Parameter rot, mediaboxstr, cropboxstr von Bedeutung. rot kann als mögliche Werte PORTRAIT LANDSCAPE annehmen und verwaltet somit die Ausrichtung einer Seite. Die beiden anderen Parameter beeinflussen die Seitengröße. Die Dokumentation hinsichtlich der Parameter ist unvollständig. Bei beiden handelt es sich um Strings, die vier Zahlen jeweils durch Leerzeichen getrennt enthalten müssen. Das letzte Zahlenpaar gibt die Breite und die Höhe der Seite an. Das erste Zahlenpaar wird nicht erläutert, diese sind in allen Beispielen auf Null 1. Neben dieser individuellen Angabe der Seitengröße wurden fünf vordefinierte Werte in die Bibliothek integriert: LETTER LEGAL A4 B5 C5 "0 "0 "0 "0 "0 0 0 0 0 0 612 612 595 499 459 792" 1008" 842" 708" 649" (Standard) Der Unterschied der beiden Parameter mediaboxstr und cropboxstr wird ebenfalls nicht erläutert, beide nehmen aber in Beispielen immer den gleichen Wert an (Siehe Beispiel 22). Der Parameter pagenum steht für die Nummer der Seite, auf die zuerst geschrieben werden soll. Nach Angabe der cpdf_pageInit Funktion, können folgend die Inhalte, wie Text, Graphiken,... etc. spezifiziert werden. Nach Abschluss des Dokumentes wird die Funktion void cpdf_finalizeAll(CPDFdoc *pdf); aufgerufen um den Datenstrom zu beenden. Alle allokierten Speicherressourcen werden abschließend wieder freigegeben: void cpdf_close(CPDFdoc *pdf); Für eine weitere Beschreibung steht die ClibPDF Dokumentation [FIOD99] zur Verfügung. Seite 48 1 E-Mail an Hersteller blieb unbeantwortet Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 2.7.2.2 Metainformationen Das Verwalten von Metainformationen ist in ClibPDF für folgende Daten möglich: Erzeuger Titel Subjekt Schlüsselworte Folgendes Beispiel veranschaulicht das Setzen der jeweiligen Information: Beispiel 23 : Verwalten von Metainformationen in ClibPDF void void void void 2.7.2.3 cpdf_setCreator(pdf, "ClibPDF"); cpdf_setTitle(pdf, "PDF Dokumente erstellen mit ClibPDF"); cpdf_setSubject(pdf, "dynamische PDF Generierung"); cpdf_setKeywords(pdf,"PDF,C"); Einbinden von Text ClibPDF bietet mehrere Funktionen und Funktionstypen an, die das Einbinden von Text ermöglichen. Jegliche Funktion, mit deren Hilfe ein Text eingebunden werden kann, muss innerhalb eines Blocks stehen, der durch folgende Funktionen aufgespannt wird: void cpdf_beginText(CPDFdoc *pdf, int clipmode); void cpdf_endText(CPDFdoc *pdf, ); Beispiel 24 : Einbinden eines Textes mittels ClibPDF cpdf_beginText(pdf, 0); cpdf_setFont(pdf, "Times-Italic", "WinAnsiEncoding", 16.0); cpdf_text(pdf, 1.6, 2.0, 0.0, "Hallo Welt"); cpdf_endText(pdf); ClibPDF unterscheidet grundsätzlich zwei Typen von Funktionen: "Convenience" Text Funktionen "Low Level" Text Funktionen Im Bereich der "Convenience" Textfunktionen bietet ClibPDF 4 Funktionspaare an, die das Setzen von Text ermöglichen. Im folgenden werden dieser 4 Funktionspaare vorgestellt und erläutert: void cpdf_text(CPDFdoc *pdf, float x, float y, float orientation, const char *textstr); void cpdf_rawText(CPDFdoc *pdf, float x, float y, float orientation, const char *textstr); Seite 49 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Das erste Funktionspaar stellt den mittels textstr übergebenen Text an der Position (x,y) dar (linke untere Ecke des Textes). Der Text kann dabei mittels des orientation Parameters (Angabe in Grad) rotiert werden. Zu erwähnen ist, das alle Funktionspaare jeweils immer aus einer _text und einer _rawtext Variante bestehen. Der Unterschied besteht hier in der Angabe der beiden (x,y) Positionsparameter, die je nach verwendeter Funktion unterschiedlich interpretiert werden. Sollen alle Elemente mittels des Punkt Koordinatensystems platziert werden, muss die jeweilige _raw Variante des Funktionspaares gewählt werden. Zweitere positioniert das Element im momentan aktiven Koordinatensystem. [FIOD99] Das zweite Funktionspaar ist: void cpdf_textAligned(CPDFdoc *pdf, float x, float y, float orientation, int alignmode, const char *textstr); void cpdf_rawTextAligned(CPDFdoc *pdf, float x, float y, float orientation, int alignmode, const char *textstr); Diese unterscheiden sich gegenüber dem ersten Paar nur in dem zusätzlichen Parameter alignmode. Dieser ändert die Ausrichtung des (x,y) Wertes am übergebenen Text. Bei obigem Funktionspaar war dieser Wert fest (linke untere Ecke des Textes), hier kann man nun aus neun vordefinierten Werten die Ausrichtung festlegen. Folgende Graphik veranschaulicht die verschiedenen Ausprägungen: Abbildung 12: Ausprägungen des orientation Parameters und ihr graphische Darstellung Während diese beiden Funktionspaare für die Angabe eines kurzen Textes, etwa einzelner Worte oder einem Satz konzipiert sind, können folgende beide Funktionspaare für die Angabe eines Absatzes verwendet werden. Seite 50 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten char *cpdf_rawTextBox(CPDFdoc *pdf, float xl, float yl, float width, float height, float angle, float linespace, CPDFtboxAttr *tbattr, char *text); char *cpdf_textBox(CPDFdoc *pdf, float xl, float yl, float width, float height, float angle, float linespace, CPDFtboxAttr *tbattr, char *text); Diese Funktionen spannen einen rechteckigen Bereich auf, in dem der angegebene Text dargestellt wird (siehe Abschnitt 2.3.2.3 – Abbildung 5). Mittels des angle Parameters ist ein Rotieren des Rechteckes möglich. Linespace spezifiziert den Abstand (in pt) zwischen zwei aufeinanderfolgenden Zeilen des Textes. Bei dem Parameter tbattr handelt es sich um eine CPDFtboxAttr Struktur, die wie folgt aussieht: typedef struct { int alignmode; int NLmode; float paragraphSpacing; int noMark; } CPDFtboxAttr; alignmode gibt die Ausrichtung des Textes an und kann vier Werte annehmen: TBOX_LEFT TBOX_CENTER TBOX_RIGHT TBOX_JUSTIFY Alle weiteren Attribute werden in Anwendungsbeispiel 7-1 beschrieben. Das vierte Funktionspaar stellt gegenüber obigen zwei zusätzliche Parameter bereit: float cpdf_rawTextBoxFit(CPDFdoc *pdf, float xl, float yl, float width, float height, float angle, float fontsize, float fsdecrement, float linespace, CPDFtboxAttr *tbattr, char *text); float cpdf_textBoxFit(CPDFdoc *pdf, float xl, float yl, float width, float height, float angle, float fontsize, float fsdecrement, float linespace, CPDFtboxAttr *tbattr, char *text); fontsize und fsdecrement (beide in pt) ermöglichen das Skalieren eines Textes. Der angegebene Text wird innerhalb des angegebenen Rechtecks dargestellt. Ist der Text (in Schriftgröße fontsize) allerdings zu groß, wird die Schriftgröße um den fsdecrement Faktor verringert. Diese Prozedur wird wiederholt, bis der Text in der aufgespannten "Box" angezeigt werden kann. Nach der Angabe der Funktionen des Typs "Convenience" werden im folgenden die Funktionen des Typs "Low Level" erläutert. Folgende Funktionen werden bereitgestellt: Seite 51 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten void void void void void void cpdf_setTextLeading(CPDFdoc *pdf, float leading); cpdf_setTextPosition(CPDFdoc *pdf, float x, float y); cpdf_rawSetTextPosition(CPDFdoc *pdf, float x, float y); cpdf_textShow(CPDFdoc *pdf, const char *txtstr); cpdf_textCRLFshow(CPDFdoc *pdf, const char *txtstr); cpdf_textCRLF(CPDFdoc *pdf); Die Funktion cpdf_setTextLeading ermöglicht das Setzen eines Freiraums zwischen Text und Seitenrand (Angabe in pt). Das Funktionspaar cpdf_settextposition, cpdf_rawSetTextPosition ermöglicht das Setzen des Textpositionscursors auf Position (x,y), die cpdf_textShow Funktion gibt dann den übergebenen Text an dieser Position aus. Mittels cpdf_textCRLFshow kann dann in der nächsten Zeile weiterer Text angegeben werden. Die letzte Funktion ermöglicht einen Zeilensprung. Anwendungsbeispiel 7-1 erläutert diese Funktionen im Detail. Weiterführende Informationen können auch der ClibPDF Dokumentation [FIOD99] entnommen werden. 2.7.3 Anforderungen 2.7.3.1 Formatierung von Text Die zentrale Funktion zur Textformatierung ist: int cpdf_setFont(CPDFdoc *pdf, const char *basefontname, const char *encodename, float size); Die Schriftgröße kann mittels size (in pt) angegeben werden. Die Schriftart kann mittels basefont gesetzt werden und nimmt einen der folgenden Werte an: Helvetica Helvetica-Bold Helvetica-Oblique Helvetica-BoldOblique Times-Roman Times-Bold Times-Italic Times-BoldItalic Courier Courier-Bold Courier-Oblique Courier-BoldOblique Symbol ZapfDingbats Seite 52 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Zusätzlich zu diesen Basis-Schriften bietet ClibPDF Möglichkeiten zum Einbinden weiterer Schriftarten, etwa Postscript Fonts, asiatische Schriften,... etc. Diese Möglichkeiten werden in [FIOD99] weiter erläutert. Der Parameter encoding (siehe Abschnitt 2.3.3.1 Tabelle 4) muss bei Auswahl einer Schriftart des Typs "Roman" folgende Werte annehmen: MacRomanEncoding MacExpertEncoding WinAnsiEncoding NULL Der Wert NULL stellt den builtin Status dar. Beispiel 25 : Text formatieren in ClibPDF cpdf_setFont(pdf, "Times-Bold", "WinAnsiEncoding", 20.0); Anwendungsbeispiel 7-1 erläutert diese Funktionalität und zeigt weitere mögliche Formen der Textformatierung auf. Der folgende Screenshot zeigt einige der Textformatierungsmöglichkeiten: Abbildung 13 : Screenshot ClibPDF Die farbliche Hervorhebung eines Textes wird in ClibPDF über die Funktion void cpdf_setrgbcolor(CPDFdoc *pdf, float r, float g, float b); Seite 53 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten gesteuert. Beispiel 26 : Setzen der Farbe Grün in ClibPDF cpdf_setrgbcolor(pdf,0.0,1.0,0.0); Die Funktion setzt die angegebene Farbe als Füllfarbe und auch als Pinselfarbe. Der Farbwert wird dabei über das RGB-System gesetzt. (siehe Abschnitt 2.3.3.1 Farbsysteme in PDFlib) Die Werte liegen für die r, g, b Parameter zwischen 0 und 1. Neben dieser Funktion besteht zusätzlich die Möglichkeit, die Füll- und Pinselfarbe getrennt zu setzen. ClibPDF ermöglicht die Farbgebung für diese beiden Bereiche mittels RGB- sowie auch mittels CMYK-Farbsystem [FIOD99]. 2.7.3.2 Strukturierung des Dokumentes Diese Anforderung erfüllt ClibPDF nicht, da es keine geeignete Funktionalität bereitstellt. 2.7.3.3 Graphiken Folgendes Funktionspaar ermöglicht das Einbinden von Graphiken in ClibPDF: int cpdf_importImage(CPDFdoc *pdf, const char *imagefile, int type, float x, float y, float angle,float *width, float *height, float *xscale, float *yscale, int gsave); int cpdf_rawImportImage(CPDFdoc *pdf, const char *imagefile, int type, float x, float y, float angle, float *width, float *height, float *xscale, float *yscale, int gsave); Beispiel 27 : Einbinden einer Graphik mittels ClibPDF cpdf_rawImportImage(pdf, "audi.jpg", JPEG_IMG, 70, 550, 0.0, &width, &height, &xscal, &yscal, 1); In Anwendungsbeispiel 7-2 werden die Parameter weiter erläutert. Hier wird nur der Parameter type kurz beschrieben. Die Werte für type sind: JPEG_IMG TIFF_IMG CPDF_IMG Die frei erhältliche Version von ClibPDF ist in diesem Bereich eingeschränkt, da sie nur JPEG Graphiken laden kann. Erst der Erwerb der kostenpflichtigen Premium Version erlaubt das Einbinden aller drei Graphiktypen. Letzterer (CPDF) ist ein von ClibPDF selbst bereitgestelltes Format. Seite 54 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Die Parameter width, height, xscale, yscale haben einen speziellen Charakter in ClibPDF, der in Anwendungsbeispiel 7-2 genau erläutert. 2.7.3.4 Tabellen Tabellen können in ClibPDF nicht generiert werden. Es besteht jedoch die Möglichkeit die angebotene Zeichenfunktionalität zu nutzen um so mittels Linien, Rechtecken,... etc. umständlich eine Tabelle zu erzeugen. Dies erfüllt jedoch die gestellte Anforderung nicht. 2.7.3.5 Importieren von einzelnen HTML-Seiten Das Einbinden einzelner HTML-Seiten wird nicht unterstützt. 2.7.3.6 Dauer Die Dauer der Erstellung liegt bei allen Anwendungsbeispielen unter zehn Sekunden, ein sehr gutes Ergebnis. 2.7.3.7 Komplexität Die Funktionalität des Werkzeuges ist sehr verständlich. Probleme bereitet an einigen Stellen die Dokumentation, die einige Parameter nur ungenügend oder gar nicht erläutert. ClibPDF kann, da das Erstellen eines PDF Dokumentes einfach ist, die gestellte Anforderung nach minimaler Komplexität erfüllen. 2.7.3.8 Kosten ClibPDF kann unter gewissen Umständen kostenlos genutzt werden. Weitere Informationen und detaillierte Lizenzbeschreibungen können folgenden Referenzen entnommen werden: [FIODL98], [FIOSA00]. Bei kostenpflichtiger Nutzung liegt folgende Kostenstruktur vor: Kosten Art der Nutzung $1000 Base ClibPDF commercial license pro Produkt oder pro IP-Adresse (Web-Server) $5000 unlimitierte Nutzung Tabelle 10 : Kostenstruktur ClibPDF Die Forderung nach minimalen Kosten kann ClibPDF bei kostenloser Nutzung erfüllen. Die Kostenstruktur bei kostenpflichtiger Nutzung kann die Anforderung jedoch nicht erfüllen. Seite 55 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 2.8 PrepTool - Java PDF Toolkit Glance stellt mit PrepTool eine Schnittstelle für C,C++ sowie Java bereit, um bestehende PDF Dokumente zu manipulieren oder PDF Dokumente zu erstellen. Das Java PDF Toolkit ist eine Erweiterung der PrepTool Java Schnittstelle und wird im folgenden die Basis der Analyse darstellen. Zu erwähnen ist hier, dass sich die zur Verfügung stehende Version (noch) im Beta Stadium befindet. 2.8.1 Beschreibung Das Java PDF Toolkit bietet eine vereinfachte Schnittstelle an, um Dokumente erzeugen zu können. Die Analyse beschränkt sich, wie in vorhergehenden Fällen auch, auf die Erzeugung von PDF Dokumenten. Bearbeiten von bestehenden Dokumenten wird nicht weiter erläutert, kann dem Handbuch zum Java PDF Toolkit entnommen werden [Glea01]. PDF den Das aber Der Aufbau eines PDF Dokumentes mittels des Java PDF Toolkit wird in folgender Abbildung veranschaulicht. Seite 56 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Abbildung 14 : PDF Dokumente erzeugen mittels Java PDF Toolkit Es gibt drei Klassen, die zur Verwaltung eines PDF Dokumentes beitragen: Generator, Template und Frame. Die Frame-Klasse stellt einen rechteckigen Bereich auf einer Seite dar, sie wird mittels folgendem Konstruktor erzeugt: Frame(String name, float X, float Y, float W, float H, int page); Das Koordinatensystem des Java PDF Toolkit hat den Ursprung in der linken unteren Ecke einer Seite. Die Positionsangabe X,Y eines Frame bezieht sich auf die linke untere Ecke des aufzuziehenden rechteckigen Bereichs. Ein Frame besitzt einen eindeutigen Namen und wird über page einer Seite zugeordnet. Der rechteckige Bereich wird mittels der x,y,w und h Parameter aufgezogen. Eine Frame wird nach Erstellung einem Template mittels folgender Methode zugeordnet: Seite 57 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten template.addFrame(Frame frame, Component component) Der Parameter component gibt dabei den Inhalt des Frame an und entspricht einer der folgenden Klassen: BarChart Bitmap Cell Chart Drawing MultiTable PieChart Row Table Text Einige dieser Klassen werden im weiteren Verlauf noch besprochen, für alle anderen wird auf die API Referenz des Java PDF Toolkit verwiesen [JPTA01]. Erwähnt sei an dieser Stelle, dass alle Komponenten, die im weiteren besprochen werden, mittels der addFrame-Methode oder einer ähnlichen Methode einem Frame zugeordnet werden müssen. Mittels der BTemplate-Klasse lassen sich so eine oder mehrere Seiten eines Dokuments erstellen. Die erstellten Templates werden anschließend über die Methode addTemplate(Template template) der Generator-Klasse zugeordnet, die dann mittels der generate() Methode das entsprechende PDF Dokument erstellt. Die BTemplate-Klasse wird nachfolgend verwendet, das Java PDF Toolkit stellt auch die Template-Klasse zur Verfügung, diese bietet aber weniger Funktionalität. Folgendes Beispiel stellt das Erstellen eines sehr einfachen PDF Dokumentes dar: Beispiel 28: Erstellen eines PDF Dokumentes BTemplate template1 = new BTemplate(); Frame frame1 = new Frame("Frame1",10,10,250,250,1); Text text1 = new Text("Hello World"); template1.addFrame(frame1,text1); Generator generator = new Generator("HelloWorld.pdf"); generator.addTemplate(template1); generator.generate(); 2.8.1.1 Grundinformationen Die BTemplate-Klasse bietet die Möglichkeit, die Seitenausrichtung sowie die Seitengröße zu setzen. Die BTemplate-Klasse bietet die setPagesize-Methode in zwei Variationen an: setPageSize(int pagesize) setPageSize(short width, short length) Seite 58 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Erstere Methode kann nur dann aufgerufen werden, wenn ein Dokument in Seitengröße A4 erstellt werden soll, folgende vordefinierte Werte können genutzt werden: PAGE_A4_PORTRAIT PAGE_A4_LANDSCAPE PAGE_CUSTOM Mittels dieser Werte kann nun für das A4 Dokument auch die Seitenausrichtung bestimmt werden. Letzterer Parameter wird für individuelle Seitenabmessungen verwendet, wobei in diesem Fall zweitere Variante der Funktion aufgerufen wird. Diese erlaubt es dann individuelle Werte für die Breite und Höhe der Seite zu spezifizieren und beeinflusst somit direkt die Seitenausrichtung. 2.8.1.2 Metainformationen Das Java PDF Toolkit stellt eine eigene Klasse zur Verwaltung von Metainformationen bereit. Die DocumentInfo-Klasse erlaubt folgende Informationen an ein Dokument zu binden: Autor Schlüsselworte Titel Thema Folgendes Beispiel zeigt den Einsatz der DocumentInfo-Klasse: Beispiel 29 : Metainformationen im Java PDF Toolkit DocumentInfo meta = new DocumentInfo(); meta.setAuthor("Tom Koenig"); meta.setKeywords("PDF,Java"); meta.setTitle("Java PDF Toolkit"); meta.setSubject("Erzeugung von PDF-Dokumenten"); generator.setDocumentInfo(meta); Folgender Screenshot zeigt, dass die Metainformationen korrekt im PDF Dokument übernommen werden: Seite 59 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Abbildung 15 : Screenshot Java PDF Toolkit Die DocumentInfo-Klasse wird über die setDocumentInfo-Methode Generator-Klasse an das Dokument gebunden. 2.8.1.3 der Einbinden von Text Das Java PDF Toolkit stellt die Text-Klasse zum Einbinden eines Textes zur Verfügung. Diese Klasse kann sowohl kurzen Text, wie auch Absatztext formatieren. Ein Text wird über den Konstruktor der Klasse gesetzt, dieser wird in drei Varianten angeboten, die umfangreichste Ausführung sieht wie folgt aus: Text(String plainText,Font defaultFont,float defaultLineSpacing) Der Font Parameter wird in Abschnitt 2.8.2.1 erläutert, der defaultlineSpacing Parameter gibt den vertikalen Abstand zwischen zwei aufeinanderfolgenden Zeilen an. Folgendes Beispiel erstellt einen Text mit Standard Einstellungen: Seite 60 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Beispiel 30 : Einbinden eines Textes mittels des Java PDF Toolkit Text text1 = new Text("Hello World"); 2.8.2 Anforderungen 2.8.2.1 Formatierung des Textes Wie in Abschnitt 2.8.1.3 erwähnt wurde, weist der Konstruktor der Text-Klasse einen Parameter defaultFont auf. Dieser kann genutzt werden, um einen Text mit einer bestimmten Formatierung zu erstellen. Die Font-Klasse bietet fünf Konstruktoren zur Erstellung eines Font-Objektes. Der detaillierteste Konstruktor sieht wie folgt aus: Font(String fontName,float fontSize,int align,int textColor) Die Parameter werden im folgenden ausführlich erläutert. Erstellt man eine Schrift unter Verwendung des Konstruktors Font(), werden folgenden Standard Einstellungen verwendet: Parameter Ausprägung Schriftart Helvetica Schriftgröße 10 Schriftfarbe Color.BLACK Schriftausrichtung ALIGN_LEFT Tabelle 11 : Standard Schrift-Einstellungen Die Schriftart wird mittels des Parameters fontName gesetzt, folgende Schriften stehen im Java PDF Toolkit zur Verfügung: Helvetica Helvetica-Bold Helvetica-Oblique Times-Roman Times-Italic Times-Bold Courier Courier-Oblique Courier-Bold Symbol ZapfDingbats Die Schriftgröße wird über den Parameter fontSize in Punkten angegeben. Seite 61 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Eine farbliche Hervorhebung des Textes, ist mittels des textColor Parameters möglich. Dieser erlaubt es, eine der fünf vordefinierten Farben zu setzen: Color.BLACK Color.WHITE Color.BLUE Color.GREEN Color.RED Anwendungsbeispiel 8-1 demonstriert das Einbinden eines farbigen Textes, erläutert zusätzlich Möglichkeiten, Text in einer nicht vordefinierten Farbe zu setzen. Die Textausrichtung eines Absatztextes kann mittels des align Parameters beeinflusst werden. Der Übergabewert kann aus vier vordefinierten Werten ausgewählt werden: FONT.ALIGN_LEFT FONT.ALIGN_RIGHT FONT.ALIGN_CENTER FONT.ALIGN_JUSTIF In Anwendungsbeispiel 8-1 werden alle erwähnten Möglichkeiten einen Text zu formatieren erläutert, zusätzlich werden noch weitere Möglichkeiten aufgezeigt. Es bleibt noch zu erwähnen, dass alle Parameter des Konstruktors auch über entsprechende Methoden der Font-Klasse gesetzt werden können [JPTA01]. Das Java PDF Toolkit bietet die Möglichkeit, innerhalb der Angabe eines Strings Formatierungseinstellungen anzugeben: <FONT:Font-Name;Size;Color>Text> Beispiel 31 : Textformatierung innerhalb eines Strings Text text1 = new Text("Dies ist ein <FONT:Courier;12;FF0000>neuer> Text") 2.8.2.2 Strukturierung des Dokumentes Eine Strukturierung des Dokumentes kann mittels des Java PDF Toolkit nicht vorgenommen werden, da eine dementsprechende Funktionalität nicht bereitgestellt wird. Seite 62 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 2.8.2.3 Graphiken Das Einbinden von Graphiken ist im Java PDF Toolkit vorgesehen, jedoch unterstützt das Werkzeug nur sogenannte "Device Independent Bitmaps" mit Endung .pdf. Die Integration des DIB - Image Import Werkzeuges von Glance ermöglicht eine Integration der JPEG und GIF Formate im Java PDF Toolkit. Eine Grafik wird mittels der Bitmap-Klasse eingebunden. Der Konstruktor sieht in seiner detailliertesten Form wie folgt aus: Bitmap(String bitmapFilename, int drawMode) Der Parameter bitmapFilename verweist auf den Dateinamen der einzubindenden Graphik, der zweite Parameter beeinflusst die Art und Weise, in der die Graphik angezeigt werden soll. Die Bitmap-Klasse stellt folgende vordefinierte Werte zur Verfügung: BITMAP.BITMAP_FIT BITMAP.BITMAP_BESTFIT BITMAP.BITMAP_SCALEX BITMAP.BITMAP_SCALEY BITMAP.BITMAP_DROP Die BITMAP_FIT Ausprägung bindet das Bild passend im angegebenen Frame ein, BITMAP_BESTFIT ist analog die Dimension des Bildes werden jedoch beibehalten. Bei BITMAP_SCALEX, BITMAP_SCALEY wird das Bild jeweils an die Breite oder die Höhe des Frames angepasst. Letztere Ausprägung stellt das Bild originalgetreu dar. Beispiel 32 : Einbinden einer Graphik mittels des Java PDF Toolkits Bitmap bild1 = new Bitmap("earth.jpg"); template.addFrame(frame1,bild1); Anwendungsbeispiel 8-2 demonstriert den Einsatz dieser Klasse. Probleme bereitet hier das GIF87 Format, das z.B. der Datei "vonnegut.gif" aus dem iText Package zugrunde liegt, alle anderen Formate (GIF89, JPG) werden problemlos angezeigt. Das Einbinden einer Graphik ist im Java PDF Toolkit somit einfach möglich (sofern das DIB - Image Import Werkzeug vorhanden ist). 2.8.2.4 Tabellen Das Erstellen einer Tabelle ist mittels folgender drei Klassen im Java PDF Toolkit möglich: Cell, Row, Table Seite 63 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Eine Zelle wird mittels der Cell-Klasse erstellt, diese kann dann über die addCell-Methode der Row-Klasse einer Reihe zugeordnet werden. Diese wird dann wiederum über die addRow-Methode der Table-Klasse, einer Tabelle zugeordnet. Die Cell-Klasse bietet wie in den Anwendungsbeispiel 8-3a sowie 8-3b aufgezeigt wird Möglichkeiten die Farbe des Hintergrunds, sowie des Rahmens, wie auch die Rahmendicke zu beeinflussen. Das Erstellen komplexer Tabellen, wie dies in iText möglich ist, unterstützt das Java PDF Toolkit nicht, da Eigenschaften wie "row spanning" und "column spanning" nicht vorhanden sind und somit reihenübergreifende, sowie spaltenübergreifende Zellen nicht möglich sind. Das Generieren einer Tabelle ist im Java PDF Toolkit einfach und verständlich umgesetzt worden. 2.8.2.5 Importieren von einzelnen HTML-Seiten Diese Funktionalität wurde im Java PDF Toolkit nicht berücksichtigt 2.8.2.6 Dauer Die Dauer der Erstellung eines PDF Dokumentes liegt bei allen Anwendungsbeispielen unter 10 Sekunden. Dieser Wert erfüllt die Anforderung nach minimaler Dauer der Erstellung. 2.8.2.7 Komplexität Die bereitgestellte Struktur ist einfach und verständlich. Das einzige Manko ist die Ausrichtung sämtlicher Positionierungs-Koordinaten an der linken unteren Ecke des jeweiligen Objektes, sowie der Koordinatenursprung in der linken unteren Ecke der Seite. Das Erstellen eines PDF Dokumentes stellt vom Standpunkt der Komplexität keine großen Probleme. 2.8.2.8 Kosten Die Kosten können nicht sehr genau abgeschätzt werden, da sich das Java PDF Toolkit zur Zeit noch im Beta Stadium befindet und noch nicht erworben werden kann. Die Kostenstruktur für die beiden zusätzlich benötigten Werkzeuge PrepTool und DIB - Image Import sieht wie folgt aus: Seite 64 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Werkzeug (Lizenz) Kosten (EURO) PDF Prep Tool, Developer License 400 PDF Prep Tool, Server License 400 PDF Prep Tool, Application License Image Import Tool for PT, Developer License Image Import Tool for PT, Server License Image Import Tool for PT, Application License 2000 100 100 500 Tabelle 12 : Kostenstruktur der Glance Werkzeuge Die Kosten können aus verschiedenen Gründen nicht genau abgeschätzt werden. Zum einen ist wie oben erwähnt wurde die Kostenstruktur für das Java PDF Toolkit nicht bekannt, zum anderen ist nicht ersichtlich welche zusätzlichen Werkzeuge erworben werden müssen. 2.9 Data2pdf Sanface stellt mit Data2pdf ein Werkzeug bereit, das es ermöglicht spezielle Textdateien zu interpretieren und in PDF Dokumente umzuwandeln. Das Werkzeug basiert auf der Funktionalität des Text2pdf Werkzeuges und ist mittels Perl entwickelt worden. 2.9.1 Aufruf data2pdf Eingabe.txt Ausgabe.pdf 2.9.2 Beschreibung Wie oben erwähnt wurde, handelt es sich bei Data2ppdf um einen Interpreter. Die Eingabe-Datei muss in einem speziellen Format vorliegen. Dieses Format wird mittels der Angabe von sogenannten "Tags" (ähnlich HTML) erzeugt. Ein Tag hat allgemein folgende Form #!tag# ... #!/tag# Data2pdf stellt verschiedene "Tags" bereit, mittels welcher Informationen und Inhalte spezifiziert werden können. Diese werden in Kategorien unterteilt, je nach dem, welchen Bereich des Dokumentes sie betreffen. Seite 65 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Abbildung 16 : Gliederung eines Dokumentes in Data2pdf Die Abbildung stellt die Gliederung eines Dokumentes aus Sicht des Werkzeuges dar. Diese Sicht spiegelt sich in der Aufteilung der "Tags" in selbige Bereiche wieder. Die Tags müssen in einer vordefinierten Reihenfolge innerhalb der Datei aufgerufen werden. Die Reihenfolge ergibt sich teilweise aus Abbildung 10 und wird in folgender Abbildung konkretisiert. Abbildung 17 : Abarbeitungsreihenfolge der Operatoren in Data2pdf Eine Data2pdf Datei muss in diesem Format angegeben werden. Seite 66 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 2.9.2.1 Grundinformationen Die Grundinformationen eines Dokumentes, die mittels Data2pdf spezifiziert werden können sind die Seitenausrichtung, das Seitenformat, das Layout einer Seite, sowie das Layout des Dokumentes. Diese Informationen werden im Bereich der document-Operatoren verwaltet. Die Ausrichtung der Seite kann mittels des Befehls #!landscape# beeinflusst werden. Der Standard Wert ist PORTRAIT und muss nur dann geändert werden, wenn das LANDSCAPE Format benötigt wird. Im Bereich des Seitenformats wird der Befehl #!paper# ... #!/paper# verwendet. Als Parameter können folgende Werte übergeben werden: letter (Standard) a3 a4 a5 width x height (in Punkten) Neben diesen Informationen können spezielle Informationen angegeben werden, die das Layout einer Seite oder aller Seite beeinflusst. #!bgdesign# … #!/bgdesign# #!design# … #!/design# Während bgdesign den Background-Operatoren zugeordnet ist und alle Seiten eines Dokumentes betrifft, ist design den page-Operatoren zugeordnet und spricht eine Seite speziell an. Beide Befehle akzeptieren als Parameter Elemente der PDF Spezifikation. Diese Elemente werden an dieser Stelle nicht weiter erläutert. Anwendungsbeispiel 9-1 erläutert einige Elemente beispielhaft, für alle weiteren Elemente kann die PDF Spezifikation (Teil der Data2pdf Dokumentation) hinzugezogen werden. 2.9.2.2 Metainformationen Data2pdf stellt verschiedene "Tags" zur Verfügung, die folgende Informationen verwalten können: Titel Autor Creator Key Subject Seite 67 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Folgendes Beispiel demonstriert den Einsatz der Befehle: Beispiel 33 : Einbinden von Metainformationen in Data2pdf #!title#Analyse des Data2pdf Werkzeuges#!/title# #!author#Tom Koenig#!/author# #!creator#Data2pdf#!/creator# #!keywords#PDF,Data2pdf#!/keywords# #!subject#Erzeugung von PDF Dokumenten#!/subject# Zu erwähnen ist noch, dass diese Operatoren dem Bereich der documentOperatoren zugeordnet sind. 2.9.2.3 Einbinden von Text Data2pdf unterscheidet zwei Typen von Text Hintergrundtext Text Hintergrund Text wird mittels des Background-Operators #!bgtext# … #!/bgtext# eingefügt. Normaler Seitentext wird mittels des Page-Operators #!text# … #!/text# eingebunden. Dieser Text wird mit folgenden Standardwerten gesetzt: Größe : Farbe : 10 Punkt Schwarz Beispiel 34 : Setzen eines Textes mittels Data2pdf #!text# Hello World! #!/text# Im folgenden werden nun die Anforderungen analysiert, dabei wird unter anderem erläutert, wie obige Standardwerte geändert werden können. Seite 68 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 2.9.3 Anforderungen 2.9.3.1 Formatierung von Text Data2pdf stellt mehrere Befehle zur Formatierung eines Textes bereit. Die Schriftart kann mittels des Befehls #!font#…#!/font# gesetzt werden. Dieser Befehl ist dem Bereich der document-Operatoren zugewiesen, bezieht sich also auf das gesamte Dokument. Mögliche Ausprägungen sind: Courier (Standard) Helvetica Times Die Größe der Schriftart (in pt) kann dann mittels #!fontsize#…#!/fontsize# geändert werden. Der Befehl gehört zu den Text-Operatoren und muss in einem Text Bereich aufgerufen werden. Eine weitere Hervorhebung des Textes kann durch Attribute, wie etwa fett, kursiv,... etc. erreicht werden. Diese Attribute können in Data2pdf auf zwei Arten spezifiziert werden: Fett - Kursiv - #!b#…#!/b# /F3 #!i#…#!/i# /F2 Fett-Kursiv - #!bi#…#!/bi# /F4 Der Unterschied beider Ausprägungen liegt in der Art des Aufrufes.Die erste Variante stellt drei "Tags" dar, welche in einem Textbereich eingesetzt werden können. Seite 69 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Die zweite Variante stellt einen PDF spezifischen Aufruf dar, der als Parameter dem folgenden Befehl übergeben werden kann: #!textcommand#…#!/textcommand# Der Befehl akzeptiert als Parameter die PDF Syntax. Nachfolgend werden einige Möglichkeiten dieses Befehls demonstriert, weitere können Anwendungsbeispiel 9-1 sowie der PDF Spezifikation entnommen werden. Allgemein hat ein Befehl der PDF Syntax folgende Struktur: Parameter1 ... Parametern Operator Texthervorhebung fontname size Tf fontname kann folgende Ausprägungen annehmen: /F1 /F2 /F3 /F4 /F5 /F6 Normal Italic Bold Bold-Italic Symbol ZapfDingbats Die Größe der Schriftart kann dann mittels size in Punkten angeben werden. Texteinschub leading TL Dieser Wert (in pt) erzeugt einen Leerraum (Größe entsprechend des angegebenen Werts) zwischen Text und Seitenrand. Farbe red green blue rg Die Textfarbe kann ebenfalls über den textcommand Operator geändert werden. Das zur Farbgebung verwendete System ist das RGB System, jedoch ist der Wertebereich für jede der drei Farben: 0-255 2.9.3.2 Strukturierung des Dokumentes Eine Strukturierung des Dokumentes kann mittels Data2pdf nicht durchgeführt werden, diese Anforderung ist somit nicht erfüllt worden. Seite 70 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 2.9.3.3 Graphiken Das Einbinden von Graphiken in Data2pdf ist mittels folgender Tags möglich: #!bgimage# image.jpg;width;height;a_cm;b_cm;c_cm;d_cm;e_cm;f_cm #!/bgimge# #!image#image.jpg;width;height;a_cm;b_cm;c_cm;d_cm;e_cm;f_cm#!/image# Die verschiedenen Parameter werden in Anwendungsbeispiel 9-1 erläutert. Hier wird noch darauf hingewiesen, dass nur Graphiken des Typs JPEG eingebunden werden können, dies geht aus der Versionsfunktionalität auf der Data2pdf Webseite hervor. In Anwendungsbeispiel 9-2 wurde beispielhaft versucht Graphiken des GIF-Typs einzubinden. In allen Fällen kam es jedoch zu einer Fehlermeldung. Das Einbinden einer JPEG Graphik kann mittels oberer Tags ohne Probleme erfolgen. Anzumerken ist, dass sowohl der Koordinatenursprung die linke untere Ecke einer Seite ist als auch der Ausrichtungspunkt der Graphik. Folgender Screenshot zeigt den Einsatz einer Graphik in einem mittels Data2pdf erstellten Beispieldokument: Abbildung 18 : Screenshot Data2pdf 2.9.3.4 Tabellen Die Unterstützung der Generierung von Tabellen wurde mit Version 2.2 eingeführt, konnte aber mit der zum Download bereitgestellten Version nicht Seite 71 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten untersucht werden, da es sich hier - wie nach Anfrage beim Hersteller bekannt wurde - nicht um die aktuelle Version des Werkzeugs handelt. 2.9.3.5 Importieren von einzelnen HTML-Seiten Das Importieren von Webseiten ist nicht möglich. 2.9.3.6 Dauer Die Dauer die zur Erstellung der Anwendungsbeispiele benötigt wurde führt zu einem sehr guten Ergebnis. Alle Anwendungsbeispiele waren unter 10 Sekunden erstellt. 2.9.3.7 Komplexität Die Funktionalität ist in einigen Bereichen nicht sehr verständlich. Besonders der Einsatz der PDF Syntax als Parameter einiger "Tags" führt zu einer erhöhten Komplexität. Die restlichen "Tags" allerdings sind einfach zu verstehen und anzuwenden. Die Anforderung an eine minimale Komplexität kann Data2pdf seitens des Einsatzes der PDF Syntax nicht erfüllen. 2.9.3.8 Kosten Es liegt keine Kostenstruktur vor, laut Herstellerangaben wird Data2pdf üblicherweise nicht vertrieben. Es wird in internen Projekten verwendet oder zur Erstellung kundenorientierter Leistungen eingesetzt. Es wird jedoch mit Hochdruck an diesem Projekt gearbeitet, ein entsprechendes Produkt soll in einiger Zeit auf dem Markt erscheinen. Seite 72 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 3. Vergleich der Werkzeuge 3.1 Grundfunktionalität Unter Grundfunktionalität werden hier gewisse grundlegende Funktionen bezüglich des Dokumentes (etwa Metainformationen), einer Seite (etwa Seitengröße, Ausrichtung), sowie das Einbinden eines Textes (Text, Absatztext) verstanden. Alle Werkzeuge erlauben es, die Seitengröße individuell zu spezifizieren (Breite x Höhe), dadurch wird auch das Angeben der Seitenausrichtung unterstützt. Einige Werkzeuge bieten vordefinierte Parameter, etwa A4 für die Seitengröße, oder PORTRAIT für die Seitenausrichtung. (iText, Thentech, ClibPDF, Java PDF Toolkit, Data2pdf) Die Möglichkeit Metainformationen einzubinden wird, mit Ausnahme von FOP, von jedem Werkzeug bereitgestellt. Im Bereich des Setzens von Text bietet jedes Werkzeug die Funktionalität sowohl kurzen, als auch längeren Text in Absatzform anzugeben. Thentech bietet diese Funktionalität, diese konnte aber nicht getestet werden, da sie in der zur Verfügung gestellten Version nicht integriert wurde. Die Angabe eines Absatztextes wird sehr unterschiedlich abgewickelt. FOP, Data2pdf und das Java PDF Toolkit stellen keine speziellen Funktionen bereit, Text wird immer mit der gleichen Methode eingebunden. iText stellt zwar eine eigene Klasse bereit, der Einsatz ist aber gegenüber den anderen Text Klassen identisch. Diese vier Werkzeuge bieten die beste und einfachste Funktionalität diesbezüglich. ClibPDF, PDFlib und Thentech bieten ebenfalls die Möglichkeit Absatztext einzubinden, jedoch ist die bereitgestellte Funktionalität wesentlich komplexer umgesetzt als bei obigen Werkzeugen. Im Bereich der Grundfunktionalität stechen drei Werkzeuge besonders hervor, da die Funktionalität einerseits einfach, andererseits aber umfassend ist; es handelt sich hierbei um iText, FOP und das Java PDF Toolkit. 3.2 Formatierung von Text Die Formatierung eines Textes wird von allen untersuchten Werkzeugen unterstützt, es gibt hier nur sehr geringe Unterschiede. Alle Werkzeuge ermöglichen es, die Schriftart, die Schriftfarbe und die Schriftgröße zu beeinflussen. Umgesetzt sind die jeweiligen Funktionalitäten zwar jeweils etwas anders, die folgenden Schriften stehen aber bei jedem Tool zur Verfügung: Helvetica Courier Seite 73 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Times Symbol ZapfDingbats Unterschiede gibt es jeweils nur bei der Texthervorhebung. Alle Werkzeuge unterstützen die Möglichkeit einen Text Fett, Kursiv oder Fett-Kursiv hervorzuheben. Einen Text unterstreichen kann man nur mit PDFlib, FOP und iText. 3.3 Strukturierung des Dokumentes Diese Funktionalität bietet von allen analysierten Werkzeugen nur iText. iText stellt die Klassen Chapter sowie Section bereit, mit denen ein Dokument mit einer buchähnlichen Struktur versehen werden kann. 3.4 Graphiken Die Anforderung beschränkte sich auf das Einbinden der Graphikformate JPEG und GIF mit dem entsprechenden Werkzeug. Das JPEG Format konnten alle Werkzeuge problemlos integrieren, nur beim GIF Format gab es Unterschiede. Die Werkzeuge Data2pdf, sowie ClibPDF erkennen das GIF Format nicht und ein Einbinden in das PDF Dokument ist nicht möglich. Die Werkzeuge iText und Java PDF Toolkit können nur spezielle Varianten des GIF Formats einlesen. Während iText nur das GIF87 Format erkennt und alle restlichen GIF Dateien nicht einbinden kann, verhält sich das Java PDF Toolkit genau anders. Es kann alle Formate einbinden, nur das Einbinden des speziellen Formats (wie es beispielsweise bei "vonnegut.gif" aus dem iText Package vorliegt) bereitet hier Probleme. 3.5 Tabellen Das Generieren einer Tabelle unterstützten folgende Werkzeuge: iText FOP Java PDF Toolkit Das Java PDF Toolkit ist nur in der Lage einfache Tabelle zu erstellen, während iText und FOP auch komplexere Tabellen mit reihen- und spaltenübergreifenden Zellen unterstützen. iText kann gegenüber FOP leichte Vorteile vorweisen, da die Funktionalität besser umgesetzt wurde. Seite 74 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 3.6 Importieren von einzelnen Webseiten Das Einbinden einer oder mehrerer Webseiten unterstützt keines der analysierten Tools. Diese Anforderung wird in Kapitel 4 weiter untersucht. 3.7 Dauer In diesem Bereich erfüllen alle Werkzeuge die gestellte Anforderung nach minimaler Erstellungsdauer. Keines der Werkzeuge kann hier besonders hervorgehoben werden. 3.8 Komplexität Die Anforderung nach minimaler Komplexität wird mit einigen Ausnahmen sehr gut erfüllt. Bei einigen Werkzeugen ist eine negative Bewertung auf die mitgelieferte Dokumentation zurückzuführen. Dies war der Fall bei Thentech, sowie auch bei Data2pdf und in einigen Bereichen der Dokumentation auch bei ClibPDF. Thentech lag nur ein Java API bei, Data2pdf lag zwar eine Dokumentation bei, diese ist aber nicht unbedingt als sehr umfangreich zu bezeichnen. Die Dokumentation zu ClibPDF ist an manchen Stellen unvollständig. Bei anderen Werkzeugen führt die Umsetzung der Funktionalität zu einem negativen Ergebnis. Probleme bereiteten vor allem die Werkzeuge, bei denen Objekte mittels x,y Positionsangaben eingebunden werden müssen. Das Positionieren der Elemente ist dann sehr ungewohnt und kann zumeist nur durch häufiges Ausprobieren gelöst werden (bis keine Überlappung mehr vorhanden ist). Bei iText und FOP können Objekte ohne Positionsangabe eingefügt werden, dies erlaubt zwar einerseits etwas weniger Flexibilität, andererseits ist das Einbinden der Elemente wesentlich einfacher. Bei einigen Werkzeugen, die mittels Positionierungsangaben arbeiten, wird der Koordinatenursprung in der linken unteren Ecke gewählt. Dies führt meist zu einer zusätzlichen Verwirrung. Ein weiterer Vorteil (neben der einfachen Platzierung) ist die Verwaltung der Seiten. iText, sowie FOP erlauben es, Seitenwechsel manuell einzufügen, bieten daneben die Möglichkeit diese automatisch durchzuführen sobald eine Seite gefüllt ist. Analysiert wurde auch die Aussagekraft der bereitgestellten Klassen, Methoden und Eigenschaften. In diesem Bereich schneiden alle Werkzeuge sehr gut ab, nur Data2pdf wird durch die Verwendung der PDF Syntax komplexer. In diesem Bereich kann man zwei Werkzeuge hervorheben, die in allen Bereichen eigentlich sehr gut abschneiden, FOP und iText. In punkto Dokumentation liegt beiden zwar im wesentlichen nur das Java API bei, dies wird aber durch eine zumeist selbsterklärende Funktionalität sowie einige Beispiele ausgeglichen. Die Umsetzung der Funktionalität ist in beiden Bereichen sehr gut gelungen. Seite 75 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 3.9 Kosten Die Forderung in diesem Bereich zielt auf minimale Kosten in Verbindung mit dem Einsatz des jeweiligen Werkzeuges. Die analysierten Werkzeuge lassen sich in zwei Gruppen aufteilen: kostenloser Einsatz unter Einhaltung der jeweiligen Lizenz kostenpflichtiger Erwerb bei Einsatz des Werkzeuges Den Werkzeugen Java PDF Toolkit und Data2pdf kann keine direkte Kostenstruktur zugeordnet werden, jedoch besteht kein Zweifel daran, dass beide Werkzeuge kostenpflichtig erworben werden müssen. Thentech und ClibPDF können unter Einhaltung gewisser Richtlinien kostenlos genutzt werden, jedoch bezieht sich diese Nutzung auf die funktional eingeschränkten Versionen. Inwieweit die Richtlinien eingehalten werden können ist den Referenzen [FIOD99], [FIODL98] sowie [ThoTT01] zu entnehmen. PDFlib, sowie auch Thentech und ClibPDF (bei nicht Erfüllung der Richtlinien) müssen zu Preisen von 250$ aufwärts bezogen werden, was der Anforderung in keinem Fall entspricht. Die beiden letzten Werkzeuge FOP und iText sind kostenlos. Beiden sind allerdings, bei Nutzung auch an Lizenzvereinbarungen gebunden die unter [Fsf91] oder [ApS99] eingesehen werden können. In diesem Bereich können nur iText und FOP die gestellte Anforderung erfüllen. 3.10 Gesamtvergleich Wie bereits aus den meisten der oberen Vergleiche bezüglich der Anforderungen hervorgeht sind zwei der neun behandelten Werkzeuge besonders hervorzuheben: iText FOP Neben einigen (geringen) Nachteilen, bei iText das Einbinden von GIF Graphiken, bei FOP das Einbinden von Metainformationen, sowie die Strukturierung des Dokumentes erfüllen beide alle restlichen Anforderungen. Der Vergleich beider Werkzeuge bezüglich der Anforderungen resultiert in einer leichten Präferenz des iText Werkzeuges, da es in gewissen Bereichen die Anforderungen jeweils leicht besser erfüllte. Die folgende Tabelle liefert einen Gesamtüberblick - hinsichtlich Erfüllung der gestellten Anforderung - aller Werkzeuge: Seite 76 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten iText Thentech PDFlib retepPDF Etymon PJ FOP ClibPDF Java PDF Toolkit Data2pdf Grundfunktionalität - - Formatierung eines Textes - - Strukturierung des Dokumentes - - - - - - - - Graphiken - - Tabellen - - - - - - - - - - - - - - - Dauer - - Komplexität - - Kosten - - - - Importieren einzelnen Webseiten von Tabelle 13 : Gesamtvergleich der Werkzeuge sehr gut gut ausreichend schlecht - sehr schlecht nicht verfügbar Tabelle 14 : Erklärung der Symbole Seite 77 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 4. Importieren von einzelnen HTML-Seiten Aus den vorhergehenden Kapiteln geht hervor, dass keines der analysierten Werkzeuge die Möglichkeit bietet, HTML Seiten an ein PDF Dokument zu binden. Folgend wird nun eine alternative Möglichkeit vorgestellt, die beabsichtigte Funktionalität bereitzustellen. Gefordert ist folgende Funktionalität: Eine oder mehrere HTML Seiten sollen zusammen mit bereits existierenden oder generierten PDF Dokumenten in ein einzelnes PDF Dokument eingebunden werden. Folgende Graphik veranschaulicht, wie diese Funktionalität nun integriert werden soll: Abbildung 19 : Einbinden einzelner HTML Seiten Seite 78 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Die HTML-Seiten werden durch das Werkzeug html2ps in Postscript Dateien umgewandelt. Diese werden dann mit einem bereits erzeugten PDF Dokument (mittels eines der Werkzeuge z.B. iText) oder einem bereits bestehenden PDF Dokument zu einem neuen PDF Dokument zusammen gebunden. Diese Funktionalität wird mittels Aladdin Ghostscript umgesetzt. Die Umsetzung der Funktionalität kann mittels einer Skript Datei erfolgen. Folgend werden beispielhaft Skript Dateien für den Einsatz unter Windows und Linux angezeigt. Folgende Dateien liegen vor: page1.html page2.html page3.html document.pdf Diese sollen nun zu einer Datei zusammengeführt werden: Linux html2ps page1.htm > p1.ps html2ps page2.htm > p2.ps html2ps page3.htm > p3.ps gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=p.pdf p1.ps p2.ps p3.ps document.pdf Windows perl html2ps page1.htm > p1.ps perl html2ps page2.htm > p2.ps perl html2ps page3.htm > p3.ps gswin32 -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=p.pdf p1.ps p2.ps p3.ps document.pdf Die Anforderungen der jeweiligen benutzten Werkzeuge werden in Anhang A Abschnitt 5.2.8 erläutert. 4.1 Eigenschaften von html2ps Es soll nun anhand von einigen HTML Seiten getestet werden, welche Elemente der HTML Sprache von html2ps unterstützt werden. Es werden drei Elemente überprüft: einfache Seite (mit Textformatierung) Tabellen Framesets Seite 79 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 4.1.1 einfache Seite (mit Textformatierung) Folgende HTML Seite ist Ausgangspunkt des Konvertierungsvorgangs: Das Postscript Dokument sieht nach Umwandlung mittels html2ps wie folgt aus: Die Positionen der Texte werden leicht versetzt, da bei dem Postscript Dokument Ränder nach links und rechts gesetzt werden. Desweiteren ist die Schriftfarbe, die im HTML Dokument rot war, nicht korrekt übernommen worden, so dass der Text in der Postscript Version schwarz erscheint. Sonst ist die Seite korrekt konvertiert worden. Seite 80 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 4.1.2 Tabellen Das zweite HTML Dokument enthält zwei Tabellen: Es wurde neben den beiden Tabellen eine Textformatierung hinsichtlich der Schriftart vorgenommen. Das Ergebnis von html2ps sieht wie folgt aus: Seite 81 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Wie beim ersten Beispiel bereits festgestellt wurde, wird auch hier erneut die Farbeinstellung ignoriert. Die Tabellen werden ohne Probleme übernommen. Jedoch wurde, ebenso wie die Farbe, auch die Einstellung der Schriftart ignoriert und die Standardschriftart verwendet. 4.1.3 Framesets Das dritte Dokument testet die Kompabilität von html2ps gegenüber Framesets. Das ursprüngliche Dokument sieht wie folgt aus: Seite 82 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Folgendes Dokument resultiert aus der Konvertierung mittels html2ps: html2ps kann also keine Framesets verwalten und erzeugt eine Postscript Seite, auf der der Standard Text für nicht Frame basierte Browser angezeigt wird. Die einfachen Elemente von HTML, wie Text, Tabellen werden ohne größere Layouteinbußen übernommen. Einige kleine optische Veränderungen sind allerdings erkennbar. Frames werden von html2ps nicht unterstützt. Seite 83 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 5. Anhang 5.1 Installation und Aufruf der Werkzeuge 5.1.1 iText 5.1.1.1 zugrunde liegende Version Version 0.41 5.1.1.2 Umgebung Microsoft Windows 98SE SUSE Linux 7.1 JDK1.3 5.1.1.3 Aufruf Folgende Aufrufe können verwendet werden um die Anwendungsbeispiele zu übersetzen: javac -classpath ...\iText.jar Beispielxx.java java -classpath .;...\iText.jar Beispielxx Die Position des Package iText.jar muss genau angegeben werden. 5.1.2 Thentech PDF Driver 5.1.2.1 zugrunde liegende Version ThentechTM PDF Driver 1.1.1 Freeware Edition for Java 5.1.2.2 Umgebung Microsoft Windows 98SE SUSE Linux 7.1 JDK1.3 5.1.2.3 Aufruf Folgende Aufrufe können verwendet werden um die Anwendungsbeispiele zu übersetzen: javac -classpath ...\tpdfd111fe.jar Beispielxx.java java -classpath .;...\ tpdfd111fe.jar Beispielxx Seite 84 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Die Position des Package tpdfd111fe.jar muss genau angegeben werden. 5.1.3 PDFlib 5.1.3.1 zugrunde liegende Version PDFlib V4.0.0 5.1.3.2 Umgebung Microsoft Windows 98SE SUSE Linux 7.1 JDK1.3 Es müssen für beide Plattformen unterschiedliche Packete heruntergeladen werden. Linux: http://www.pdflib.com/pdflib/download/pdflib-4.0.1-Linux.tar.gz Windows: http://www.pdflib.com/pdflib/download/pdflib-4.0.1-Windows.zip 5.1.3.3 Aufruf Folgende Aufrufe können verwendet werden um die Anwendungsbeispiele zu übersetzen: javac -classpath ...\pdflib.jar Beispielxx.java java -classpath .;...\pdflib.jar Beispielxx Die Position des Package pdflib.jar muss genau angegeben werden. 5.1.4 FOP 5.1.4.1 zugrunde liegende Version Version 0.19 5.1.4.2 Umgebung Microsoft Windows 98SE SUSE Linux 7.1 Seite 85 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten JDK1.3 Das Packet auf das sich die Analyse bezieht ist: xml-fop_20010628114943.tar.gz Folgende Adresse bietet jeweils die aktuellste Version: http://cvs.apache.org/snapshots/xml-fop/ Achtung: nicht jedes Packet enthält die Datei fop.bat. Der Aufruf bezieht sich sowohl folgend als auch im Analysedokument auf diese Datei. 5.1.4.3 Aufruf Folgender Aufruf kann verwendet werden um die Anwendungsbeispiele zu übersetzen: fop input.fo output.pdf 5.1.5 ClibPDF 5.1.5.1 zugrunde liegende Version Version 2.02-r1-1 5.1.5.2 Umgebung Microsoft Windows 98SE SUSE Linux 7.1 GCC Compiler (LINUX) MS VisualC++ 6.0 Autoren Edition (WINDOWS) Die Aufrufe sind für die Systeme verschieden, da verschiedene Compiler verwendet wurden. 5.1.5.3 Aufruf Windows - VisualC++ 6.0 Eine genau Spezifikation findet sich im ausgelieferten Package unter Readme.win32. Vorab muss die Übersetzung des Source-Codes in eine LIB Bibliothek-Datei erfolgen (siehe Readme). Die anschließende Compilierung der Beispiele läuft wie folgt ab: Projekt erstellen : Win Konsolenanwendung Dem Projekt hinzufügen -> Dateien Seite 86 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten clibpdf.h Beispielxx.c bibliothek.lib Projekt erstellen Linux - GCC Vorab muss die Bibliothek übersetzt werden, die dann alle ClibPDF Funktionen enthält. Das Übersetzen erfolgt anhand des Kommandos make und eines Makefiles. Die Datei Makefile.Linux muss umbenannt werden: Makefile.Linux in Makefile Anschließend muss eine Anpassung des Makefiles vorgenommen werden. Die folgenden drei Zeilen müssen auf das benutzte Linux System angepasst werden: INCLUDE_DIR=/usr/local/include LIB_DIR=/usr/local/lib BINDIR=/local/ClibPDF Sind diese Schritte abgewickelt kann die Bibliothek mittels folgender Aufrufe erstellt werden: make lib;make install Ist die Bibliothek installiert, können die Beispiele kompiliert und erstellt werden, in dem gcc mit folgenden Parametern aufgerufen wird: gcc -Wall -o Beispielxx Beispielxx.c -lcpdf -lm 5.1.6 Data2pdf 5.1.6.1 zugrunde liegende Version Version unbekannt 5.1.6.2 Umgebung Microsoft Windows 98SE 5.1.6.3 Aufruf Folgender Aufruf kann verwendet werden um die Anwendungsbeispiele zu übersetzen: data2pdf eingabe.txt ausgabe.pdf Es kann nur eine Windows Version des Werkzeuges bezogen werden. Seite 87 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 5.1.7 Glance Java PDF Toolkit 5.1.7.1 zugrunde liegende Version Version unbekannt 5.1.7.2 Umgebung Microsoft Windows 98SE Suse Linux 7.1 (Analyse nicht möglich siehe unten) Das Java PDF Toolkit benötigt mehrere Pakete zur einwandfreien Funktion: DIB - Image Import Evaluationsversion http://pdf.glance.ch/eval/DIB100Eval.zip Dieses Paket ist nur für Windows als Evaluationsversion verfügbar. Die Datei jpdib.dll muss in ein mittels Path referenziertes Verzeichnis installiert werden. PrepTool Evaluationsversion http://pdf.glance.ch/eval/PT221Eval.zip Dieses Paket existiert sowohl für Windows, als auch Linux zum Download. Obiger Link verweist auf die Windows Version, die Linux Version kann je nach benötigter Version unter http://pdf.glance.ch/eval/PT/Unix/ bezogen werden. Die Datei PDDIB muss in ein mittels Path referenziertes Verzeichnis installiert werden. Java PDF Toolkit Evalutionsversion (BETA) http://pdf.glance.ch/sample/ETK100E.zip Das eigentlich analysierte Werkzeug ohne Angabe zum Betriebsystem. Seite 88 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Da die gesamte Funktionalität getestet wurde, wurde hier das Betriebssystem Windows eingesetzt, da ansonsten einige Funktionalität (Graphiken) nicht getestet werden kann. 5.1.7.3 Aufruf Folgender Aufruf kann verwendet werden um die Anwendungsbeispiele zu übersetzen: javac -classpath ...PDFToolkit.jar;...PrepTool.jar Beispielxx.java java -classpath .;...PDFToolkit.jar;...PrepTool.jar Beispielxx Die Position der beiden Pakete PDFToolkit.jar und PrepTool.jar muss angegeben werden. 5.1.8 Ghostscript und html2ps Vorraussetzung für das Einbinden von HTML Seiten sind folgende Werkzeuge: Aladdin Ghostscript http://www.cs.wisc.edu/~ghost/ html2ps http://www.tdb.uu.se/~jan/html2ps.html In einer Linux Umgebung sind alle benötigten Werkzeuge installiert. In einer Windows Umgebung könnte es Probleme mit dem Werkzeug html2ps geben. Dieses benötigt eine installierte Version von perl um ausgeführt werden zu können. Je nach Einsatzgebiet wird ein Zusatzmodul, das das korrekte Einbinden von Bildern ermöglicht benötigt. Hier ist obige Webseite als Referenz zu nennen, dort sind weitere Referenzen und Erläuterung zu Werkzeugen zu finden, die eventuell benötigt werden. Seite 89 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Seite 90 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 5.2 Anwendungsbeispiele 5.2.1 iText 5.2.1.1 Anwendungsbeispiel 1-1 /** * * * * * */ Java Programm das den Einsatz von Text demonstriert @author @version @since Tom Koenig %I%, %G% JDK1.3 import java.awt.Color; import java.io.FileOutputStream; import java.io.IOException; import import import import com.lowagie.text.*; com.lowagie.text.html.HtmlWriter; com.lowagie.text.xml.XmlWriter; com.lowagie.text.pdf.PdfWriter; public class beispiel11 { /** * Klasse die den Einsatz von Text demonstriert * @since JDK1.3 */ public static void main(String[] args) { Seite 91 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Erstellen eines Dokumentes Document document = new Document(); try { // PDF-Dokument mit gewünschtem Dateiname anlegen. PdfWriter.getInstance(document, new FileOutputStream("beispiel11.pdf")); // Metainformationen an das Dokument binden document.addAuthor("Tom Koenig"); document.addSubject("Formatierung von Text mittels Java Bibliothek iText"); Font chapterFont = new Font(Font.HELVETICA, 24, Font.NORMAL, new Color(255, 0, 0)); Font sectionFont = new Font(Font.HELVETICA, 20, Font.NORMAL, new Color(0, 0, 255)); Font subsectionFont = new Font(Font.HELVETICA, 18, Font.BOLD, new Color(0, 64, 64)); // Dokument zum schreiben öffnen document.open(); // Kapitel erzeugen, der Methodenaufruf akzeptiert als Parameter den Text // der als Kapitelueberschrift dienen soll und als zweiten Parameter die // Kapitelnummer Chapter chapter = new Chapter(new Paragraph("Umgang mit Text",chapterFont),1); // // // // // Seite 92 Die Sektion wird dem Kapitel ueber addSection angehangt, der Methodenaufruf ist dem des Kapitels sehr aehnlich bis auf die Tatsache dass hier der 2. Parameter angibt wieviele Zahlen angegeben werden bei der Sektions numerierung, also die Tiefe der Numerierung, bei 2 waere es 1.1 bei 3 1.1.1 usw Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Section section = chapter.addSection(new Paragraph("Text Erzeugung",sectionFont),2); // Chunk erzeugen , es wird nach dem Fragment nicht in eine neue Zeile gewechselt Chunk chunk = new Chunk("Dies ist ein Chunk"); section.add(chunk); // Chunk erzeugen, in dem zusaetzlich noch ein Font gesetzt wird. chunk = new Chunk(",und dies hier ebenso nur mit Textformatierung",new Font.BOLD)); section.add(chunk); Font(Font.HELVETICA, 12, Font(Font.COURIER, 12, // Phrase erzeugen uebergeben wird nur ein String Phrase phrase = new Phrase("-Dies ist eine Phrase-"); section.add(phrase); // Zusaetzlich zum String wird hier noch ein Einrückanbstand definiert phrase = new Phrase(16, "-Dies ist eine Phrase mit Einrücken-"); section.add(phrase); // Phrase mit Textformatierung phrase = new Phrase("Dies ist eine Font.NORMAL, new Color(255, 0, 0))); section.add(phrase); Phrase mit Textformatierung", new // Phrase aus einem Chunk erstellt phrase = new Phrase(new Chunk("-Dies ist eine Phrase aus einem Chunk erstellt-")); section.add(phrase); // Paragraph erstellen Paragraph paragraph = new Paragraph("Dies ist ein Absatz"); section.add(paragraph); Seite 93 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Paragraph aus einem Chunk erstellt paragraph = new Paragraph(new Chunk("Dies ist ein Absatz aus einem Chunk erstellt")); section.add(paragraph); // Paragraph aus einer Phrase erstellt paragraph = new Paragraph(new Phrase("Dies ist ein Absatz aus einer Phrase erstellt")); section.add(paragraph); // Paragraph erstellen mit Textformatierung paragraph = new Paragraph("Dies Font.BOLD)); section.add(paragraph); ist ein Absatz mit Textformatierung",new Font(Font.HELVETICA, 16, // Sektion 2 // In dieser Sektion werden nun die einzelnen Moeglichkeiten dargestellt // die man fuer das Style Attribut setzen kann. section = chapter.addSection(new Paragraph("Text Formatieren",sectionFont),2); section.add(new Paragraph("In dieser Sektion werden die verschiedenen Formatierungsmodi die auf einen Text angewendet werden können demonstriert :")); section.add(new Paragraph("Dieser Text ist normal",new Font(Font.HELVETICA, 12, Font.NORMAL))); section.add(new Paragraph("Dieser Text ist fett",new Font(Font.HELVETICA, 12, Font.BOLD))); section.add(new Paragraph("Dieser Text ist kursiv",new Font(Font.HELVETICA, 12, Font.ITALIC))); section.add(new Paragraph("Dieser Font.UNDERLINE))); Seite 94 Text ist unterstrichen",new Font(Font.HELVETICA, 12, Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten section.add(new Paragraph("Dieser Font.STRIKETHRU))); section.add(new Paragraph("Dieser Font.BOLDITALIC))); Text Text ist ist durchgestrichen",new fett und kursiv",new Font(Font.HELVETICA, Font(Font.HELVETICA, 12, 12, Font boldunderlined = new Font(Font.HELVETICA, 12); boldunderlined.setStyle("boldunderline"); section.add(new Paragraph("Dieser Text ist fett und unterstrichen",boldunderlined)); // Diese Sektion demonstriert den Einsatz der 2 Parameter Indentation und Alignment Paragraph textpositionierung1 = new Paragraph("Dieser Text ist etwas laenger um die verschiedenen Modi der beiden Positionierungsmöglichkeiten Indentation und Alignment zu demonstrieren.",new Font(Font.HELVETICA, 16, Font.NORMAL)); Paragraph textpositionierung2 = new Paragraph("Dieser Text ist etwas laenger um die verschiedenen Modi der beiden Positionierungsmöglichkeiten Indentation und Alignment zu demonstrieren.",new Font(Font.HELVETICA, 16, Font.NORMAL)); Paragraph textpositionierung3 = new Paragraph("Dieser Text ist etwas laenger um die verschiedenen Modi der beiden Positionierungsmöglichkeiten Indentation und Alignment zu demonstrieren.",new Font(Font.HELVETICA, 16, Font.NORMAL)); Paragraph textpositionierung4 = new Paragraph("Dieser Text ist etwas laenger um die verschiedenen Modi der beiden Positionierungsmöglichkeiten Indentation und Alignment zu demonstrieren.",new Font(Font.HELVETICA, 16, Font.NORMAL)); Paragraph textpositionierung5 = new Paragraph("Dieser Text ist etwas laenger um die verschiedenen Modi der beiden Positionierungsmöglichkeiten Indentation und Alignment zu demonstrieren.",new Font(Font.HELVETICA, 16, Font.NORMAL)); Paragraph textpositionierung6 = new Paragraph("Zentrierter Text",new Font(Font.HELVETICA, 16, Font.NORMAL)); Paragraph textpositionierung7 = new Paragraph("Text links",new Font(Font.HELVETICA, 16, Font.NORMAL)); Paragraph textpositionierung8 = new Paragraph("Text rechts",new Font(Font.HELVETICA, 16, Font.NORMAL)); Paragraph textpositionierung9 = new Paragraph("Der Text wurde mittels ALIGN_JUSTIFIED in Blocksatz gesetzt, der Text ist etwas länger um das Ergebnis der Ausrichtung deutlich zu machen.",new Font(Font.HELVETICA, 16, Font.NORMAL)); Seite 95 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Paragraph textpositionierung10 = new Paragraph("Der Text wurde mittels ALIGN_JUSTIFIED in Blocksatz gesetzt, der Text ist etwas länger um das Ergebnis der Ausrichtung deutlich zu machen.",new Font(Font.HELVETICA, 16, Font.NORMAL)); section = chapter.addSection(new Paragraph("Text Positionierung",sectionFont),2); section.add(new Paragraph("In dieser Sektion werden die verschiedenen Positionierungsmodi die auf einen Text angewendet werden können demonstriert")); Section subsection = section.addSection(new Paragraph("Text Ausrichtung Alignment",subsectionFont),3); // Text linksbuendig setzen textpositionierung6.setAlignment(Element.ALIGN_LEFT); subsection.add(textpositionierung6); // Text zentrieren textpositionierung7.setAlignment(Element.ALIGN_CENTER); subsection.add(textpositionierung7); // Text rechtsbuendig setzen textpositionierung8.setAlignment(Element.ALIGN_RIGHT); subsection.add(textpositionierung8); // Text in Blocksatz setzen textpositionierung9.setAlignment(Element.ALIGN_JUSTIFIED); subsection.add(textpositionierung9); subsection.add(textpositionierung10); subsection = section.addSection(new Paragraph("Normaler Text",subsectionFont),3); subsection.add(textpositionierung1); subsection = section.addSection(new Paragraph("Text links eingerückt um 60",subsectionFont),3); // Text links einruecken um 60 textpositionierung2.setIndentationLeft(60); subsection.add(textpositionierung2); subsection = section.addSection(new Paragraph("Text links eingerückt um 120",subsectionFont),3); Seite 96 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Text links einruecken um 120 textpositionierung3.setIndentationLeft(120); subsection.add(textpositionierung3); subsection = section.addSection(new Paragraph("Text rechts eingerückt um 60",subsectionFont),3); // Text rechts einruecken um 60 textpositionierung4.setIndentationRight(60); subsection.add(textpositionierung4); subsection = section.addSection(new Paragraph("Text rechts eingerückt um 120",subsectionFont),3); // Text rechts einruecken um 120 textpositionierung5.setIndentationRight(120); subsection.add(textpositionierung5); document.add(chapter); } catch(DocumentException de) { System.err.println(de.getMessage()); } catch(IOException ioe) { System.err.println(ioe.getMessage()); } // we close the document document.close(); System.err.println("Finished!"); } } Seite 97 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 5.2.1.2 Anwendungsbeispiel 1-2 /** * Java Programm das den Einsatz der beiden iText Klassen JPEG und GIF zum Einbinden von * Graphiken in einem PDF Dokumentes verdeutlicht. * * @author Tom Koenig * @version %I%, %G% * @since JDK1.3 */ import java.awt.Color; import java.io.FileOutputStream; import java.io.IOException; import import import import import com.lowagie.text.*; com.lowagie.text.html.HtmlWriter; com.lowagie.text.xml.XmlWriter; com.lowagie.text.pdf.PdfWriter; com.lowagie.text.pdf.PdfWriter; public class Beispiel12 { /** * Klasse die den Einsatz der beiden iText Klassen Chapter und Section zur Strukturierung eines PDF Dokumentes verdeutlicht. * @since JDK1.3 */ Seite 98 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten public static void main(String[] args) { // Erstellen eines Dokumentes Document document = new Document(); try { // PDF-Dokument mit gewünschtem Dateiname anlegen. PdfWriter.getInstance(document, new FileOutputStream("beispiel12.pdf")); // Metainformationen an das Dokument binden document.addAuthor("Tom Koenig"); document.addSubject("Einbinden von Graphiken mittels Java Bibliothek iText"); // Definition von 3 Fonts welche im spaeteren Verlauf als Kapitelueberschrift, // Sektionueberschrift und Subsektonueberschrift dienen Font chapterFont = new Font(Font.HELVETICA, 24, Font.NORMAL, new Color(255, 0, 0)); Font sectionFont = new Font(Font.HELVETICA, 20, Font.NORMAL, new Color(0, 0, 255)); Font subsectionFont = new Font(Font.HELVETICA, 18, Font.BOLD, new Color(0, 64, 64)); // Dokument zum schreiben öffnen document.open(); // Kapitel erzeugen, der Methodenaufruf akzeptiert als Parameter den Text // der als Kapitelueberschrift dienen soll und als zweiten Parameter die Seite 99 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Kapitelnummer Chapter chapter = new Chapter(new Paragraph("Bilder im JPG Format",chapterFont),1); // Nun werden mehrere Grafiken im Format JPEG ueber die jeweiligen // Klassen eingebunden Image jpeg = Image.getInstance("lotus.jpg"); chapter.add(jpeg); Image jpeg2 = Image.getInstance("audi.jpg"); chapter.add(jpeg2); Image jpeg3 = Image.getInstance("earth.jpg"); chapter.add(jpeg3); document.add(chapter); chapter = new Chapter(new Paragraph("Bilder im GIF Format",chapterFont),2); Image gif = Image.getInstance("vonnegut.gif"); chapter.add(gif); // Folgende Bilder werden nicht dargestellt !! Image gif2 = Image.getInstance("pencil.gif"); chapter.add(gif2); Image gif3 = Image.getInstance("traffic.gif"); chapter.add(gif3); Gif gif4 = new Gif("traffic.gif"); Gif.processParameters(); document.add(chapter); Seite 100 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten } catch(DocumentException de) { System.err.println(de.getMessage()); } catch(IOException ioe) { System.err.println(ioe.getMessage()); } // we close the document document.close(); System.err.println("Finished!"); } } 5.2.1.3 Anwendungsbeispiel 1-3 /** * Java Programm das den Einsatz der iText Klasse Table und der Klasse cell zur Generierung von Tabellen * innerhab eines PDF Dokumentes verdeutlicht. * * @author Tom Koenig * @version %I%, %G% * @since JDK1.3 */ import java.awt.Color; import java.io.FileOutputStream; import java.io.IOException; import com.lowagie.text.*; Seite 101 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten import com.lowagie.text.html.HtmlWriter; import com.lowagie.text.xml.XmlWriter; import com.lowagie.text.pdf.PdfWriter; public class Beispiel13 { /** * Java Programm das den Einsatz der iText Klasse Table und der Klasse cell zur Generierung von Tabellen * innerhalb eines PDF Dokumentes verdeutlicht. */ public static void main(String[] args) { // Erzeugen eines Dokumentes Document document = new Document(); try { // PDF-Dokument mit gewünschtem Dateiname anlegen. PdfWriter.getInstance(document, new FileOutputStream("beispiel13.pdf")); // Metainformationen an das Dokument binden document.addAuthor("Tom Koenig"); document.addSubject("Tabellen mittels Java Bibliothek iText"); document.addKeywords("Table,Cell"); // Definition von 3 Fonts welche im spaeteren Verlauf als Kapitelueberschrift, // Sektionueberschrift und Subsektonueberschrift dienen Seite 102 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Font chapterFont = new Font(Font.HELVETICA, 24, Font.NORMAL, new Color(255, 0, 0)); Font sectionFont = new Font(Font.HELVETICA, 20, Font.NORMAL, new Color(0, 0, 255)); Font subsectionFont = new Font(Font.HELVETICA, 18, Font.BOLD, new Color(0, 64, 64)); // Dokument zum schreiben öffnen document.open(); // Kapitel erzeugen, der Methodenaufruf akzeptiert als Parameter den Text // der als Kapitelueberschrift dienen soll und als zweiten Parameter die // Kapitelnummer Chapter chapter = new Chapter(new Paragraph("Einsatz von Tabellen",chapterFont),3); // // // // // Die Sektion wird dem Kapitel ueber addSection angehangt, der Methodenaufruf ist dem des Kapitels sehr aehnlich bis auf die Tatsache dass hier der 2. Parameter angibt wieviele Zahlen angegeben werden bei der Sektions numerierung, also die Tiefe der Numerierung, bei 2 waere es 1.1 bei 3 1.1.1 usw Section section=chapter.addSection(new Paragraph("Eine einfache Tabelle",sectionFont),2); // Tabelle anlegen mit 3 Spalten, die Spalten muessen vor der Definition // der Tabelle bekannt sein. Table tabelle = new Table(3); // Mittels cellpadding wird der Abstand des Textes zu Rand einer Zelle angegeben // und mittels cellspacing gibt man an wieviel Abstand zwischen den Zellen // bestehen soll tabelle.setCellpadding(0); tabelle.setCellspacing(4); Seite 103 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Rand der Tabelle angeben tabelle.setBorder(Rectangle.NO_BORDER); // Breite der jeweiligen Spalten angeben und dann setzen int headerwidths[] = {10, 45, 30}; tabelle.setWidths(headerwidths); // Breite der Tabelle angeben, es muss gelten Summe Spaltenbreiten = Tabellenbreite tabelle.setWidth(90); // Ausrichtung des Textes auf zentriert setzen hier sind noch möglich // ALIGN_RIGHT d ALIGN_LEFT tabelle.setDefaultHorizontalAlignment(Element.ALIGN_CENTER); // 3 Zellen einfuegen die als Kopfzeilen definiert sind. tabelle.addCell("Position"); tabelle.addCell("Team"); tabelle.addCell("Punkte"); // Ende der Kopfzeilen tabelle.endHeaders(); // Im folgenden werden nun 8 Reihen a 3 Zellen eingegeben tabelle.setDefaultHorizontalAlignment(Element.ALIGN_CENTER); tabelle.addCell("1"); tabelle.addCell("Bayern München"); tabelle.addCell("62"); tabelle.addCell("2"); tabelle.addCell("Schalke 04"); Seite 104 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten tabelle.addCell("59"); tabelle.addCell("3"); tabelle.addCell("Borussia Dortmund"); tabelle.addCell("57"); tabelle.addCell("4"); tabelle.addCell("Bayer Leverkusen"); tabelle.addCell("54"); tabelle.addCell("5"); tabelle.addCell("Hertha BSC Berlin"); tabelle.addCell("53"); tabelle.addCell("6"); tabelle.addCell("SC Freiburg"); tabelle.addCell("52"); tabelle.addCell("7"); tabelle.addCell("Werder Bremen"); tabelle.addCell("50"); tabelle.addCell("8"); tabelle.addCell("1.FC Kaiserslautern"); tabelle.addCell("50"); // Die Tabelle wird an die Sektion uebergeben section.add(tabelle); section=chapter.addSection(new Paragraph("Eine komplexere Tabelle",sectionFont),2); tabelle = new Table(7); tabelle.setCellpadding(0); tabelle.setCellspacing(5); tabelle.setBorder(Rectangle.NO_BORDER); int headerwidths2[] = {10, 20, 18, 13, 13, 13, 13}; Seite 105 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten tabelle.setWidths(headerwidths2); tabelle.setWidth(100); // Breite des Randes angeben tabelle.setDefaultCellBorderWidth(3); tabelle.setDefaultHorizontalAlignment(1); // Angeben das hier 1 Zelle ueber 2 Zeilen reicht tabelle.setDefaultRowspan(2); // Folgend werden nun 3 Zellen eingefuegt tabelle.addCell("Matnr"); tabelle.addCell("Name"); tabelle.addCell("Fachbereich"); tabelle.setDefaultRowspan(1); // Angeben das hier 1 Zelle ueber 4 Spalten reicht tabelle.setDefaultColspan(4); tabelle.addCell("Rechte"); tabelle.setDefaultColspan(1); tabelle.addCell("Lesen"); tabelle.addCell("Schreiben"); tabelle.addCell("Ausführen"); tabelle.addCell("Admin"); tabelle.endHeaders(); tabelle.setDefaultCellBorderWidth(1); tabelle.setDefaultRowspan(1); tabelle.setDefaultHorizontalAlignment(Element.ALIGN_LEFT); Seite 106 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten tabelle.addCell("5678"); tabelle.addCell("Steve Reuter"); tabelle.addCell("Wiwi"); tabelle.setDefaultHorizontalAlignment(Element.ALIGN_CENTER); tabelle.addCell("X"); tabelle.addCell(""); tabelle.addCell("X"); tabelle.addCell(""); tabelle.setDefaultHorizontalAlignment(Element.ALIGN_LEFT); tabelle.addCell("1234"); tabelle.addCell("Ralf Meyer"); tabelle.addCell("Informatik"); tabelle.setDefaultHorizontalAlignment(Element.ALIGN_CENTER); tabelle.addCell("X"); tabelle.addCell("X"); tabelle.addCell("X"); tabelle.addCell("X"); tabelle.setDefaultHorizontalAlignment(Element.ALIGN_LEFT); tabelle.addCell("4987"); tabelle.addCell("Ulrich Gerke"); tabelle.addCell("Elektrotechnik"); tabelle.setDefaultHorizontalAlignment(Element.ALIGN_CENTER); tabelle.addCell("X"); tabelle.addCell("X"); tabelle.addCell("X"); tabelle.addCell("X"); tabelle.setDefaultHorizontalAlignment(Element.ALIGN_LEFT); tabelle.addCell("5463"); Seite 107 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten tabelle.addCell("Norbert Carsten"); tabelle.addCell("Maschinenbau"); tabelle.setDefaultHorizontalAlignment(Element.ALIGN_CENTER); tabelle.addCell("X"); tabelle.addCell(""); tabelle.addCell(""); tabelle.addCell(""); tabelle.setDefaultHorizontalAlignment(Element.ALIGN_LEFT); tabelle.addCell("7439"); tabelle.addCell("Lothar Schumann"); tabelle.addCell("Informatik"); tabelle.setDefaultHorizontalAlignment(Element.ALIGN_CENTER); tabelle.addCell("X"); tabelle.addCell("X"); tabelle.addCell("X"); tabelle.addCell(""); tabelle.setDefaultHorizontalAlignment(Element.ALIGN_LEFT); section.add(tabelle); section=chapter.addSection(new Paragraph("Weiter Möglichkeiten bei Tabellen",sectionFont),2); tabelle = new Table(3); tabelle.setCellpadding(0); tabelle.setCellspacing(4); tabelle.setBorder(Rectangle.NO_BORDER); int headerwidths3[] = {20, 45, 30}; tabelle.setWidths(headerwidths3); Seite 108 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten tabelle.setWidth(100); Cell cell = new Cell(new Paragraph("Position", new Font(Font.HELVETICA, 18, Font.NORMAL, new Color(0, 0, 0)))); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setHeader(true); cell.setBackgroundColor(new Color(255,255,0)); cell.setBorderWidth(3); tabelle.addCell(cell); cell = new Cell(new Paragraph("Mannschaft", new Font(Font.HELVETICA, 18, Font.NORMAL, new Color(0, 0, 0)))); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setHeader(true); cell.setBackgroundColor(new Color(255,255,0)); cell.setBorderWidth(3); tabelle.addCell(cell); cell = new Cell(new Paragraph("Punkte", new Font(Font.HELVETICA, 18, Font.NORMAL, new Color(0, 0, 0)))); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setHeader(true); cell.setBackgroundColor(new Color(255,255,0)); cell.setBorderWidth(3); tabelle.addCell(cell); cell = new Cell("1"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setHeader(false); cell.setBackgroundColor(new Color(255,0,0)); tabelle.addCell(cell); cell=new Cell("Bayern München"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new Color(255,0,0)); tabelle.addCell(cell); cell=new Cell("62"); Seite 109 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new Color(255,0,0)); tabelle.addCell(cell); cell = new Cell("2"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setHeader(false); cell.setBackgroundColor(new Color(255,0,0)); tabelle.addCell(cell); cell=new Cell("Schalke 04"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new Color(255,0,0)); tabelle.addCell(cell); cell=new Cell("59"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new Color(255,0,0)); tabelle.addCell(cell); cell = new Cell("3"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setHeader(false); cell.setBackgroundColor(new Color(0,0,255)); tabelle.addCell(cell); cell=new Cell("Borussia Dortmund"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new Color(0,0,255)); tabelle.addCell(cell); cell=new Cell("57"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new Color(0,0,255)); tabelle.addCell(cell); cell = new Cell("4"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setHeader(false); cell.setBackgroundColor(new Color(0,0,255)); tabelle.addCell(cell); Seite 110 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten cell=new Cell("Bayer Leverkusen"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new Color(0,0,255)); tabelle.addCell(cell); cell=new Cell("54"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new Color(0,0,255)); tabelle.addCell(cell); cell = new Cell("5"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setHeader(false); cell.setBackgroundColor(new Color(0,255,255)); tabelle.addCell(cell); cell=new Cell("Hertha BSC Berlin"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new Color(0,255,255)); tabelle.addCell(cell); cell=new Cell("53"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new Color(0,255,255)); tabelle.addCell(cell); cell = new Cell("6"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setHeader(false); cell.setBackgroundColor(new Color(0,255,255)); tabelle.addCell(cell); cell=new Cell("SC Freiburg"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new Color(0,255,255)); tabelle.addCell(cell); cell=new Cell("52"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new Color(0,255,255)); tabelle.addCell(cell); cell = new Cell("7"); Seite 111 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setHeader(false); cell.setBackgroundColor(new Color(255,0,255)); tabelle.addCell(cell); cell=new Cell("Werder Bremen"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new Color(255,0,255)); tabelle.addCell(cell); cell=new Cell("50"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new Color(255,0,255)); tabelle.addCell(cell); cell = new Cell("8"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setHeader(false); cell.setBackgroundColor(new Color(255,0,255)); tabelle.addCell(cell); cell=new Cell("1.FC Kaiserslautern"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new Color(255,0,255)); tabelle.addCell(cell); cell=new Cell("50"); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new Color(255,0,255)); tabelle.addCell(cell); section.add(tabelle); section=chapter.addSection(new Paragraph("Beispiel aus Javadoc von iText",sectionFont),2); Table table = new Table(3); //Table.setBorderWidth(1); table.setBorderColor(new Color(0, 0, 255)); table.setDefaultVerticalAlignment(Element.ALIGN_CENTER); table.setCellpadding(5); table.setCellspacing(5); Seite 112 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten cell = new Cell("header"); cell.setHeader(true); cell.setColspan(3); table.addCell(cell); table.endHeaders(); cell = new Cell("example cell with colspan 1 and rowspan 2"); cell.setRowspan(2); cell.setBorderColor(new Color(255, 0, 0)); table.addCell(cell); table.addCell("1.1"); table.addCell("2.1"); table.addCell("1.2"); table.addCell("2.2"); table.addCell("cell test1"); cell = new Cell("big cell"); cell.setRowspan(2); cell.setColspan(2); table.addCell(cell); table.addCell("cell test2"); section.add(table); document.add(chapter); } catch(DocumentException de) { System.err.println(de.getMessage()); } catch(IOException ioe) { System.err.println(ioe.getMessage()); } // we close the document document.close(); System.err.println("Finished!"); Seite 113 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten } } 5.2.1.4 Anwendungsbeispiel 1-4 /** * Java Programm das den Einsatz der beiden iText Klassen Chapter und Section zur Strukturierung eines PDF Dokumentes verdeutlicht. * * @author Tom Koenig * @version %I%, %G% * @since JDK1.3 */ import java.awt.Color; import java.io.FileOutputStream; import java.io.IOException; import import import import com.lowagie.text.*; com.lowagie.text.html.HtmlWriter; com.lowagie.text.xml.XmlWriter; com.lowagie.text.pdf.PdfWriter; public class beispiel14 { /** * Klasse die den Einsatz der beiden iText Klassen Chapter und Section zur Strukturierung eines PDF Dokumentes verdeutlicht. * @since JDK1.3 */ public static void main(String[] args) { Seite 114 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Erzeugen eines Dokumentes mit Seitengrösse A3 und spezifizierten Seitenrändern Document document = new Document(PageSize.A3, 50, 50, 50, 50); try { // PDF-Dokument mit gewünschtem Dateiname anlegen und zum schreiben öffnen. PdfWriter.getInstance(document, new FileOutputStream("beispiel14.pdf")); // Metainformationen an das Dokument binden document.addAuthor("Tom Koenig"); document.addSubject("Strukturierung eines Dokumentes mittels Java Bibliothek iText"); // Definition von 3 Fonts welche im spaeteren Verlauf als Kapitelueberschrift, // Sektionueberschrift und Subsektonueberschrift dienen Font chapterFont = new Font(Font.HELVETICA, 24, Font.NORMAL, new Color(255, 0, 0)); Font sectionFont = new Font(Font.HELVETICA, 20, Font.NORMAL, new Color(0, 0, 255)); Font subsectionFont = new Font(Font.HELVETICA, 18, Font.BOLD, new Color(0, 64, 64)); // Dokument zum schreiben öffnen document.open(); // Erzeugt wird nun eine buchaehnliche Struktur die den Einsatz der Klassen // Kapitel und Section verdeutlichen Seite 115 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Kapitel erzeugen, der Methodenaufruf akzeptiert als Parameter den Text // der als Kapitelueberschrift dienen soll und als zweiten Parameter die // Kapitelnummer Chapter chapter = new Chapter(new Paragraph("Kapitel",chapterFont),1); // // // // // Die Sektion wird dem Kapitel ueber addSection angehangt, der Methodenaufruf ist dem des Kapitels sehr aehnlich bis auf die Tatsache dass hier der 2. Parameter angibt wieviele Zahlen angegeben werden bei der Sektions numerierung, also die Tiefe der Numerierung, bei 2 waere es 1.1 bei 3 1.1.1 usw Section section=chapter.addSection(new Paragraph("Sektion",sectionFont),2); section=chapter.addSection(new Paragraph("Sektion",sectionFont),2); section=chapter.addSection(new Paragraph("Sektion",sectionFont),2); Section subsection=section.addSection(new Paragraph("SubSektion",sectionFont),3); subsection=section.addSection(new Paragraph("SubSektion",sectionFont),3); section=chapter.addSection(new Paragraph("Sektion",sectionFont),2); document.add(chapter); chapter = new Chapter(new Paragraph("Kapitel",chapterFont),2); section=chapter.addSection(new Paragraph("Sektion",sectionFont),2); section=chapter.addSection(new Paragraph("Sektion",sectionFont),2); section=chapter.addSection(new Paragraph("Sektion",sectionFont),2); subsection=section.addSection(new Paragraph("SubSektion",sectionFont),3); Section subsubsection=subsection.addSection(new Paragraph("SubSektion",sectionFont),4); subsubsection=subsection.addSection(new Paragraph("SubSektion",sectionFont),4); subsubsection=subsection.addSection(new Paragraph("SubSektion",sectionFont),4); subsection=section.addSection(new Paragraph("SubSektion",sectionFont),3); section=chapter.addSection(new Paragraph("Sektion",sectionFont),2); document.add(chapter); Seite 116 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten } catch(DocumentException de) { System.err.println(de.getMessage()); } catch(IOException ioe) { System.err.println(ioe.getMessage()); } // we close the document document.close(); System.err.println("Finished!"); } } 5.2.1.5 Anwendungsbeispiel 1-5 /** * Java Programm das den Einsatz einiger allgemeinen Klassen verdeutlicht. * * @author Tom Koenig * @version %I%, %G% * @since JDK1.3 */ import java.awt.Color; import java.io.FileOutputStream; import java.io.IOException; import import import import com.lowagie.text.*; com.lowagie.text.html.HtmlWriter; com.lowagie.text.xml.XmlWriter; com.lowagie.text.pdf.PdfWriter; Seite 117 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten public class beispiel15 { /** * Klasse die den Einsatz einiger allgemeinen Klassen verdeutlicht. * @since JDK1.3 */ public static void main(String[] args) { // Erzeugen eines Dokumentes mit Seitengrösse A3 und spezifizierten Seitenrändern Document document = new Document(PageSize.A3, 50, 50, 50, 50); try { // PDF-Dokument mit gewünschtem Dateiname anlegen und zum schreiben öffnen. PdfWriter.getInstance(document, new FileOutputStream("beispiel15.pdf")); // Metainformationen an das Dokument binden document.addAuthor("Tom Koenig"); document.addSubject("Allgemeine Klassen"); // Definition von 3 Fonts welche im spaeteren Verlauf als Kapitelueberschrift, // Sektionueberschrift und Subsektonueberschrift dienen Font chapterFont = new Font(Font.HELVETICA, 24, Font.NORMAL, new Color(255, 0, 0)); Font sectionFont = new Font(Font.HELVETICA, 20, Font.NORMAL, new Color(0, 0, 255)); Seite 118 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Font subsectionFont = new Font(Font.HELVETICA, 18, Font.BOLD, new Color(0, 64, 64)); // Dokument zum schreiben öffnen document.open(); // Erzeugt wird nun eine buchaehnliche Struktur die den Einsatz der Klassen // Kapitel und Section verdeutlichen // Kapitel erzeugen, der Methodenaufruf akzeptiert als Parameter den Text // der als Kapitelueberschrift dienen soll und als zweiten Parameter die // Kapitelnummer Chapter chapter = new Chapter(new Paragraph("Allgemeine Klassen",chapterFont),1); // // // // // Die Sektion wird dem Kapitel ueber addSection angehangt, der Methodenaufruf ist dem des Kapitels sehr aehnlich bis auf die Tatsache dass hier der 2. Parameter angibt wieviele Zahlen angegeben werden bei der Sektions numerierung, also die Tiefe der Numerierung, bei 2 waere es 1.1 bei 3 1.1.1 usw Section section=chapter.addSection(new Paragraph("Verweise",sectionFont),2); Anchor anchor = new Anchor("Web Seite von iText"); anchor.setReference("http://www.lowagie.com"); section.add(anchor); // anchor beendet wie Phrase, Chunk die Zeile nicht // Folgende Zeile bietet die Moeglichkeit in eine neue Zeile zu wechseln Paragraph paragraph = new Paragraph(""); section.add(paragraph); Seite 119 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten anchor = new Anchor("Web Seite der Universitaet Kaiserslautern"); anchor.setReference("http://www.uni.kl.de"); section.add(anchor); section=chapter.addSection(new Paragraph("Listen",sectionFont),2); // Erstellen einer Liste Section subsection=section.addSection(new Paragraph("Numerierte Listen",sectionFont),3); // Der 1. Parameter des Konstruktors bei Listen gibt an ob es sich eine // numerierte Liste true oder nicht false handelt. List list = new List(true, 20); list.add(new ListItem("1. Element")); list.add(new ListItem("2. Element")); list.add(new ListItem("3. Element")); list.add(new ListItem("4. Element")); list.add(new ListItem("5. Element")); list.add(new ListItem("6. Element")); subsection.add(list); subsection=section.addSection(new Paragraph("Nichtnumerierte Listen",sectionFont),3); list = new List(false, 20); list.add(new ListItem("1. Element")); list.add(new ListItem("2. Element")); list.add(new ListItem("3. Element")); list.add(new ListItem("4. Element")); list.add(new ListItem("5. Element")); list.add(new ListItem("6. Element")); subsection.add(list); document.add(chapter); Seite 120 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten } catch(DocumentException de) { System.err.println(de.getMessage()); } catch(IOException ioe) { System.err.println(ioe.getMessage()); } // we close the document document.close(); System.err.println("Finished!"); } } 5.2.2 Thentech PDF Treiber 5.2.2.1 Anwendungsbeispiel 2-1 import java.awt.Color; import java.io.IOException; import com.thentech.pdf.ext.*; import java.lang.System; public class Beispiel21 { public static void main(String args[]) { // Dokument Objekt erstellen PDFxDocument document = PDF.createDocument(); Seite 121 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Font Objekt definieren PDFxFont font; // Context Objekt definieren und initialisieren PDFxContext context = document.getContext(); // Metainformationen mittel setInfo setzen document.setInfo("Tom Koenig","Beispiel 2-1","Text Formatierung mittels Thentech Java Bibliothek","PDF"); // Erstellen einer Seite mit Seitengrösse A4 und Ausrichtung Portrait PDFxPage page = document.createPage(PDFxPanel.SIZE_ISO_A4,PDFxPanel.ORIENTATION_PORTRAIT); // Schriftart vorbereiten und dann über context setzen // Eine Ueberschrift setzen, Text unterstreichen nicht moeglich font = document.createBaseFont(PDFxFont.HELVETICA_BOLD); context.setFont(font,20.0); page.drawText(100, 25, "Text formatieren"); // Verschiedene Schriftarten anzeigen font = document.createBaseFont(PDFxFont.HELVETICA); context.setFont(font,14.0); page.drawText(100, 50, "Text formatieren : HELVETICA"); font = document.createBaseFont(PDFxFont.HELVETICA_BOLD); context.setFont(font,14.0); page.drawText(100, 75, "Text formatieren : HELVETICA_BOLD"); font = document.createBaseFont(PDFxFont.HELVETICA_OBLIQUE); context.setFont(font,14.0); page.drawText(100, 100, "Text formatieren : HELVETICA_OBLIQUE"); Seite 122 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten font = document.createBaseFont(PDFxFont.HELVETICA_BOLD_OBLIQUE); context.setFont(font,14.0); page.drawText(100, 125, "Text formatieren : HELVETICA_BOLD_OBLIQUE"); font = document.createBaseFont(PDFxFont.COURIER); context.setFont(font,14.0); page.drawText(100, 150, "Text formatieren : COURIER"); font = document.createBaseFont(PDFxFont.COURIER_BOLD); context.setFont(font,14.0); page.drawText(100, 175, "Text formatieren : COURIER_BOLD"); font = document.createBaseFont(PDFxFont.COURIER_OBLIQUE); context.setFont(font,14.0); page.drawText(100, 200, "Text formatieren : COURIER_OBLIQUE"); font = document.createBaseFont(PDFxFont.COURIER_BOLD_OBLIQUE); context.setFont(font,14.0); page.drawText(100, 225, "Text formatieren : COURIER_BOLD_OBLIQUE"); font = document.createBaseFont(PDFxFont.TIMES_ROMAN); context.setFont(font,14.0); page.drawText(100, 250, "Text formatieren : TIMES_ROMAN"); font = document.createBaseFont(PDFxFont.TIMES_BOLD); context.setFont(font,14.0); page.drawText(100, 275, "Text formatieren : TIMES_BOLD"); font = document.createBaseFont(PDFxFont.TIMES_ITALIC); context.setFont(font,14.0); page.drawText(100, 300, "Text formatieren : TIMES_ITALIC"); font = document.createBaseFont(PDFxFont.TIMES_BOLD_ITALIC); context.setFont(font,14.0); page.drawText(100, 325, "Text formatieren : TIMES_BOLD_ITALIC"); font = document.createBaseFont(PDFxFont.SYMBOL); context.setFont(font,14.0); Seite 123 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten page.drawText(100, 350, "Text formatieren : SYMBOL"); font = document.createBaseFont(PDFxFont.ZAPFDINGBATS); context.setFont(font,14.0); page.drawText(100, 375, "Text formatieren : ZAPFDINGBATS"); // Text in Farbe darstellen // Die Farbe wird über FgColor(Color) gesetzt font = document.createBaseFont(PDFxFont.HELVETICA); context.setFont(font,14.0); context.setFgColor(new Color(255,0,0)); page.drawText(100, 450, "Text - Farbe Rot"); font = document.createBaseFont(PDFxFont.HELVETICA); context.setFont(font,14.0); context.setFgColor(new Color(0,0,255)); page.drawText(100, 475, "Text - Farbe Blau"); try{ PDFxImage hula = document.createImage("pencil.gif"); page.drawImage(700,700,50,50,hula); } catch(PDFxFileNotFoundException de){ // System.err.println(de.getMessage()); } // PDF Dokument speichern document.savePDF("Beispiel21.pdf"); System.err.println("PDF Dokument wurde erzeugt!"); } } Seite 124 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 5.2.2.2 Anwendungsbeispiel 2-2 import java.awt.Color; import java.io.IOException; import com.thentech.pdf.ext.*; import java.lang.System; public class Beispiel22 { public static void main(String args[]) { // Dokument Objekt erstellen PDFxDocument document = PDF.createDocument(); // Font Objekt definieren PDFxFont font; // Context Objekt definieren und initialisieren PDFxContext context = document.getContext(); // Metainformationen mittel setInfo setzen document.setInfo("Tom Koenig","Beispiel 2-2","Text Formatierung mittels Thentech Java Bibliothek","PDF"); // Erstellen einer Seite mit Seitengrösse A4 und Ausrichtung Portrait PDFxPage page = document.createPage(PDFxPanel.SIZE_ISO_A4,PDFxPanel.ORIENTATION_PORTRAIT); // Schriftart vorbereiten und dann über context setzen // Eine Ueberschrift setzen, Text unterstreichen nicht moeglich Seite 125 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten font = document.createBaseFont(PDFxFont.HELVETICA_BOLD); context.setFont(font,20.0); page.drawText(100, 25, "Graphiken einbinden - JPG Format"); try{ PDFxImage bild = document.createImage("audi.jpg"); page.drawImage(100,100,359,190,bild); bild = document.createImage("lotus.jpg"); page.drawImage(100,300,300,200,bild); bild = document.createImage("earth.jpg"); page.drawImage(100,550,163,158,bild); } catch(PDFxFileNotFoundException de){ // System.err.println(de.getMessage()); } // Erstellen einer Seite mit Seitengrösse A4 und Ausrichtung Portrait PDFxPage page2 = document.createPage(PDFxPanel.SIZE_ISO_A4,PDFxPanel.ORIENTATION_PORTRAIT); // Schriftart vorbereiten und dann über context setzen // Eine Ueberschrift setzen, Text unterstreichen nicht moeglich font = document.createBaseFont(PDFxFont.HELVETICA_BOLD); context.setFont(font,20.0); page2.drawText(100, 25, "Graphiken einbinden - GIF Format"); try{ PDFxImage bild = document.createImage("pencil.gif"); page2.drawImage(100,100,70,50,bild); Seite 126 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Bild wird auf die Haelfte skaliert bild = document.createImage("machine.gif"); page2.drawImage(100,200,225,265,bild); bild = document.createImage("vonnegut.gif"); page2.drawImage(100,550,198,149,bild); } catch(PDFxFileNotFoundException de){ // System.err.println(de.getMessage()); } // PDF Dokument speichern document.savePDF("Beispiel22.pdf"); System.err.println("PDF Dokument wurde erzeugt!"); } } Seite 127 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 5.2.3 PDFlib 5.2.3.1 Anwendungsbeispiel 3-1 // Beispiel3-1.java // Demonstration des Einsatzes von PDFlib zur Formatierung von Text import java.io.*; import com.pdflib.pdflib; public class Beispiel31 { public static void main (String argv[]) throws OutOfMemoryError, IOException, IllegalArgumentException, IndexOutOfBoundsException, ClassCastException, ArithmeticException, RuntimeException, InternalError, UnknownError { // Integer Schrift handle anlegen um Schriften zu laden und so spaeter anzuzeigen int font; // PDFlib Objekt erzeugen ueber das alle Operationen ablaufen pdflib document; document = new pdflib(); // Kann die Datei zum Schreiben geoeffnet werden if (document.open_file("Beispiel31.pdf") == -1) { System.err.println("Datei Beispiel31.pdf konnte nicht zum Schreiben geoeffnet werden!\n"); System.err.println("Ueberpruefen sie ob die Datei nicht von einem anderen Programm verwendet wird!\n"); System.exit(1); } Seite 128 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Metainformationen werden wird mittels der Funktion set_info // gesetzt. Jeder Schlüssel z.B. Creator wird einzeln mit // seinem jeweiligen Wert gesetzt document.set_info("Creator", "PDFlib"); document.set_info("Subject", "Text formatieren"); document.set_info("Keywords", "Java,PDF,Text"); document.set_info("Author", "Tom Koenig"); document.set_info("Title", "Beispiel 3-1"); // Die erste Seite wird erzeugt mit den Standard Werten fuer A4, siehe // PDFlib Referenz document.begin_page(595, 842); // // // // Überschrift setzen , Font wird mittels findfont geladen hier Helvetica und dann über setfont gesetzt hier mit 16 Punkten, die Textposition wird gesetzt und der Text wird mittels show in das Dokument eingebunden. Da es sich um eine Überschrift handelt wird der Text unterstrichen font = document.findfont("Helvetica", "host", 0); document.setfont(font,24); document.set_text_pos(100,800); // Textmodus unterstreichen wird aktiviert document.set_parameter("underline","true"); document.show("Beispiel für das Formatieren von Text"); // Textmodus unterstreichen wird deaktiviert document.set_parameter("underline","false"); // Folgend werden alle Basis Schriften ausgegeben document.set_text_pos(100,775); font = document.findfont("Helvetica", "host", 0); document.setfont(font,12); document.show("Dieser Text ist Helvetica 12 Punkt"); Seite 129 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten document.set_text_pos(100,750); font = document.findfont("Helvetica-Bold", "host", 0); document.setfont(font,12); document.show("Dieser Text ist Helvetica-Bold 12 Punkt"); document.set_text_pos(100,725); font = document.findfont("Helvetica-Oblique", "host", 0); document.setfont(font,12); document.show("Dieser Text ist Helvetica-Oblique 12 Punkt"); document.set_text_pos(100,700); font = document.findfont("Helvetica-BoldOblique", "host", 0); document.setfont(font,12); document.show("Dieser Text ist Helvetica-BoldOblique 12 Punkt"); document.set_text_pos(100,650); font = document.findfont("Courier", "host", 0); document.setfont(font,18); document.show("Dieser Text ist Courier 18 Punkt"); document.set_text_pos(100,625); font = document.findfont("Courier-Bold", "host", 0); document.setfont(font,18); document.show("Dieser Text ist Courier-Bold 18 Punkt"); document.set_text_pos(100,600); font = document.findfont("Courier-Oblique", "host", 0); document.setfont(font,18); document.show("Dieser Text ist Courier-Oblique 18 Punkt"); document.set_text_pos(100,575); font = document.findfont("Courier-BoldOblique", "host", 0); document.setfont(font,18); document.show("Dieser Text ist Courier-BoldOblique 18 Punkt"); Seite 130 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten document.set_text_pos(100,525); font = document.findfont("Times-Roman", "host", 0); document.setfont(font,20); document.show("Dieser Text ist Times-Roman 20 Punkt"); document.set_text_pos(100,500); font = document.findfont("Times-Bold", "host", 0); document.setfont(font,20); document.show("Dieser Text ist Times-Bold 20 Punkt"); document.set_text_pos(100,475); font = document.findfont("Times-Italic", "host", 0); document.setfont(font,20); document.show("Dieser Text ist Times-Italic 20 Punkt"); document.set_text_pos(100,450); font = document.findfont("Times-BoldItalic", "host", 0); document.setfont(font,20); document.show("Dieser Text ist Times-BoldItalic 20 Punkt"); // Unter Windows 2000 werden die folgenden Schriften nicht gefunden //document.set_text_pos(100,400); //font = document.findfont("ZAPFDINGBATS", "host", 0); //document.setfont(font,20); //document.show("Dieser Text ist ZapfDingbats 20 Punkt"); //document.set_text_pos(100,350); //font = document.findfont("Symbol", "host", 0); //document.setfont(font,20); //document.show("Dieser Text ist Symbol 20 Punkt"); document.end_page(); // Seite wird mit end_page abgeschlossen und mit begin_page die zweite erstellt. Seite 131 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten document.begin_page(595, 842); // Ueberschrift wird gesetzt font = document.findfont("Helvetica", "host", 0); document.setfont(font,24); document.set_text_pos(100,800); // Textmodus unterstreichen wird aktiviert document.set_parameter("underline","true"); document.show("Weitere Formatierungseinstellungen"); // Textmodus unterstreichen wird deaktiviert document.set_parameter("underline","false"); // Wie oben werden nun hier die font = document.findfont("Helvetica", "host", 0); document.setfont(font,12); document.set_text_pos(100,700); // Textmodus unterstreichen wird aktiviert document.set_parameter("underline","true"); document.show("Dieser Text ist unterstrichen"); // Textmodus unterstreichen wird deaktiviert document.set_parameter("underline","false"); font = document.findfont("Helvetica", "host", 0); document.setfont(font,12); document.set_text_pos(100,650); // Textmodus unterstreichen wird aktiviert document.set_parameter("strikeout","true"); document.show("Dieser Text ist durchgestrichen"); // Textmodus unterstreichen wird deaktiviert document.set_parameter("strikeout","false"); // Modus overline wird nicht dargestellt font = document.findfont("Helvetica", "host", 0); document.setfont(font,12); document.set_text_pos(100,600); Seite 132 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Textmodus unterstreichen wird aktiviert document.set_parameter("overline","true"); document.show("Dieser Text ist ueberstrichen"); // Textmodus unterstreichen wird deaktiviert document.set_parameter("overline","false"); // Die Methode setcolor wird aufgerufen // Das rgb Farbsystem wird verwendet um die Standard Farben // rot und blau zu setzen. font = document.findfont("Helvetica", "host", 0); document.setfont(font,12); document.set_text_pos(100,550); document.setcolor("both","rgb",1,0,0,0); document.show("Dieser Text ist rot"); font = document.findfont("Helvetica", "host", 0); document.setfont(font,12); document.set_text_pos(100,500); document.setcolor("both","rgb",0,0,1,0); document.show("Dieser Text ist blau"); document.end_page(); document.begin_page(595, 842); font = document.findfont("Helvetica", "host", 0); document.setfont(font,20); document.set_text_pos(100,800); // Textmodus unterstreichen wird aktiviert document.set_parameter("underline","true"); document.show("Text in Absatz"); // Textmodus unterstreichen wird deaktiviert document.set_parameter("underline","false"); font = document.findfont("Helvetica", "host", 0); document.setfont(font,12); Seite 133 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten document.set_text_pos(100,750); document.show("Dieser Text ist sehr lang und wird mehrmals dargestellt, einmal unter Verwendung von show, das zweite Mal unter Verwendung der Funktion show_boxed"); // Der Text wird nun ein weiteres mal unter Verwendung der show_boxed Methode dargestellt // Es werden die Modi des Align Paramters left, right, center dargestellt // Text links ausgerichtet font = document.findfont("Helvetica-Bold", "host", 0); document.setfont(font,14); document.set_text_pos(100,700); // Textmodus unterstreichen wird aktiviert document.set_parameter("underline","true"); document.show("Text in Absatz - links ausgerichtet"); // Textmodus unterstreichen wird deaktiviert document.set_parameter("underline","false"); // Die Methode show boxed erwartet als Parameter den linken unteren Punkt des // aufzuziehenden Rechtecks, sowie die Breite und die Höhe. Die Ausrichtung des // Textes ist ein weiterer möglicher Parameter, der im folgenden variiert wird. font = document.findfont("Helvetica", "host", 0); document.setfont(font,12); document.show_boxed("Dieser Text ist sehr lang und wird mehrmal dargestellt, einmal unter Verwendung von show, dann unter Verwendung der Funktion show_boxed",100,550,200,100,"left",""); // Text rechts augerichtet font = document.findfont("Helvetica-Bold", "host", 0); document.setfont(font,14); document.set_text_pos(100,500); // Textmodus unterstreichen wird aktiviert document.set_parameter("underline","true"); document.show("Text in Absatz - rechts ausgerichtet"); // Textmodus unterstreichen wird deaktiviert document.set_parameter("underline","false"); Seite 134 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten font = document.findfont("Helvetica", "host", 0); document.setfont(font,12); document.show_boxed("Dieser Text ist sehr lang und wird mehrmal dargestellt, einmal unter Verwendung von show, dann unter Verwendung der Funktion show_boxed",100,350,200,100,"right",""); // Text zentriert augerichtet font = document.findfont("Helvetica-Bold", "host", 0); document.setfont(font,14); document.set_text_pos(100,300); // Textmodus unterstreichen wird aktiviert document.set_parameter("underline","true"); document.show("Text in Absatz - zentriert ausgerichtet"); // Textmodus unterstreichen wird deaktiviert document.set_parameter("underline","false"); font = document.findfont("Helvetica", "host", 0); document.setfont(font,12); document.show_boxed("Dieser Text ist sehr lang und wird mehrmal dargestellt, einmal unter Verwendung von show, dann unter Verwendung der Funktion show_boxed",100,150,200,100,"center",""); document.end_page(); document.close(); } } 5.2.3.2 Anwendungsbeispiel 3-2 // Beispiel32.java Seite 135 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Demonstration des Einsatzes von PDFlib zur Formatierung von Text import java.io.*; import com.pdflib.pdflib; public class Beispiel32 { public static void main (String argv[]) throws OutOfMemoryError, IOException, IllegalArgumentException, IndexOutOfBoundsException, ClassCastException, ArithmeticException, RuntimeException, InternalError, UnknownError { // Integer Schrift handle anlegen um Schriften zu laden und so spaeter anzuzeigen int font; // Integer Graphik handle anlegen um Schriften zu laden und so spaeter anzuzeigen int bild; // PDFlib Objekt erzeugen ueber das alle Operationen ablaufen pdflib document; document = new pdflib(); // Kann die Datei zum Schreiben geoeffnet werden if (document.open_file("Beispiel32.pdf") == -1) { System.err.println("Datei Beispiel32.pdf konnte nicht zum Schreiben geoeffnet werden!\n"); System.err.println("Ueberpruefen sie ob die Datei nicht von einem anderen Programm verwendet wird!\n"); System.exit(1); } // Metainformationen werden wird mittels der Funktion set_info // gesetzt. Jeder Schlüssel z.B. Creator wird einzeln mit Seite 136 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // seinem jeweiligen Wert gesetzt document.set_info("Creator", "PDFlib"); document.set_info("Subject", "Graphiken einlagern"); document.set_info("Keywords", "Java,PDF,Graphiken"); document.set_info("Author", "Tom Koenig"); document.set_info("Title", "Beispiel 3-2"); // Die erste Seite wird erzeugt mit den Standard Werten fuer A4, siehe // PDFlib Referenz document.begin_page(595, 842); // // // // Überschrift setzen , Font wird mittels findfont geladen hier Helvetica und dann über setfont gesetzt hier mit 20 Punkten, die Textposition wird gesetzt und der Text wird mittels show in das Dokument eingebunden. Da es sich um eine Überschrift handelt wird der Text unterstrichen font = document.findfont("Helvetica", "host", 0); document.setfont(font,20); document.set_text_pos(100,800); // Textmodus unterstreichen wird aktiviert document.set_parameter("underline","true"); document.show("Beispiel für das Einlagern von JPEG Graphiken"); // Textmodus unterstreichen wird deaktiviert document.set_parameter("underline","false"); // // // // // Die Bilder werden gesetzt in dem sie mittels open_image_file geladen werden um dann mit place_image in das Dokument eingebunden zu werden. Der Punkt an dem das Bild dargestellt werden soll bezieht sich auf die linke untere Ecke des Bildes. Alle drei folgenden Bilder sind im JPG Format und werden originalgetreu, Skalierungsfaktor 1 dargestellt. bild=document.open_image_file("jpeg","audi.jpg","",0); Seite 137 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten document.place_image(bild,20,600,1); bild=document.open_image_file("jpeg","earth.jpg","",0); document.place_image(bild,20,350,1); bild=document.open_image_file("jpeg","lotus.jpg","",0); document.place_image(bild,20,100,1); document.end_page(); document.begin_page(595, 842); // // // // Überschrift setzen , Font wird mittels findfont geladen hier Helvetica und dann über setfont gesetzt hier mit 20 Punkten, die Textposition wird gesetzt und der Text wird mittels show in das Dokument eingebunden. Da es sich um eine Überschrift handelt wird der Text unterstrichen font = document.findfont("Helvetica", "host", 0); document.setfont(font,20); document.set_text_pos(100,800); // Textmodus unterstreichen wird aktiviert document.set_parameter("underline","true"); document.show("Beispiel für das Einlagern von GIF Graphiken"); // Textmodus unterstreichen wird deaktiviert document.set_parameter("underline","false"); // Nun folgend werden Bilder im GIF Format eingebunden bild=document.open_image_file("gif","pencil.gif","",0); document.place_image(bild,20,700,1); // Das zweite Bild wird augfgrund seiner Grösse skaliert float scale; scale=(float) 0.5; Seite 138 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten bild=document.open_image_file("gif","machine.gif","",0); document.place_image(bild,20,350,scale); bild=document.open_image_file("gif","vonnegut.gif","",0); document.place_image(bild,20,100,1); document.end_page(); document.close(); } } 5.2.4 FOP 5.2.4.1 Anwendungsbeispiel 6-1 <?xml version="1.0"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> // Zuerst wird das Layout erstellt, das Layout wird in Grösse A4 erstellt mit jeweiligen // Rändern von 0.5 inch <fo:layout-master-set> <fo:simple-page-master master-name="A4" page-height="842pt" page-width="595pt" margin-top="0.5in" margin-bottom="0.5in" margin-left="0.5in" margin-right="0.5in"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> // Nach der Definition der Layouts werden nun die Inhalte eingefügt. // Dies wird über page-sequence Elemente abgewickelt. Seite 139 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten <fo:page-sequence master-name="A4"> // // // // Das flow Element gibt mittels der Eigenschaft Es sei hier angemerkt das jegliche Positionen das nur die Body region im simple-page-master da ansonsten der Parser an dieser Stelle eine flow-name die Position des Textes an die genutzt werden sollen, hier ist angegeben werden müssen fo:region-body, unbekannte finden würde. <fo:flow flow-name="xsl-region-body"> // Das block Element bietet die Möglichkeit Text zu setzen, es können die Schriftgrösse // die Schriftart gesetzt werden, wie dies auch in der Ausarbeitung angegeben wurde. // Die Eigenschaft space-after (space-before) gibt dabei den Abstand zum nächsfolgenden // Element an. Die line-height gibt die Höhe der Zeile an. // Auf der ersten Seite werden verschiedende Werte für diese Eigenschaften gesetzt. // zusätzlich dazu werden noch weitere Eigenschaften, wie font-weight, die Dicke der Schrift // font-style, der Stil in dem die Schriftart angezeigt wird (z.B. italic) vorgestellt. <fo:block font-size="20pt" font-family="Helvetica" line-height="30pt" space-after="1cm"> <fo:inline text-decoration="underline"> 1.Formatierung des Textes </fo:inline> </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="15pt"> Dieser Text ist : Helvetica Stil:Normal Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="15pt" font-style="italic"> Dieser Text ist : Helvetica Stil:Italic Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="15pt" font-style="oblique"> Dieser Text ist : Helvetica Stil:Oblique Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="15pt" font-weight="bold"> Dieser Text ist : Helvetica Stil:Normal Gewicht:bold Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="15pt" font-style="italic" font-weight="bold"> Dieser Text ist : Helvetica Stil:Italic Gewicht:bold Groesse:15pt Seite 140 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="15pt"> Dieser Text ist : Helvetica Stil:reverse-normal Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="15pt" space-after="1cm"> Dieser Text ist : Helvetica Stil:reverse-oblique Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Courier" line-height="15pt"> Dieser Text ist : Courier Stil:Normal Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Courier" line-height="15pt" font-style="italic"> Dieser Text ist : Courier Stil:Italic Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Courier" line-height="15pt" font-style="oblique"> Dieser Text ist : Courier Stil:Oblique Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Courier" line-height="15pt" font-weight="bold"> Dieser Text ist : Courier Stil:Normal Gewicht:bold Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Courier" line-height="15pt" font-style="italic" font-weight="bold"> Dieser Text ist : Courier Stil:Italic Gewicht:bold Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Courier" line-height="15pt"> Dieser Text ist : Courier Stil:reverse-normal Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Courier" line-height="15pt" space-after="1cm"> Dieser Text ist : Courier Stil:reverse-oblique Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Times" line-height="15pt"> Dieser Text ist : Times Stil:Normal Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Times" line-height="15pt" font-style="italic"> Dieser Text ist : Times Stil:Italic Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Times" line-height="15pt" font-style="oblique"> Dieser Text ist : Times Stil:Oblique Groesse:15pt Seite 141 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten </fo:block> <fo:block font-size="15pt" font-family="Times" line-height="15pt" font-weight="bold"> Dieser Text ist : Times Stil:Normal Gewicht:bold Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Times" line-height="15pt" font-style="italic" font-weight="bold"> Dieser Text ist : Times Stil:Italic Gewicht:bold Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Times" line-height="15pt"> Dieser Text ist : Times Stil:reverse-normal Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Times" line-height="15pt" space-after="1cm"> Dieser Text ist : Times Stil:reverse-oblique Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="Symbol" line-height="15pt" space-after="1cm"> Dieser Text ist : Times Stil:reverse-oblique Groesse:15pt </fo:block> <fo:block font-size="15pt" font-family="ZapfDingbats" line-height="15pt" space-after="1cm"> Dieser Text ist : Times Stil:reverse-oblique Groesse:15pt </fo:block> </fo:flow> </fo:page-sequence> <fo:page-sequence master-name="A4"> // // // // Die zweite Seite widmet sich den weiteren Möglichkeiten den Text hevorzuheben. Die Möglichkeiten des fo:inline Elements werden vorgestellt. Der Parameter text-decoration kann mit verschiedenen Werten (siehe unten) aufgerufen werden und ermöglicht z.B. das Unterstreichend des Textes. <fo:flow flow-name="xsl-region-body"> <fo:block font-size="20pt" font-family="Helvetica" line-height="30pt" space-after="1cm"> <fo:inline text-decoration="underline"> 2. Text hervorheben </fo:inline> </fo:block> Seite 142 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten <fo:block font-size="15pt" font-family="Helvetica" line-height="20pt"> <fo:inline text-decoration="underline"> Dieser Text ist unterstrichen </fo:inline> </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="20pt"> <fo:inline text-decoration="line-through"> Dieser Text ist durchgestrichen </fo:inline> </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="20pt" space-after="1.5cm"> <fo:inline text-decoration="overline"> Dieser Text ist ueberstrichen </fo:inline> </fo:block> // Neben text-decoration, gibt es einen weiteren Parameter color, der die Farbe des Textes // beeinflussen kann. Der Wert des Parameters sind Farbnamen wie red, blue, green etc. // ähnlich der HTML Syntax. <fo:block font-size="20pt" font-family="Helvetica" line-height="30pt" space-after="1cm"> <fo:inline text-decoration="underline"> 3. Text farblich hervorheben </fo:inline> </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="20pt"> <fo:inline color="red"> Dieser Text ist rot </fo:inline> </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="20pt"> <fo:inline color="blue"> Dieser Text ist blau </fo:inline> Seite 143 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="20pt"> <fo:inline color="green"> Dieser Text ist gruen </fo:inline> </fo:block> </fo:flow> </fo:page-sequence> // Die 3. Seite demonstriert die Möglichkeitenn zur Absatzformatierung, hier werden die // Eigenschaften space-after, start-indent und end-indent, swoie auch text-indent erläutert. <fo:page-sequence master-name="A4"> <fo:flow flow-name="xsl-region-body"> <fo:block font-size="20pt" font-family="Helvetica" line-height="30pt" space-after="1cm"> <fo:inline text-decoration="underline"> 4.a Absatztext - Raender </fo:inline> </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="20pt" space-after="0.5cm"> Dieser Text ist etwas laenger um so den automatischen Textumbruch am Ende einer Zeile demonstrieren zu koennen. Der Text wird normal ohne weitere Einstellungen dargestellt. </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="20pt" space-after="0.5cm" start-indent="3cm"> Dieser Text ist etwas laenger um so den automatischen Textumbruch am Ende einer Zeile demonstrieren zu koennen, zusaetzlich wird hier noch ein Abstand von 3cm zum linken Rand gesetzt. </fo:block> Seite 144 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten <fo:block font-size="15pt" font-family="Helvetica" line-height="20pt" space-after="0.5cm" end-indent="3cm"> Dieser Text ist etwas laenger um so den automatischen Textumbruch am Ende einer Zeile demonstrieren zu koennen, zusaetzlich wird hier noch ein Abstand von 3cm zum rechten Rand gesetzt. </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="20pt" space-after="0.5cm" start-indent="3cm" endindent="3cm"> Dieser Text ist etwas laenger um so den automatischen Textumbruch am Ende einer Zeile demonstrieren zu koennen, zusaetzlich wird hier noch ein Abstand von 3cm zum linken Rand und von 3cm zum rechten Rand gesetzt. </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="20pt" space-after="0.5cm" text-indent="3cm"> Dieser Text ist etwas laenger um so den automatischen Textumbruch am Ende einer Zeile demonstrieren zu koennen, zusaetzlich wird hier noch ein Abstand von 3cm zuden Raendern gesetzt. Dieser gilt aber nur fuer die erste Zeile. </fo:block> </fo:flow> </fo:page-sequence> // Die letzte Seite demonstriert die Möglichkeit einen Absatz auszurichten. // Dies erfolgt über die text-align Eigenschaft. Der links und rechts ausgerichtete // Text muss über die Parameter start und end definiert werden. <fo:page-sequence master-name="A4"> <fo:flow flow-name="xsl-region-body"> <fo:block font-size="20pt" font-family="Helvetica" line-height="30pt" space-after="1cm"> <fo:inline text-decoration="underline"> Seite 145 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 4.b Absatztext - Ausrichtung </fo:inline> </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="20pt" space-after="0.5cm"> Dieser Text ist etwas laenger um so den automatischen Textumbruch am Ende einer Zeile demonstrieren zu koennen. Der Text wird normal ohne weitere Einstellungen dargestellt. </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="20pt" space-after="0.5cm" text-align="start"> Dieser Text ist etwas laenger um so den automatischen Textumbruch am Ende einer Zeile demonstrieren zu koennen. Der Text wird nach links-ausgerichtet dargestellt. </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="20pt" space-after="0.5cm" text-align="end"> Dieser Text ist etwas laenger um so den automatischen Textumbruch am Ende einer Zeile demonstrieren zu koennen. Der Text wird nach rechts-ausgerichtet dargestellt. </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="20pt" space-after="0.5cm" text-align="justify"> Dieser Text ist etwas laenger um so den automatischen Textumbruch am Ende einer Zeile demonstrieren zu koennen. Der Text wird im Blocksatz dargestellt. </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="20pt" space-after="0.5cm" text-align="center"> Dieser Text ist etwas laenger um so den automatischen Textumbruch am Ende einer Zeile demonstrieren zu koennen. Der Text wird zentriert dargestellt. </fo:block> </fo:flow> </fo:page-sequence> Seite 146 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Die fünfte Seite zeigt die Möglichkeiten auf einen Rand um einen Absatz zu setzen und // einen padding Abstand zu defnieren. <fo:page-sequence master-name="A4"> <fo:flow flow-name="xsl-region-body"> <fo:block font-size="20pt" font-family="Helvetica" line-height="30pt" space-after="1cm"> <fo:inline text-decoration="underline"> 4.c Absatztext - Padding und Rand </fo:inline> </fo:block> // // // // Hier werden über die color, width, style Attribute des jeweiligen border Positions Elements die Farbe, die Dicke sowie der Stil des Randes gesetzt. Der Stil des Randes muss gestzt werden da dieser voreingestellt none ist und dies dazu führt, dass der Rand nicht angezeigt wird. <fo:block font-size="15pt" font-family="Helvetica" space-after="1cm" border-before-color="black" border-before-width="1mm" border-before-style="solid" border-after-color="black" border-after-width="1mm" border-after-style="solid" border-start-color="black" border-start-width="1mm" border-start-style="solid" border-end-color="black" border-end-width="1mm" border-end-style="solid"> Dieser Text ist etwas laenger um so den automatischen Textumbruch am Ende einer Zeile demonstrieren zu koennen. Der Text wird umrandet dargestellt. </fo:block> // Im letzten Block werden zusätzlich zum Rand noch die 4 Padding Werte des Asbatzes gesetzt // Dies führt dazu das der Abstand zwischen Text und Rand auf 5mm gesetzt wird. <fo:block font-size="15pt" font-family="Helvetica" space-after="1cm" border-before-color="black" border-before-width="1mm" border-before-style="solid" border-after-color="black" border-after-width="1mm" border-after-style="solid" border-start-color="black" border-start-width="1mm" border-start-style="solid" border-end-color="black" border-end-width="1mm" border-end-style="solid" padding-before="5mm" padding-after="5mm" padding-start="5mm" padding-end="5mm"> Dieser Text ist etwas laenger um so den automatischen Textumbruch am Ende einer Zeile Seite 147 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten demonstrieren zu koennen. Der Text wird umrandet dargestellt. Zusätzlich ist ein Padding von jeweils 5mm eingestellt. </fo:block> </fo:flow> </fo:page-sequence> </fo:root> 5.2.4.2 Anwendungsbeispiel 6-2 <?xml version="1.0"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> // Zuerst wird das Layout erstellt, das Layout wird in Grösse A4 erstellt mit jeweiligen // Rändern von 0.5 inch <fo:layout-master-set> <fo:simple-page-master master-name="A4" page-height="842pt" page-width="595pt" margin-top="0.5in" margin-bottom="0.5in" margin-left="0.5in" margin-right="0.5in"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> // Nach der Definition der Layouts werden nun die Inhalte hier die Graphiken eingefügt. // Dies wird über page-sequence Elemente abgewickelt. Seite 148 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten <fo:page-sequence master-name="A4"> // // // // Das flow Element gibt mittels der Eigenschaft Es sei hier angemerkt das jegliche Positionen das nur die Body region im simple-page-master da ansonsten der Parser an dieser Stelle eine flow-name die Position des Textes an die genutzt werden sollen, hier ist angegeben werden müssen fo:region-body, unbekannte finden würde. <fo:flow flow-name="xsl-region-body"> // // // // Das block Element bietet die Möglichkeit Text zu setzen, es können die Schriftgrösse die Schriftart gesetzt werden, wie dies auch in der Ausarbeitung angegeben wurde. Die Eigenschaft space-after (space-before) gibt dabei den Abstand zum nächsfolgenden Element an. Die line-height gibt die Höhe der Zeile an. <fo:block font-size="20pt" font-family="Helvetica" line-height="30pt" space-after="1cm"> // Das inline Element kann auch zur Textausgabe genutzt werden, es erfolgt allerdings am // Ende des Textes kein Zeilenumbruch, wei bei fo:block. // Zusatzlich ist hier eine Hervorhebung wie etwa unterstreichen möglich. <fo:inline text-decoration="underline"> 1.Einfuegen von JPG Graphiken </fo:inline> </fo:block> <fo:block> // Das Einfügen einer Graphik erfolgt über das fo:external-graphic Element // das als Eingeschaft src den Dateinamen der Grafik enthält // GIF ist analog zu JPG <fo:external-graphic src="audi.jpg"/> </fo:block> <fo:block> <fo:external-graphic src="earth.jpg"/> </fo:block> <fo:block> Seite 149 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten <fo:external-graphic src="lotus.jpg"/> </fo:block> </fo:flow> </fo:page-sequence> <fo:page-sequence master-name="A4"> <fo:flow flow-name="xsl-region-body"> <fo:block font-size="20pt" font-family="Helvetica" line-height="30pt" space-after="1cm"> <fo:inline text-decoration="underline"> 1.Einfuegen von GIF Graphiken </fo:inline> </fo:block> <fo:block> <fo:external-graphic src="pencil.gif"/> </fo:block> <fo:block> <fo:external-graphic src="vonnegut.gif"/> </fo:block> <fo:block> <fo:external-graphic src="traffic.gif"/> </fo:block> </fo:flow> </fo:page-sequence> </fo:root> 5.2.4.3 Seite 150 Anwendungsbeispiel 6-3 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten <?xml version="1.0"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> // Zuerst wird das Layout erstellt, das Layout wird in Grösse A4 erstellt mit jeweiligen // Rändern von 0.5 inch <fo:layout-master-set> <fo:simple-page-master master-name="only" page-height="842pt" page-width="595pt" margin-top="0.5in" margin-bottom="0.5in" margin-left="0.5in" margin-right="0.5in"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> // Nach der Definition der Layouts werden nun die Inhalte eingefügt. // Dies wird über page-sequence Elemente abgewickelt. <fo:page-sequence master-name="only"> // // // // Das flow Element gibt mittels der Eigenschaft Es sei hier angemerkt das jegliche Positionen das nur die Body region im simple-page-master da ansonsten der Parser an dieser Stelle eine flow-name die Position des Textes an die genutzt werden sollen, hier ist angegeben werden müssen fo:region-body, unbekannte finden würde. <fo:flow flow-name="xsl-region-body"> <fo:block font-size="20pt" font-family="Helvetica" line-height="30pt" space-after="1cm"> <fo:inline text-decoration="underline"> 1. Einfache Tabelle </fo:inline> </fo:block> // Die Tabellendefinition beginnt mit der Angabe des fo:table Element. Bei folgendem // Aufruf wird bei Anzeigen der Tabelle, nach der Tabelle 1cm Platz freigelassen // bevor die naechsten Inhalte angezeigt werden. <fo:table space-after="1cm"> Seite 151 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Die Tabellendefinition erfordert die Angabe der Spaltenanzahl, diese muss bekant // sein. Eine Spalte wird über fo:table-column angegeben. Hier wird die Breite jeder // Spalte auf 5cm festgelegt. <fo:table-column column-width="50mm"/> <fo:table-column column-width="50mm"/> <fo:table-column column-width="50mm"/> // Der Tabellenkörper nimmt die eigentlichen Inhalte auf. Dieser wird mit fo:table-body // erstellt. <fo:table-body> // // // // Im body werden nun die Reihen der Tabelle eingefüt, eine Reihe wird über fo:table-row erstellt und enthält fo:table-cell Elemente, die die einzelnen Zellen repräsentieren. In der Summe muss die Anzahl an Zellen pro Reihe mit den Spalten übereinstimmen. Ausnahme sind spaltenübergreifende Zellen. <fo:table-row> // Eine Zelle wird angelegt. Diese wird mit einem Rand von 0.5mm erstellt // und mittels border-style-solid wird der Rand angezeigt. <fo:table-cell border-width="0.5mm" border-style="solid"> // Der Inhalt wird durch padding leicht vom Rand entfernt. <fo:block padding-before="5mm" padding-after="5mm" text-align="center" font-weight="bold"> Position </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" text-align="center" font-weight="bold"> Team </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> Seite 152 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten <fo:block padding-before="5mm" padding-after="5mm" Punkte </fo:block> </fo:table-cell> </fo:table-row> <fo:table-row> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" 1 </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" Bayern Muenchen </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" 62 </fo:block> </fo:table-cell> </fo:table-row> <fo:table-row> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" 2 </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" Schalke 04 </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" 59 </fo:block> </fo:table-cell> text-align="center" font-weight="bold"> text-align="center"> text-align="center"> text-align="center"> text-align="center"> text-align="center"> text-align="center"> Seite 153 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten </fo:table-row> <fo:table-row> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" 3 </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" Borussia Dortmund </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" 57 </fo:block> </fo:table-cell> </fo:table-row> <fo:table-row> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" 4 </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" Bayer Leverkusen </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" 54 </fo:block> </fo:table-cell> </fo:table-row> </fo:table-body> </fo:table> Seite 154 text-align="center"> text-align="center"> text-align="center"> text-align="center"> text-align="center"> text-align="center"> Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // In der 2. Tabelle wird die Unterstützung der Darstellung verschiedener Hintergrundfarben // für Zellen, Reihen etc. erläutert. <fo:block font-size="20pt" font-family="Helvetica" line-height="30pt" space-after="1cm"> <fo:inline text-decoration="underline"> 2. Farbunterstuetzung bei Tabellen </fo:inline> </fo:block> <fo:table> <fo:table-column column-width="50mm"/> <fo:table-column column-width="50mm"/> <fo:table-column column-width="50mm"/> <fo:table-body> // Die Reihen werden mit unterschiedlichen Hintergrundfarben erstellt. Dies wird über die background-color // Eigenschaft abgewickelt. <fo:table-row background-color="yellow"> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" text-align="center" font-weight="bold"> Position </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" text-align="center" font-weight="bold"> Team </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" text-align="center" font-weight="bold"> Punkte </fo:block> </fo:table-cell> </fo:table-row> <fo:table-row background-color="red"> <fo:table-cell border-width="0.5mm" border-style="solid"> Seite 155 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten <fo:block padding-before="5mm" padding-after="5mm" 1 </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" Bayern Muenchen </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" 62 </fo:block> </fo:table-cell> </fo:table-row> <fo:table-row background-color="red"> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" 2 </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" Schalke 04 </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" 59 </fo:block> </fo:table-cell> </fo:table-row> <fo:table-row background-color="blue"> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" 3 </fo:block> </fo:table-cell> Seite 156 text-align="center"> text-align="center"> text-align="center"> text-align="center"> text-align="center"> text-align="center"> text-align="center"> Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" Borussia Dortmund </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" 57 </fo:block> </fo:table-cell> </fo:table-row> <fo:table-row background-color="blue"> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" 4 </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" Bayer Leverkusen </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" 54 </fo:block> </fo:table-cell> </fo:table-row> text-align="center"> text-align="center"> text-align="center"> text-align="center"> text-align="center"> </fo:table-body> </fo:table> </fo:flow> </fo:page-sequence> <fo:page-sequence master-name="only"> <fo:flow flow-name="xsl-region-body"> Seite 157 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Die letzte Tabelle demonstriert den Einsatz spaltenübergreifender Zellen // Mittels des Attributs number-columns-spanned="4" kann die 4. Zelle über 4 // Spalten verteilt werden. <fo:block font-size="20pt" font-family="Helvetica" line-height="30pt" space-after="1cm"> <fo:inline text-decoration="underline"> 3. Komplexere Tabelle </fo:inline> </fo:block> <fo:table> <fo:table-column column-width="20mm"/> <fo:table-column column-width="30mm"/> <fo:table-column column-width="30mm"/> <fo:table-column column-width="25mm"/> <fo:table-column column-width="25mm"/> <fo:table-column column-width="25mm"/> <fo:table-column column-width="25mm"/> <fo:table-body background-color="yellow"> <fo:table-row> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" text-align="center" font-weight="bold"> Matnr </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" text-align="center" font-weight="bold"> Name </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" text-align="center" font-weight="bold"> Fachbereich </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid" number-columns-spanned="4"> <fo:block padding-before="5mm" padding-after="5mm" text-align="center" font-weight="bold"> Rechte Seite 158 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten </fo:block> </fo:table-cell> </fo:table-row> <fo:table-row> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" 5678 </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" Steve Reuter </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" Wiwi </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" X </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" text-align="center" font-weight="bold"> text-align="center" font-weight="bold"> text-align="center" font-weight="bold"> text-align="center" font-weight="bold"> text-align="center" font-weight="bold"> </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" text-align="center" font-weight="bold"> X </fo:block> </fo:table-cell> <fo:table-cell border-width="0.5mm" border-style="solid"> <fo:block padding-before="5mm" padding-after="5mm" text-align="center" font-weight="bold"> Seite 159 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten </fo:block> </fo:table-cell> </fo:table-row> </fo:table-body> </fo:table> </fo:flow> </fo:page-sequence> </fo:root> 5.2.4.4 Anwendungsbeispiel 6-4 <?xml version="1.0"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> // Zuerst wird das Layout erstellt, das Layout wird in Grösse A4 erstellt mit jeweiligen // Rändern von 0.5 inch <fo:layout-master-set> <fo:simple-page-master master-name="A4" page-height="842pt" page-width="595pt" margin-top="0.5in" margin-bottom="0.5in" margin-left="0.5in" margin-right="0.5in"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> // Nach der Definition der Layouts werden nun die Inhalte eingefügt. // Dies wird über page-sequence Elemente abgewickelt. Seite 160 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten <fo:page-sequence master-name="A4"> // // // // Das flow Element gibt mittels der Eigenschaft Es sei hier angemerkt das jegliche Positionen das nur die Body region im simple-page-master da ansonsten der Parser an dieser Stelle eine flow-name die Position des Textes an die genutzt werden sollen, hier ist angegeben werden müssen fo:region-body, unbekannte finden würde. <fo:flow flow-name="xsl-region-body"> // // // // Das block Element bietet die Möglichkeit Text zu setzen, es können die Schriftgrösse die Schriftart gesetzt werden, wie dies auch in der Ausarbeitung angegeben wurde. Die Eigenschaft space-after (space-before) gibt dabei den Abstand zum nächsfolgenden Element an. Die line-height gibt die Höhe der Zeile an. <fo:block font-size="20pt" font-family="Helvetica" line-height="30pt" space-after="1cm"> // Das inline Element kann auch zur Textausgabe genutzt werden, es erfolgt allerdings am // Ende des Textes kein Zeilenumbruch, wei bei fo:block. // Zusatzlich ist hier eine Hervorhebung wie etwa unterstreichen möglich. <fo:inline text-decoration="underline"> 1. Referenzen </fo:inline> </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="30pt" space-after="1cm"> // XSL-FO ermöglicht das Plazieren von Referenzen mittels des fo:basic-link Elements, // das als Eigenschaft die Referenz aufnimmt. <fo:basic-link external-destination="http:/www.uni-kl.de">Universitaet Kaiserslautern</fo:basic-link> </fo:block> <fo:block font-size="15pt" font-family="Helvetica" line-height="30pt" space-after="1cm"> <fo:basic-link external-destination="http://xml.apache.org/fop/">FOP Website</fo:basic-link> </fo:block> <fo:block font-size="20pt" font-family="Helvetica" line-height="30pt" space-after="1cm"> Seite 161 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten <fo:inline text-decoration="underline"> 2. Listen </fo:inline> </fo:block> // // // // // // Zu einer weiteren Eigenschaft von XSL-FO zählt die Möglichkeit Listen zu erzeugen. Eine Liste wird über das fo:list-block Element erzeugt. Ein Listenelement wird über fo:list-item erzeugt und enthält ein fo:list-item-label, das das Aufzälungszeichen enthält und ein fo:list-item-body, das den Listentext enthält. Das fo:block Element das den Listentext enthält muss dabei etwas Platz nach links lassen (start-indent), da ansonsten das Aufzählungszeichen überschrieben werden würde. <fo:list-block> <fo:list-item> <fo:list-item-label> <fo:block>*</fo:block> </fo:list-item-label> <fo:list-item-body> <fo:block start-indent="0.5cm">Element</fo:block> </fo:list-item-body> </fo:list-item> <fo:list-item> <fo:list-item-label> <fo:block>*</fo:block> </fo:list-item-label> <fo:list-item-body> <fo:block start-indent="0.5cm">2.Element</fo:block> </fo:list-item-body> </fo:list-item> <fo:list-item> <fo:list-item-label> <fo:block>*</fo:block> </fo:list-item-label> <fo:list-item-body> Seite 162 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten <fo:block start-indent="0.5cm">3.Element</fo:block> </fo:list-item-body> </fo:list-item> </fo:list-block> </fo:flow> </fo:page-sequence> </fo:root> 5.2.5 ClibPDF 5.2.5.1 Anwendungsbeispiel 7-1 /* Beispiel 7-1 Einbinden von Text Demonstriert werden in diesem Anwendungsbeispiel folgende Möglichkeiten Eindbinden eines kurzen Textes Einbinden eines Absatztextes mit Erlaeuterung der Absatzformatierung Textformatierung Texthervorhebung */ #include <stdio.h> #include <stdlib.h> #include <math.h> #include "cpdflib.h" int main(int argc, char *argv[]) Seite 163 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten { CPDFdoc *pdf; char *name="Beispiel71.pdf"; char *textbuff ="Dieser Text ist etwas laenger um den Einsatz eins Absatztextes zu demonstrieren. Ein zweiter Satz wird eingefuegt.\n"; char *textbuff2 ="Dieser Text \nist etwas laenger um den Einsatz eins Absatztextes zu demonstrieren. Ein zweiter Satz wird eingefuegt.\n"; CPDFtboxAttr tboxattr; // Initialisierung der Dokumenternstruktur mittels _open sowie des Datenstroms // mittels _init pdf = cpdf_open(0, NULL); cpdf_enableCompression(pdf, YES); cpdf_init(pdf); // Metainformationen setzen cpdf_setCreator(pdf,"ClibPDF"); cpdf_setTitle(pdf,"TExtformatierung mittels ClibPDF"); cpdf_setSubject(pdf,"Erzeugung von PDF Dokumenten"); cpdf_setKeywords(pdf,"PDF,C"); // 1.Seite erstellen unter Angabe der Informationen: // Seitengroeße sowie Seitenuasrichtung werden ueber _pageInit geseszt // hier wird eine A4 Seite im Hochformat erzeugt. cpdf_pageInit(pdf, 1, PORTRAIT, A4, A4); //cpdf_translate(pdf, 0.0, 6.0); // Ausgeben eines Satzes mit verschiedenen Textformatierungen Seite 164 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Text innerhalb des _beginText und _endText Blockes schreiben cpdf_beginText(pdf, 0); // Ueberschrift definieren und setzen mittels _rawText cpdf_setFont(pdf, "Times-Bold", "WinAnsiEncoding", 20.0); cpdf_rawText(pdf, 50.0, 800.0, 0.0, "1.a Textformatierungen in ClibPDF"); // Die weiteren Texte werden analog zu oberem gesetzt cpdf_setFont(pdf, "Times-Roman", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,740.0,0.0,"Text in Times-Roman 14.0"); cpdf_setFont(pdf, "Times-Bold", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,720.0,0.0,"Text in Times-Bold 14.0"); cpdf_setFont(pdf, "Times-Italic", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,700.0,0.0,"Text in Times-Italic 14.0"); cpdf_setFont(pdf, "Times-BoldItalic", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,680.0,0.0,"Text in Times-BoldItalic 14.0"); cpdf_setFont(pdf, "Courier", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,660.0,0.0,"Text in Courier 14.0"); cpdf_setFont(pdf, "Courier-Bold", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,640.0,0.0,"Text in Courier-Bold 14.0"); cpdf_setFont(pdf, "Courier-Oblique", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,620.0,0.0,"Text in Courier-Oblique 14.0"); cpdf_setFont(pdf, "Courier-BoldOblique", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,600.0,0.0,"Text in Courier-BoldOblique 14.0"); cpdf_setFont(pdf, "Helvetica", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,580.0,0.0,"Text in Helvetica 14.0"); cpdf_setFont(pdf, "Helvetica-Bold", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,560.0,0.0,"Text in Helvetica-Bold 14.0"); cpdf_setFont(pdf, "Helvetica-Oblique", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,540.0,0.0,"Text in Helvetica-Oblique 14.0"); cpdf_setFont(pdf, "Helvetica-BoldOblique", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,520.0,0.0,"Text in Helvetica-BoldOblique 14.0"); Seite 165 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten cpdf_setFont(pdf, "Symbol", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,500.0,0.0,"Text in Symbol 14.0"); cpdf_setFont(pdf, "ZapfDingbats", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,480.0,0.0,"Text in ZapfDingbats 14.0"); // Ueberschrift definieren und setzen mittels _rawText cpdf_setFont(pdf, "Times-Bold", "WinAnsiEncoding", 20.0); cpdf_rawText(pdf, 50.0, 400.0, 0.0, "1.b Text farbig unterlegen in ClibPDF"); cpdf_setFont(pdf, "Helvetica", "WinAnsiEncoding", 14.0); // // // // Im folgenden wird mittels _setrgbcolor eine Farbe gesetzt, in der ein Text spaeter dargestellt wird. Die 3 Parameter r,g,b nehmen Werte zwischen 0 und 1 an stellen dabei keinen Einsatz, sowie volle Inetnsitaet der Farbe dar. cpdf_setrgbcolor(pdf,1.0,0.0,0.0); cpdf_rawText(pdf,70.0,350.0,0.0,"Text in rot"); cpdf_setrgbcolor(pdf,0.0,1.0,0.0); cpdf_rawText(pdf,70.0,330.0,0.0,"Text in gruen"); cpdf_setrgbcolor(pdf,0.0,0.0,1.0); cpdf_rawText(pdf,70.0,310.0,0.0,"Text in blau"); // Ueberschrift definieren und setzen mittels _rawText cpdf_setrgbcolor(pdf,0.0,0.0,0.0); cpdf_setFont(pdf, "Times-Bold", "WinAnsiEncoding", 20.0); cpdf_rawText(pdf, 50.0, 250.0, 0.0, "1.c Text rotieren"); // Hier wird der 4. Parameter der _rawtext Funktion ausgenutzt // der die orientation angibt. Als Beispiel wird der Text um Seite 166 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // 22.5 Grad rotiert dargestellt. cpdf_setFont(pdf, "Helvetica", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,160.0,22.6,"Text rotiert um 22.5 Grad"); cpdf_endText(pdf); // 2.Seite erstellen unter Angabe der Informationen: // Seitengroeße sowie Seitenausrichtung werden ueber _pageInit geseszt // hier wird eine A4 Seite im Hochformat erzeugt. cpdf_pageInit(pdf, 2, PORTRAIT, A4, A4); // Text innerhalb des _beginText und _endText Blockes schreiben cpdf_beginText(pdf, 0); // Ueberschrift definieren und setzen mittels _rawText // // // // // // // // // Folgendes Beispiel ist leider vom Ergebnis her nicht sehr aussagekraeftig es demonstriert aber den Einsatz des Parameters alignmode. Ein Text wird neun mal an gleicher Stelle ausgegeben, der Parameter alignmode, der angibt welche Position des Textes genutzt wird um den Text zu positionieren. Beispielsweise ist die Standardeinstellung linke untere Ecke des Textes. Wird nun also ein x,y Wert von 70.0,750.0 angegeben, dann wird an dieser Stelle die liunke untere Ecke des Textes sein. Hier wird aber nun diese Standard Einstellung geaendert, und alle neun Moeglichkeiten werden angegeben. Zur Demonstration werden die einzelnen Texte mit untersachiedlicher Farbe ausgegeben. cpdf_setFont(pdf, "Times-Bold", "WinAnsiEncoding", 20.0); cpdf_rawText(pdf, 50.0, 800.0, 0.0, "1.d Parameter alignmode im Einsatz"); cpdf_setFont(pdf, "Courier", "WinAnsiEncoding", 14.0); Seite 167 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten cpdf_rawTextAligned(pdf, 200.0, 750.0, 0.0,TEXTPOS_UL, "Textbereich"); cpdf_setrgbcolor(pdf,1.0,0.0,0.0); cpdf_rawTextAligned(pdf, 200.0, 750.0, 0.0,TEXTPOS_ML, "Textbereich"); cpdf_setrgbcolor(pdf,0.0,1.0,0.0); cpdf_rawTextAligned(pdf, 200.0, 750.0, 0.0,TEXTPOS_LL, "Textbereich"); cpdf_setrgbcolor(pdf,0.0,0.0,1.0); cpdf_rawTextAligned(pdf, 200.0, 750.0, 0.0,TEXTPOS_UM, "Textbereich"); cpdf_setrgbcolor(pdf,1.0,1.0,0.0); cpdf_rawTextAligned(pdf, 200.0, 750.0, 0.0,TEXTPOS_MM, "Textbereich"); cpdf_setrgbcolor(pdf,0.0,1.0,1.0); cpdf_rawTextAligned(pdf, 200.0, 750.0, 0.0,TEXTPOS_LM, "Textbereich"); cpdf_setrgbcolor(pdf,1.0,0.0,1.0); cpdf_rawTextAligned(pdf, 200.0, 750.0, 0.0,TEXTPOS_UR, "Textbereich"); cpdf_setrgbcolor(pdf,0.5,0.5,0.5); cpdf_rawTextAligned(pdf, 200.0, 750.0, 0.0,TEXTPOS_MR, "Textbereich"); cpdf_setrgbcolor(pdf,0.5,0.0,0.5); cpdf_rawTextAligned(pdf, 200.0, 750.0, 0.0,TEXTPOS_LR, "Textbereich"); // Nun wird das Einfuegen eines Absatztextes demonstriert cpdf_setrgbcolor(pdf,0.0,0.0,0.0); cpdf_setFont(pdf, "Times-Bold", "WinAnsiEncoding", 20.0); cpdf_rawText(pdf, 50.0, 700.0, 0.0, "2. Absatztext"); cpdf_rawText(pdf, 50.0, 680.0, 0.0, "2.a Text innerhalb eines Bereiches anzeigen"); cpdf_setFont(pdf, "Courier", "WinAnsiEncoding", 14.0); cpdf_endText(pdf); // Vorab werden zwei Rechtecke gezeichnet die den Textbereich anschaulich darstellen //sollen, diese werden mittels _rawRect gesetzt. cpdf_gsave(pdf); Seite 168 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten cpdf_setrgbcolorStroke(pdf,0.0,0.0,0.0); cpdf_setrgbcolorFill(pdf,1.0,1.0,1.0); cpdf_rawRect(pdf,70.0,560.0,200.0,100.0); cpdf_rawRect(pdf,300.0,560.0,200.0,100.0); cpdf_fillAndStroke(pdf); cpdf_grestore(pdf); // // // // // // // Nun werden mittels _rawTextboxFit 2 rechteckicke Textbereiche erzeugt in denen jeweils der gleiche Text mit unterschiedlicher Schriftgroesse gesetzt wird. Bei der ersten Funktion wird versucht den Text mit Schriftgroesse 25 anzuzeigen bei 2terer Funktion der Text in 14.0. Wie man im Beispiel sieht fuellt der 2. Text das Rechteck nicht voellig aus. Der erste Text ist mit 25.0 Punkten aber wesentlich zu gross und wuerde nicht hineinpassen, er wird jeweils um 1.0 Punkte verkleinert um ihn im angegebenen Bereich anzeigen zu koennen. cpdf_beginText(pdf, 0); cpdf_rawTextBoxFit(pdf,70.0,560.0,200.0,100.0,0.0,25.0,1.0,12.0,NULL,textbuff); cpdf_rawTextBoxFit(pdf,300.0,560.0,200.0,100.0,0.0,14.0,1.0,12.0,NULL,textbuff); cpdf_endText(pdf); // Im folgenden Bereich werden nun die Moeglichkeiten aufgezeigt die der Parameter // tboxattr zur Verfuegung stellt: cpdf_beginText(pdf, 0); cpdf_setrgbcolor(pdf,0.0,0.0,0.0); cpdf_setFont(pdf, "Times-Bold", "WinAnsiEncoding", 20.0); cpdf_rawText(pdf, 50.0, 520.0, 0.0, "2.b CPDFtboxAttr Struktur im Einsatz"); cpdf_setFont(pdf, "Courier", "WinAnsiEncoding", 14.0); cpdf_endText(pdf); // Der parameter alignmode gibt die Ausrichtung des Textes innerhalb des Bereiches an // Der Parameter NLmode gibt an ob ein Escape Zeichen \n als Zeilensprung (Wert=1) interpretiert // wird oder ob dieses einfach ignoriert wird (Wert=0) Seite 169 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // // // // Mittels paragraphSpacing kann man nach einem Paragraph extra Platz lassen zum naechsten Die Angabe erfolgt in Punkten. noMark kann eingestzt werden um zu ermitteln ob Text passt, der Text wird nicht angezeigt der Rueckgabeparameter gibt dann Aufschluss ueber die Groesse des Textes. // Im folgenden werden drei mal 2 Textbereiche dargestellt. // Bei den ersten beiden wird der Einsatz des NLmode Parameters erlaeutert // Es wird zweimal der gleiche Text dargestellt, dieser wird je nach Wert // unterschiedlich dargestellt. // Zusaetzlich dazu wird der Parameter alignmode fuer jedes Paar veraendert // Das erste Paar wird rechts ausgerichtet dargestellt, das zeweite Paar zentriert // und letzteres Paar im Blocksatz // Zu erwaehnen ist noch das das Paar aus Abschnitt 2.a die Standardwerte besitzt und somit // einen links ausgerichteten Text darstellt. tboxattr.alignmode = TBOX_RIGHT; tboxattr.NLmode = 0; tboxattr.paragraphSpacing = 12.0; tboxattr.noMark = 0; cpdf_beginText(pdf, 0); cpdf_rawTextBoxFit(pdf,70.0,400.0,200.0,100.0,0.0,14.0,1.0,12.0,&tboxattr,textbuff2); cpdf_endText(pdf); tboxattr.NLmode = 1; cpdf_beginText(pdf, 0); cpdf_rawTextBoxFit(pdf,300.0,400.0,200.0,100.0,0.0,14.0,1.0,12.0,&tboxattr,textbuff2); Seite 170 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten cpdf_endText(pdf); tboxattr.alignmode = TBOX_CENTER; tboxattr.NLmode = 0; tboxattr.paragraphSpacing = 12.0; tboxattr.noMark = 0; cpdf_beginText(pdf, 0); cpdf_rawTextBoxFit(pdf,70.0,220.0,200.0,100.0,0.0,25.0,1.0,12.0,&tboxattr,textbuff); cpdf_rawTextBoxFit(pdf,300.0,220.0,200.0,100.0,0.0,14.0,1.0,12.0,&tboxattr,textbuff); cpdf_endText(pdf); tboxattr.alignmode = TBOX_JUSTIFY; tboxattr.NLmode = 0; tboxattr.paragraphSpacing = 12.0; tboxattr.noMark = 0; cpdf_beginText(pdf, 0); cpdf_rawTextBoxFit(pdf,70.0,40.0,200.0,100.0,0.0,25.0,1.0,12.0,&tboxattr,textbuff); cpdf_rawTextBoxFit(pdf,300.0,40.0,200.0,100.0,0.0,14.0,1.0,12.0,&tboxattr,textbuff); cpdf_endText(pdf); // 3.Seite definieren cpdf_pageInit(pdf, 3, PORTRAIT, A4, A4); // Text innerhalb des _beginText und _endText Blockes schreiben cpdf_beginText(pdf, 0); Seite 171 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Ueberschrift definieren und setzen mittels _rawText cpdf_setFont(pdf, "Times-Bold", "WinAnsiEncoding", 20.0); cpdf_rawText(pdf, 50.0, 800.0, 0.0, "3. Low Level Textfunktionen"); cpdf_endText(pdf); // // // // // // In diesem Bereich werden nun die Low-Level Textfunktionen aufgerufen. Es wird mittels _setTextLEading ein Pufferbereich definert, dann wird der Textcursor an die Position 70.0,750.0 gesetzt. Anschliessend wird an dieser POosition Text ausgegeben. Mittels _textCRLFshow kann dann in den folgenden Zeilen weiterer Text ausgegeben werden. _textCRLF fuehrt einen Zeilensprung aus. cpdf_beginText(pdf, 0); cpdf_setFont(pdf, "Courier", "WinAnsiEncoding", 14.0); cpdf_setTextLeading(pdf, 20.0); cpdf_rawSetTextPosition(pdf, 70.0, 750.0); cpdf_textShow(pdf, "Dies ist die erste Zeile des Textes."); cpdf_textCRLFshow(pdf, "Dieser wird nun fortgesetzt"); cpdf_textCRLF(pdf); cpdf_textCRLFshow(pdf, "und in dieser Zeile beendet."); cpdf_endText(pdf); // 4.Seite definieren cpdf_pageInit(pdf, 4, PORTRAIT, A4, A4); // Text innerhalb des _beginText und _endText Blockes schreiben cpdf_beginText(pdf, 0); Seite 172 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Ueberschrift definieren und setzen mittels _rawText cpdf_setFont(pdf, "Times-Bold", "WinAnsiEncoding", 20.0); cpdf_rawText(pdf, 50.0, 800.0, 0.0, "4. Weitere Textfunktionen"); cpdf_endText(pdf); cpdf_beginText(pdf, 0); cpdf_setFont(pdf, "Courier", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,750.0,0.0,"Normaler Text ohne weitere Einstellungen"); cpdf_endText(pdf); cpdf_setCharacterSpacing(pdf,1); cpdf_beginText(pdf, 0); cpdf_setFont(pdf, "Courier", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,720.0,0.0,"Bereich zwischen zwei Zeichen wurde auf 1 Punkt gesetzt"); cpdf_endText(pdf); cpdf_setWordSpacing(pdf,5); cpdf_setCharacterSpacing(pdf,0); cpdf_beginText(pdf, 0); cpdf_setFont(pdf, "Courier", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,700.0,0.0,"Bereich zwischen zwei Worten wurde auf 5 Punkte gesetzt"); cpdf_endText(pdf); cpdf_setHorizontalScaling(pdf,150.0); cpdf_setWordSpacing(pdf,0); cpdf_setCharacterSpacing(pdf,0); cpdf_beginText(pdf, 0); cpdf_setFont(pdf, "Courier", "WinAnsiEncoding", 14.0); cpdf_rawText(pdf,70.0,680.0,0.0,"Text wird horizontal skaliert auf 150%"); cpdf_endText(pdf); Seite 173 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten cpdf_setHorizontalScaling(pdf,100.0); cpdf_setWordSpacing(pdf,0); cpdf_setCharacterSpacing(pdf,0); cpdf_beginText(pdf, 0); // Ueberschrift definieren und setzen mittels _rawText cpdf_setFont(pdf, "Times-Bold", "WinAnsiEncoding", 20.0); cpdf_rawText(pdf, 50.0, 650.0, 0.0, "5. Text-Render Modi"); cpdf_endText(pdf); cpdf_setrgbcolorFill(pdf,0.0,0.0,0.0); cpdf_setrgbcolorStroke(pdf,1.0,0.0,0.0); // Im folgenden werden die Textrendermodi dargstellt cpdf_beginText(pdf, 0); cpdf_setFont(pdf, "Courier", "WinAnsiEncoding", 14.0); cpdf_setTextRenderingMode(pdf,TEXT_FILL); cpdf_rawText(pdf,70.0,620.0,0.0,"Text im Modus TEXT_FILL"); cpdf_setTextRenderingMode(pdf,TEXT_STROKE); cpdf_rawText(pdf,70.0,600.0,0.0,"Text im Modus TEXT_STROKE"); cpdf_setTextRenderingMode(pdf,TEXT_FILL_STROKE); cpdf_rawText(pdf,70.0,580.0,0.0,"Text im Modus TEXT_FILL_STROKE"); cpdf_setTextRenderingMode(pdf,TEXT_INVISIBLE); cpdf_rawText(pdf,70.0,560.0,0.0,"Text im Modus TEXT_INVISIBLE"); cpdf_setTextRenderingMode(pdf,TEXT_FILL_CLIP); cpdf_rawText(pdf,70.0,540.0,0.0,"Text im Modus TEXT_FILL_CLIP"); cpdf_setTextRenderingMode(pdf,TEXT_STROKE_CLIP); cpdf_rawText(pdf,70.0,520.0,0.0,"Text im Modus TEXT_STROKE_CLIP"); cpdf_setTextRenderingMode(pdf,TEXT_FILL_STROKE_CLIP); cpdf_rawText(pdf,70.0,500.0,0.0,"Text im Modus TEXT_FILL_STROKE_CLIP"); cpdf_setTextRenderingMode(pdf,TEXT_CLIP); Seite 174 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten cpdf_rawText(pdf,70.0,480.0,0.0,"Text im Modus TEXT_CLIP"); cpdf_endText(pdf); // Datenstrom beenden und anschliessend in Datei umleiten cpdf_finalizeAll(pdf); cpdf_savePDFmemoryStreamToFile(pdf, name); // Abschliessend werden alle Ressourcen wieder freigegeben cpdf_launchPreview(pdf); cpdf_close(pdf); printf("PDF Datei wurde erzeugt\n"); return(0); } 5.2.5.2 Anwendungsbeispiel 7-2 /* Beispiel 7-2 Einbinden von Graphiken Demonstriert werden in diesem Anwendungsbeispiel folgende Möglichkeiten Einbinden von JPEG Graphiken, da diese Version nur diese Format unterstuetzt */ #include <stdio.h> #include <stdlib.h> Seite 175 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten #include <math.h> #include "cpdflib.h" int main(int argc, char *argv[]) { CPDFdoc *pdf; char *name="Beispiel72.pdf"; float width = 0, height = 0, xscal = 0.0, yscal = 0.0; // Initialisierung der Dokumenternstruktur mittels _open sowie des Datenstroms // mittels _init pdf = cpdf_open(0, NULL); cpdf_enableCompression(pdf, YES); cpdf_init(pdf); // Metainformationen setzen cpdf_setCreator(pdf,"ClibPDF"); cpdf_setTitle(pdf,"Einbinden von Graphiken mittels ClibPDF"); cpdf_setSubject(pdf,"Erzeugung von PDF Dokumenten"); cpdf_setKeywords(pdf,"PDF,C"); // 1.Seite erstellen unter Angabe der Informationen: // Seitengroeße sowie Seitenuasrichtung werden ueber _pageInit geseszt // hier wird eine A4 Seite im Hochformat erzeugt. cpdf_pageInit(pdf, 1, PORTRAIT, A4, A4); // Text innerhalb des _beginText und _endText Blockes schreiben cpdf_beginText(pdf, 0); // Ueberschrift definieren und setzen mittels _rawText cpdf_setFont(pdf, "Times-Bold", "WinAnsiEncoding", 20.0); Seite 176 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten cpdf_rawText(pdf, 50.0, 800.0, 0.0, "1. Einbinden von JPEG Graphiken"); cpdf_endText(pdf); // // // // // // // Die Graphiken werden mittels der _rawImportImage Funktion gesetzt Zu erwaehnen sind hier die 4 Parameter width,height,xscal,yscal die mittels ihrer Adresse uebergeben werden. Werden width und height auf 0 gesetzt ermittelt ClibPDF die Hoehe und Breite und setzt diese dann selbst. xscal und yscal geben die Moeglichkeit an das Bild zu skalieren. Die width und height Werte muessen fuer jedes Bild wieder auf 0 gesetzt werden, da ansonsten die Dimensionen vom vorherigen Bild uebernommen wuerden. cpdf_rawImportImage(pdf, width = 0; height = 0; cpdf_rawImportImage(pdf, width = 0; height = 0; cpdf_rawImportImage(pdf, "audi.jpg", JPEG_IMG, 70, 550, 0.0, &width, &height, &xscal, &yscal, 1); "earth.jpg", JPEG_IMG, 70, 325, 0.0, &width, &height, &xscal, &yscal, 1); "lotus.jpg", JPEG_IMG, 70, 50, 0.0, &width, &height, &xscal, &yscal, 1); // Datenstrom beenden und anschliessend in Datei umleiten cpdf_finalizeAll(pdf); cpdf_savePDFmemoryStreamToFile(pdf, name); // Abschliessend werden alle Ressourcen wieder freigegeben cpdf_launchPreview(pdf); cpdf_close(pdf); printf("PDF Datei wurde erzeugt\n"); return(0); } Seite 177 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 5.2.6 Java PDF Toolkit 5.2.6.1 Anwendungsbeispiel 8-1 import com.glance.pdf.engine.*; public class Beispiel81 { public static void main(String[] args) { try { // BTemplate erstellen, dieses Template verwaltet alle Frames die folgend eingefügt werden. BTemplate template = new BTemplate(); //####################################### Metinformationen ################################### DocumentInfo meta = new DocumentInfo(); meta.setAuthor("Tom Koenig"); meta.setKeywords("PDF,Java"); meta.setTitle("Beispiel 8-1 Einbinden von Text"); meta.setSubject("Erzeugung von PDF-Dokumenten"); //####################################### Seite 1 ########################################### //####################################### Frames ########################################### // Das erste Frame definiert die Ueberschrift des Absatzes // Der letzte Parameter gibt jeweils die Seite an an der das Frame erscheint hier die erste Frame ueberschrift11 = new Frame ("ueberschrift1",20,770,400,50,1); // Das zweite Frame wird den formatierten Text aufnehmen Frame myFrame11 = new Frame( "myFrame11", 40, 620, 400, 160, 1 ); Seite 178 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Das nächste Frame wird die 2. Überschrift aufnehmen Frame ueberschrift12 = new Frame ("ueberschrift2",20,550,400,50,1); // Das vierte Frame wird den farblich veränderten Text aufnehmen Frame myFrame12 = new Frame( "myFrame12", 40, 420, 400, 160, 1 ); //####################################### Text ########################################### // Nach der Definition der einzelnen Frames für die erste Seite erfolgt nun die Angabe des Textes // Nun wird der Überschriftstext definiert und entsprechend formatiert. Text ub11 = new Text("1.a Textformatierung"); ub11.setDefaultFont( new Font( "Helvetica-Bold", 20, Font.ALIGN_LEFT, Color.BLACK ) ); // Im folgenden wird ein Text erzeugt, der innerhalb der String-Angabe unter Verwendung // des <FONT..> Operators formatiert wird. Text text11 = new Text( "<FONT:Courier;14;000000>Dieser Text ist Courier 14Punkt>\n" + "<FONT:Courier-Bold;14;000000>Dieser Text ist Courier-Bold 14Punkt>\n" + "<FONT:Courier-Oblique;14;000000>Dieser Text ist Courier-Oblique 14Punkt>\n" + "<FONT:Times-Roman;14;000000>Dieser Text ist Times-Roman 14Punkt>\n" + "<FONT:Times-Bold;14;000000>Dieser Text ist Times-Bold 14Punkt>\n" + "<FONT:Times-Italic;14;000000>Dieser Text ist Times-Oblique 14Punkt>\n" + "<FONT:Helvetica;14;000000>Dieser Text ist Helvetica 14Punkt>\n" + "<FONT:Helvetica-Bold;14;000000>Dieser Text ist Helvetica-Bold 14Punkt>\n" + "<FONT:Helvetica-Oblique;14;000000>Dieser Text ist Helvetica-Oblique 14Punkt>\n" + "<FONT:Symbol;14;000000>Dieser Text ist Symbol 14Punkt>\n" + "<FONT:ZapfDingbats;14;000000>Dieser Text ist ZapfDingbats 14Punkt>\n"); // Die zweite Überschrift wird definiert und entsprechend formatiert. Text ub12 = new Text("1.b Farbliche Texthervorhebung"); ub12.setDefaultFont( new Font( "Helvetica-Bold", 20, Font.ALIGN_LEFT, Color.BLACK ) ); Seite 179 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // // // // // // // Im folgenden wird ein Text erzeugt, der innerhalb der String-Angabe unter Verwendung des <FONT..> Operators farblich verändert wird. Angemerkt sei hier das nicht die vordefinierten Werte genutzt werden sondern eigene Werte über das rrggbb System gesetzt werden. Ein Beispiel für die Verwendung der Parameter kann bei der Formatierung der Überschriften eingesehen werden. Das Farbsystem erfolgt über hexadezimal Werte. Es werden jeweils ein drei mal 2stellige Hexadezimalwerte für rot grün und blau spezifiziert. Der Wertebereich reicht von 00 =0 bis FF=255. Beispielsweise wäre FF0000 somit rot. etc Text text12 = new Text( "<FONT:Courier;14;FF0000>Dieser Text ist rot>\n" + "<FONT:Courier-Bold;14;FFFF00>Dieser Text ist gelb>\n" + "<FONT:Courier-Oblique;14;FF00FF>Dieser Text ist violett 14Punkt>\n"); //####################################### Seite 2 ########################################### // Auf der 2.Seite wird nun die Absatzausrichtung erläutert //####################################### Frames ########################################### // Das erste Frame definiert die Ueberschrift des Absatzes // Der letzte Parameter gibt jeweils die Seite an an der das Frame erscheint hier die erste Frame ueberschrift21 = new Frame ("ueberschrift21",20,770,400,50,2); // Folgende Frames werden den formatierten Absatztext Text aufnehmen Frame myFrame21 = new Frame( "myFrame21", 40, 520, 400, 200, 2 ); // Das zweite Frame wird den formatierten Text aufnehmen Frame myFrame22 = new Frame( "myFrame22", 40, 400, 400, 200, 2 ); // Das zweite Frame wird den formatierten Text aufnehmen Frame myFrame23 = new Frame( "myFrame23", 40, 280, 400, 200, 2 ); // Das zweite Frame wird den formatierten Text aufnehmen Frame myFrame24 = new Frame( "myFrame24", 40, 160, 400, 200, 2 ); //####################################### Text ########################################### Seite 180 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // innerhalb der Font Angabe kann der jeweilige vordefnierte Wert gesetzt werden. Text ub21 = new Text("1.c Absatzformatierung - Textausrichtung"); ub21.setDefaultFont( new Font( "Helvetica-Bold", 20, Font.ALIGN_LEFT, Color.BLACK ) ); Text text21 = new Text( "Dieser Text ist länger und wird nicht explizit durch Angabe eines " + "Escape Zeichens umgebrochen. Dieser Text wird vier mal angezeigt " + "jeweils unter Verwendung unterschieldicher Textausrichtung " + "AUSRICHTUNG :LINKS"); text21.setDefaultFont( new Font( "Helvetica-Bold", 14, Font.ALIGN_LEFT, Color.BLACK ) ); Text text22 = new Text( "Dieser Text ist länger und wird nicht explizit durch Angabe eines" + "Escape Zeichens umgebrochen. Dieser Text wird vier mal angezeigt" + "jeweils unter Verwendung unterschieldicher Textausrichtung" + "AUSRICHTUNG :RECHTS"); text22.setDefaultFont( new Font( "Helvetica-Bold", 14, Font.ALIGN_RIGHT, Color.BLACK ) ); Text text23 = new Text( "Dieser Text ist länger und wird nicht explizit durch Angabe eines" + "Escape Zeichens umgebrochen. Dieser Text wird vier mal angezeigt" + "jeweils unter Verwendung unterschieldicher Textausrichtung" + "AUSRICHTUNG :ZENTRIERT"); text23.setDefaultFont( new Font( "Helvetica-Bold", 14, Font.ALIGN_CENTER, Color.BLACK ) ); Text text24 = new Text( "Dieser Text ist länger und wird nicht explizit durch Angabe eines" + "Escape Zeichens umgebrochen. Dieser Text wird vier mal angezeigt" + "jeweils unter Verwendung unterschieldicher Textausrichtung" + "AUSRICHTUNG :BLOCKSATZ"); text24.setDefaultFont( new Font( "Helvetica-Bold", 14, Font.ALIGN_JUSTIF, Color.BLACK ) ); //####################################### Seite 3 ########################################### // Hier werden nu zusätzliche Eigenschaften wie der Render Modus erläutert //####################################### Frames ########################################### // Das erste Frame definiert die Ueberschrift des Absatzes // Der letzte Parameter gibt jeweils die Seite an an der das Frame erscheint hier die erste Seite 181 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Frame ueberschrift31 = new Frame ("ueberschrift31",20,770,400,50,3); // Folgende Frames werden den formatierten Absatztext Text aufnehmen Frame myFrame31 = new Frame( "myFrame31", 40, 520, 400, 200, 3 ); // Das zweite Frame wird den formatierten Text aufnehmen Frame myFrame32 = new Frame( "myFrame32", 40, 400, 400, 200, 3 ); // Das zweite Frame wird den formatierten Text aufnehmen Frame myFrame33 = new Frame( "myFrame33", 40, 280, 400, 200, 3 ); // Das zweite Frame wird den formatierten Text aufnehmen Frame myFrame34 = new Frame( "myFrame34", 40, 160, 400, 200, 3 ); //####################################### Text ########################################### Text ub31 = new Text("1.d Text Rendermodus"); ub31.setDefaultFont( new Font( "Helvetica-Bold", 20, Font.ALIGN_LEFT, Color.BLACK ) ); Text text31 = new Text( "Dieser Text wird normal angezeigt"); Font font1 =new Font( "Helvetica-Bold", 14); text31.setDefaultFont(font1); // Folgend werden nun die beiden nicht standard Modi gesetzt Text text32 = new Text( "Dieser Text wird im Rendermodus RENDERING_OUTLINE angezeigt"); Font font2 =new Font( "Helvetica-Bold", 14); font2.setRenderingStyle(Font.RENDERING_OUTLINE); text32.setDefaultFont(font2); Text text33 = new Text( "Dieser Text wird im Rendermodus RENDERING_OUTLINEANDFILL angezeigt"); Font font3 =new Font( "Helvetica-Bold", 14); font3.setRenderingStyle(Font.RENDERING_OUTLINEANDFILL); text33.setDefaultFont(font3); Seite 182 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten //####################################### Seite 4 ########################################### // Diese Seite demonstriert den Einsatz sogenannter Patterns, vordefinierte Text-Werte //####################################### Frames ########################################### // Das erste Frame definiert die Ueberschrift des Absatzes // Der letzte Parameter gibt jeweils die Seite an an der das Frame erscheint hier die erste Frame ueberschrift41 = new Frame ("ueberschrift41",20,770,400,50,4); // Das zweite Frame wird den formatierten Text aufnehmen Frame myFrame41 = new Frame( "myFrame41", 40, 620, 400, 160, 4 ); //####################################### Text ########################################### // Nach der Definition der einzelnen Frames für die erste Seite erfolgt nun die Angabe des Textes // Nun wird der Überschriftstext definiert und entsprechend formatiert. Text ub41 = new Text("4. Text Pattern vordefinerte Informationen"); ub41.setDefaultFont( new Font( "Helvetica-Bold", 20, Font.ALIGN_LEFT, Color.BLACK ) ); // Im folgenden wird ein Text erzeugt, der alle Paqtterns im Einsatz zeigt. // Die Pattern pages und tpages funktionieren nicht wie gewollt, diese geben immer 0 Seiten an // die beiden anderen Pattern funktionieren einwandfrei. Text text41 = new Text( "Dieses Dokument hat insgesamt <%pages%> Seiten, dies ist Seite <%page%>\n" + "Dieses Template hat insgesamt <%tpages%> Seiten, dies ist Seite <%tpage%>"); //####################################### Inhalte übergeben ################################### // Nachdem die Inhalte spezifiziert wurden, müssen sie an das Template übergeben werden Seite 183 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten template.addFrame( ueberschrift11, template.addFrame( myFrame11, text11 template.addFrame( ueberschrift12, template.addFrame( myFrame12, text12 template.addFrame( ueberschrift11, template.addFrame( myFrame11, text11 template.addFrame( ueberschrift12, template.addFrame( myFrame12, text12 template.addFrame( ueberschrift21, template.addFrame( myFrame21, text21 template.addFrame( myFrame22, text22 template.addFrame( myFrame23, text23 template.addFrame( myFrame24, text24 template.addFrame( ueberschrift31, template.addFrame( myFrame31, text31 template.addFrame( myFrame32, text32 template.addFrame( myFrame33, text33 template.addFrame( ueberschrift41, template.addFrame( myFrame41, text41 ub11 ); ub12 ); ub11 ); ub12 ); ub21 ); ); ); ); ub31 ); ); ); ub41 ); ); ); ); ); ); ); ); //####################################### Dokument generieren ################################### // Nachdem alle Inhalte an die Templates übergeben wurden kann das Dokument erzeugt werden, // dazu wird ein Generator Objekt angelegt mit Dateinamen des Dokuments, das Template wird übergeben // anschliessend wird das Dokument mittels generate erzeugt. Generator generator = new Generator( "Beispiel81.pdf" ); generator.addTemplate( template ); generator.setDocumentInfo(meta); generator.generate(); } catch ( Exception e ) { System.out.println( "Error occured: " + e.toString() ); } Seite 184 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten } } 5.2.6.2 Anwendungsbeispiel 8-2 import com.glance.pdf.engine.*; //####################################### Einbinden von Graphiken ########################################### public class Beispiel82 { public static void main(String[] args) { try { // BTemplate erstellen, dieses Template verwaltet alle Frames die folgend eingefügt werden. BTemplate template = new BTemplate(); //####################################### Metinformationen ################################### DocumentInfo meta = new DocumentInfo(); meta.setAuthor("Tom Koenig"); meta.setKeywords("PDF,Java"); meta.setTitle("Beispiel 8-2 Einbinden von Graphiken"); meta.setSubject("Erzeugung von PDF-Dokumenten"); //####################################### Seite 1 ########################################### // Auf der 1.Seite werden die JPEG Graphiken eingebunden //####################################### Frames ########################################### Seite 185 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Das erste Frame definiert die Ueberschrift des Absatzes // Der letzte Parameter gibt jeweils die Seite an an der das Frame erscheint hier die erste Frame ueberschrift11 = new Frame ("ueberschrift11",20,770,400,50,1); // Folgende Frames werden den formatierten Absatztext Text aufnehmen Frame myFrame11 = new Frame( "myFrame11", 40, 580, 400, 200, 1 ); // Das zweite Frame wird den formatierten Text aufnehmen Frame myFrame12 = new Frame( "myFrame12", 40, 320, 400, 200, 1 ); // Das zweite Frame wird den formatierten Text aufnehmen Frame myFrame13 = new Frame( "myFrame13", 40, 10, 400, 200, 1 ); //####################################### Text ########################################### Text ub11 = new Text("1. JPEG Graphiken"); ub11.setDefaultFont( new Font( "Helvetica-Bold", 20, Font.ALIGN_LEFT, Color.BLACK ) ); //####################################### Bilder ########################################### // Die Bilder werden über die Bitmap Klasse eingelagert, es wird zusätzlich der Anzeigemodus // auf BITMAP_DROP gesetzt, damit die Bilder in Originalgrösse erscheinen. Bitmap graph11 = new Bitmap("audi.jpg"); graph11.setDrawMode(Bitmap.BITMAP_DROP); Bitmap graph12 = new Bitmap("earth.jpg"); graph12.setDrawMode(Bitmap.BITMAP_DROP); Bitmap graph13 = new Bitmap("lotus.jpg"); graph13.setDrawMode(Bitmap.BITMAP_DROP); //####################################### Seite 1 ########################################### // Auf der 1.Seite werden die JPEG Graphiken eingebunden //####################################### Frames ########################################### // Das erste Frame definiert die Ueberschrift des Absatzes Seite 186 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Der letzte Parameter gibt jeweils die Seite an an der das Frame erscheint hier die erste Frame ueberschrift21 = new Frame ("ueberschrift21",20,770,400,50,2); // Folgende Frames werden den formatierten Absatztext Text aufnehmen Frame myFrame21 = new Frame( "myFrame21", 40, 520, 400, 200, 2 ); // Das zweite Frame wird den formatierten Text aufnehmen Frame myFrame22 = new Frame( "myFrame22", 40, 400, 400, 200, 2 ); // Das zweite Frame wird den formatierten Text aufnehmen Frame myFrame23 = new Frame( "myFrame23", 40, 280, 400, 200, 2 ); //####################################### Text ########################################### Text ub21 = new Text("2. Gif Graphiken"); ub21.setDefaultFont( new Font( "Helvetica-Bold", 20, Font.ALIGN_LEFT, Color.BLACK ) ); //####################################### Bilder ########################################### Bitmap graph21 = new Bitmap("pencil.gif"); graph21.setDrawMode(Bitmap.BITMAP_DROP); // Diese Bild wird nicht angezeigt Bitmap graph22 = new Bitmap("vonnegut.jpg"); graph22.setDrawMode(Bitmap.BITMAP_DROP); // Diese Bild ist in original wesentlich zu gross, es wird unter Einhaltung der Abmessungen // bestmöglich in das Frame eingebunden. Bitmap graph23 = new Bitmap("traffic.gif"); graph23.setDrawMode(Bitmap.BITMAP_BESTFIT); //####################################### Inhalte übergeben ################################### // Nachdem die Inhalte spezifiziert wurden, müssen sie an das Template übergeben werden template.addFrame( ueberschrift11, ub11 ); Seite 187 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten template.addFrame( myFrame11, graph11 ); template.addFrame( myFrame12, graph12 ); template.addFrame( myFrame13, graph13 ); template.addFrame( ueberschrift21, ub21 ); template.addFrame( myFrame21, graph21 ); template.addFrame( myFrame22, graph22 ); template.addFrame( myFrame23, graph23 ); //####################################### Dokument generieren ################################### // Nachdem alle Inhalte an die Templates übergeben wurden kann das Dokument erzeugt werden, // dazu wird ein Generator Objekt angelegt mit Dateinamen des Dokuments, das Template wird übergeben // anschliessend wird das Dokument mittels generate erzeugt. Generator generator = new Generator( "Beispiel82.pdf" ); generator.addTemplate( template ); generator.setDocumentInfo(meta); generator.generate(); } catch ( Exception e ) { System.out.println( "Error occured: " + e.toString() ); } } } 5.2.6.3 Anwendungsbeispiel 8-3a import com.glance.pdf.engine.*; //####################################### Generieren einer Tabelle ########################################### Seite 188 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten public class Beispiel83a { public static void main(String[] args) { try { // BTemplate erstellen, dieses Template verwaltet alle Frames die folgend eingefügt werden. BTemplate template = new BTemplate(); //####################################### Metinformationen ################################### DocumentInfo meta = new DocumentInfo(); meta.setAuthor("Tom Koenig"); meta.setKeywords("PDF,Java"); meta.setTitle("Beispiel 8-3a Erstellen einer einfachen Tabelle"); meta.setSubject("Erzeugung von PDF-Dokumenten"); //####################################### Seite 1 ########################################### //####################################### Frames ########################################### // Das erste Frame definiert die Ueberschrift des Absatzes // Der letzte Parameter gibt jeweils die Seite an an der das Frame erscheint hier die erste Frame ueberschrift11 = new Frame ("ueberschrift11",20,770,400,50,1); // Folgende Frames werden den formatierten Absatztext Text aufnehmen Frame myFrame11 = new Frame( "myFrame11", 40, 580, 400, 200, 1 ); //####################################### Überschrift ########################################### Text ub11 = new Text("1. Einfache Tabelle"); ub11.setDefaultFont( new Font( "Helvetica-Bold", 20, Font.ALIGN_LEFT, Color.BLACK ) ); //####################################### Tabelle ########################################### Seite 189 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Eine Tabelle wird über die Table Klasse verwaltet. // Einer Tabelle können über die addRow Methode Reihen hinzugefügt werden Table table1 = new Table(); // Es wird eine Reihe definiert Row row11 = new Row(); // Folgend wird ein Text defniert, diese wird als Inhalt an den Cell Klassenkosntruktor // übergeben, ferner wird der Modus der Tabelle geändert, so dass ein Rand angezeigt wird. // Jede Zelle wird über die addCell Methode der Row Klasse einer Reihe zugeordnet Text myText11 = new Text("Position"); Cell cell11 = new Cell(myText11); cell11.setBackgroundType(Cell.BACKGROUND_GRID); row11.addCell(cell11); Text myText12 = new Text("Mannschaft"); Cell cell12 = new Cell(myText12); cell12.setBackgroundType(Cell.BACKGROUND_GRID); row11.addCell(cell12); Text myText13 = new Text("Punkte"); Cell cell13 = new Cell(myText13); cell13.setBackgroundType(Cell.BACKGROUND_GRID); row11.addCell(cell13); table1.addRow(row11); Row row12 = new Row(); Text myText14 = new Text("1."); Cell cell14 = new Cell(myText14); cell14.setBackgroundType(Cell.BACKGROUND_GRID); row12.addCell(cell14); Text myText15 = new Text("Bayern München"); Cell cell15 = new Cell(myText15); Seite 190 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten cell15.setBackgroundType(Cell.BACKGROUND_GRID); row12.addCell(cell15); Text myText16 = new Text("62"); Cell cell16 = new Cell(myText16); cell16.setBackgroundType(Cell.BACKGROUND_GRID); row12.addCell(cell16); table1.addRow(row12); Row row13 = new Row(); Text myText17 = new Text("2."); Cell cell17 = new Cell(myText17); cell17.setBackgroundType(Cell.BACKGROUND_GRID); row13.addCell(cell17); Text myText18 = new Text("Schalke 04"); Cell cell18 = new Cell(myText18); cell18.setBackgroundType(Cell.BACKGROUND_GRID); row13.addCell(cell18); Text myText19 = new Text("59"); Cell cell19 = new Cell(myText19); cell19.setBackgroundType(Cell.BACKGROUND_GRID); row13.addCell(cell19); table1.addRow(row13); Row row14 = new Row(); Text myText110 = new Text("3."); Cell cell110 = new Cell(myText110); cell110.setBackgroundType(Cell.BACKGROUND_GRID); row14.addCell(cell110); Text myText111 = new Text("Borussia Dortmund"); Cell cell111 = new Cell(myText111); cell111.setBackgroundType(Cell.BACKGROUND_GRID); row14.addCell(cell111); Text myText112 = new Text("57"); Cell cell112 = new Cell(myText112); cell112.setBackgroundType(Cell.BACKGROUND_GRID); row14.addCell(cell112); Seite 191 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten table1.addRow(row14); Row row15 = new Row(); Text myText113 = new Text("4."); Cell cell113 = new Cell(myText113); cell113.setBackgroundType(Cell.BACKGROUND_GRID); row15.addCell(cell113); Text myText114 = new Text("Bayer Leverkusen"); Cell cell114 = new Cell(myText114); cell114.setBackgroundType(Cell.BACKGROUND_GRID); row15.addCell(cell114); Text myText115 = new Text("54"); Cell cell115 = new Cell(myText115); cell115.setBackgroundType(Cell.BACKGROUND_GRID); row15.addCell(cell115); table1.addRow(row15); // Auf weitere Einträge wird verzichtet diese können analog eingefügt werden. //####################################### Inhalte übergeben ################################### // Nachdem die Inhalte spezifiziert wurden, müssen sie an das Template übergeben werden template.addFrame( ueberschrift11, ub11 ); template.addFrame( myFrame11, table1 ); //####################################### Dokument generieren ################################### // Nachdem alle Inhalte an die Templates übergeben wurden kann das Dokument erzeugt werden, // dazu wird ein Generator Objekt angelegt mit Dateinamen des Dokuments, das Template wird übergeben // anschliessend wird das Dokument mittels generate erzeugt. Seite 192 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Generator generator = new Generator( "Beispiel83a.pdf" ); generator.addTemplate( template ); generator.setDocumentInfo(meta); generator.generate(); } catch ( Exception e ) { System.out.println( "Error occured: " + e.toString() ); } } } 5.2.6.4 Anwendungsbeispiel 8-3b import com.glance.pdf.engine.*; //####################################### Generieren einer Tabelle ########################################### public class Beispiel83b { public static void main(String[] args) { try { // BTemplate erstellen, dieses Template verwaltet alle Frames die folgend eingefügt werden. BTemplate template = new BTemplate(); //####################################### Metinformationen ################################### DocumentInfo meta = new DocumentInfo(); meta.setAuthor("Tom Koenig"); meta.setKeywords("PDF,Java"); meta.setTitle("Beispiel 8-3b Erstellen einer komplexeren Tabelle"); meta.setSubject("Erzeugung von PDF-Dokumenten"); Seite 193 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten //####################################### Seite 1 ########################################### //####################################### Frames ########################################### // Das erste Frame definiert die Ueberschrift des Absatzes // Der letzte Parameter gibt jeweils die Seite an an der das Frame erscheint hier die erste Frame ueberschrift11 = new Frame ("ueberschrift11",20,770,400,50,1); // Folgende Frames werden den formatierten Absatztext Text aufnehmen Frame myFrame11 = new Frame( "myFrame11", 40, 580, 400, 200, 1 ); //####################################### Überschrift ########################################### Text ub11 = new Text("1. Eine komplexere Tabelle Tabelle"); ub11.setDefaultFont( new Font( "Helvetica-Bold", 20, Font.ALIGN_LEFT, Color.BLACK ) ); //####################################### Tabelle ########################################### // Eine Tabelle wird über die Table Klasse verwaltet. // Einer Tabelle können über die addRow Methode Reihen hinzugefügt werden Table table1 = new Table(); // Es wird eine Reihe definiert Row row11 = new Row(); // Folgend wird ein Text definiert, diese wird als Inhalt an den Cell Klassenkonstruktor // übergeben, ferner wird der Modus der Tabelle geändert, so dass ein Rand angezeigt wird. // Jede Zelle wird über die addCell Methode der Row Klasse einer Reihe zugeordnet Seite 194 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Es wird in diesem Beispiel der Modus BACKGROUND_FILL_AND_GRID aktiviert // um so über die setBackgroundColor Methode eine Hintergrundfarbe zu setzen. // Die Zellen der ersten Reihe habe zusätzlich einen breiteren Rahmen.(3pt) // Der Aufruf der Funktion setSpace generiert zusätzlich Platz zwischen Text // und Rahmen hier 5pt. // Gegenüber Anwendungbeispiel 8-3a werden die einzelnen Texte zentriert dargestellt Font font1 = new Font("Helvetica",12,Font.ALIGN_CENTER); Text myText11 = new Text("Position",font1); Cell cell11 = new Cell(myText11); cell11.setBackgroundType(Cell.BACKGROUND_FILL_AND_GRID); cell11.setBackgroundColor(Color.GREEN); cell11.setLineWidth(3,true); cell11.setSpace(5,5,5,5); row11.addCell(cell11); Text myText12 = new Text("Mannschaft",font1); Cell cell12 = new Cell(myText12); cell12.setBackgroundType(Cell.BACKGROUND_FILL_AND_GRID); cell12.setBackgroundColor(Color.GREEN); cell12.setLineWidth(3,true); cell12.setSpace(5,5,5,5); row11.addCell(cell12); Text myText13 = new Text("Punkte",font1); Cell cell13 = new Cell(myText13); cell13.setBackgroundType(Cell.BACKGROUND_FILL_AND_GRID); cell13.setBackgroundColor(Color.GREEN); cell13.setLineWidth(3,true); cell13.setSpace(5,5,5,5); row11.addCell(cell13); table1.addRow(row11); Row row12 = new Row(); Text myText14 = new Text("1.",font1); Seite 195 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Cell cell14 = new Cell(myText14); cell14.setBackgroundType(Cell.BACKGROUND_FILL_AND_GRID); cell14.setBackgroundColor(Color.RED); row12.addCell(cell14); Text myText15 = new Text("Bayern München",font1); Cell cell15 = new Cell(myText15); cell15.setBackgroundType(Cell.BACKGROUND_FILL_AND_GRID); cell15.setBackgroundColor(Color.RED); row12.addCell(cell15); Text myText16 = new Text("62",font1); Cell cell16 = new Cell(myText16); cell16.setBackgroundType(Cell.BACKGROUND_FILL_AND_GRID); cell16.setBackgroundColor(Color.RED); row12.addCell(cell16); table1.addRow(row12); Row row13 = new Row(); Text myText17 = new Text("2.",font1); Cell cell17 = new Cell(myText17); cell17.setBackgroundType(Cell.BACKGROUND_FILL_AND_GRID); cell17.setBackgroundColor(Color.RED); row13.addCell(cell17); Text myText18 = new Text("Schalke 04",font1); Cell cell18 = new Cell(myText18); cell18.setBackgroundType(Cell.BACKGROUND_FILL_AND_GRID); cell18.setBackgroundColor(Color.RED); row13.addCell(cell18); Text myText19 = new Text("59",font1); Cell cell19 = new Cell(myText19); cell19.setBackgroundType(Cell.BACKGROUND_FILL_AND_GRID); cell19.setBackgroundColor(Color.RED); row13.addCell(cell19); table1.addRow(row13); Row row14 = new Row(); Text myText110 = new Text("3.",font1); Seite 196 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten Cell cell110 = new Cell(myText110); cell110.setBackgroundType(Cell.BACKGROUND_FILL_AND_GRID); cell110.setBackgroundColor(Color.BLUE); row14.addCell(cell110); Text myText111 = new Text("Borussia Dortmund",font1); Cell cell111 = new Cell(myText111); cell111.setBackgroundType(Cell.BACKGROUND_FILL_AND_GRID); cell111.setBackgroundColor(Color.BLUE); row14.addCell(cell111); Text myText112 = new Text("57",font1); Cell cell112 = new Cell(myText112); cell112.setBackgroundType(Cell.BACKGROUND_FILL_AND_GRID); cell112.setBackgroundColor(Color.BLUE); row14.addCell(cell112); table1.addRow(row14); Row row15 = new Row(); Text myText113 = new Text("4.",font1); Cell cell113 = new Cell(myText113); cell113.setBackgroundType(Cell.BACKGROUND_FILL_AND_GRID); cell113.setBackgroundColor(Color.BLUE); row15.addCell(cell113); Text myText114 = new Text("Bayer Leverkusen",font1); Cell cell114 = new Cell(myText114); cell114.setBackgroundType(Cell.BACKGROUND_FILL_AND_GRID); cell114.setBackgroundColor(Color.BLUE); row15.addCell(cell114); Text myText115 = new Text("54",font1); Cell cell115 = new Cell(myText115); cell115.setBackgroundType(Cell.BACKGROUND_FILL_AND_GRID); cell115.setBackgroundColor(Color.BLUE); row15.addCell(cell115); table1.addRow(row15); //####################################### Inhalte übergeben ################################### Seite 197 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Nachdem die Inhalte spezifiziert wurden, müssen sie an das Template übergeben werden template.addFrame( ueberschrift11, ub11 ); template.addFrame( myFrame11, table1 ); //####################################### Dokument generieren ################################### // Nachdem alle Inhalte an die Templates übergeben wurden kann das Dokument erzeugt werden, // dazu wird ein Generator Objekt angelegt mit Dateinamen des Dokuments, das Template wird übergeben // anschliessend wird das Dokument mittels generate erzeugt. Generator generator = new Generator( "Beispiel83b.pdf" ); generator.addTemplate( template ); generator.setDocumentInfo(meta); generator.generate(); } catch ( Exception e ) { System.out.println( "Error occured: " + e.toString() ); } } } 5.2.7 Data2pdf 5.2.7.1 Anwendungsbeispiel 9-1 // Der Font wird fuer das komplette Dokument gesetzt // spaetere Aenderungen aendern den Font fuer das komplette Dokument #!font#Courier#!/font# #!paper#a4#!/paper# #!title#Beispiel 9-1 Formatierung von Text#!/title# Seite 198 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten #!author#Tom Koenig#!/author# #!creator#data2pdf#!/creator# #!keywords#PDF,Text#!/keywords# #!subject#Erzeugung von PDF Dokumenten#!/subject# #!bgtext# /F1 15 Tf 0 0 0 rg 1 0 0 1 650 40 Tm (Bla Bla) Tj #!/bgtext# #!page# #!text# #!textcommand#/F3 20 Tf#!/textcommand# Textformatierung #!/text# // // // // Grundsaetzlich gibt es zwei Möglichkeiten fett,kursiv, etc Modi zu setzen Die erste Moeglichkeit ist das textcommand Tag zu verwenden um den Font Modus umzustellen Es gilt folgendes: /F1: normal, /F2: kursiv, /F3: fett, /F4: fett und kursiv #!textcommand#/F1 15 Tf#!/textcommand# Dieser Text ist Courier 15 Punkt #!textcommand#/F2 15 Tf#!/textcommand# Dieser Text ist Courier kursiv 15 Punkt #!textcommand#/F3 15 Tf#!/textcommand# Dieser Text ist Courier fett 15 Punkt #!textcommand#/F4 15 Tf#!/textcommand# Dieser Text ist Courier kursiv-fett 15 Punkt #!/text# // Die zweite Moeglichkeit ist ueber die Tags b, i, bi die den jeweiligen Modus // setzen. Seite 199 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten #!text# #!fontsize#15#!/fontsize# Dieser Text ist Courier 15 Punkt #!i#Dieser Text ist Courier kursiv 15 Punkt#!/i# #!b#Dieser Text ist Courier fett 15 Punkt#!/b# #!bi#Dieser Text ist Courier kursiv-fett 15 Punkt#!/bi# #!/text# #!text# #!textcommand#/F3 20 Tf#!/textcommand# Text Farbe aendern #!/text# // Die Textfarbe lässt sich über die PDF Syntax ändern -> r g b rg #!text# #!fontsize#15#!/fontsize# #!text# #!textcommand#0 0 0 rg#!/textcommand# Dieser Text ist schwarz #!textcommand#255 0 0 rg#!/textcommand# Dieser Text ist rot #!textcommand#0 255 0 rg#!/textcommand# Dieser Text ist gruen #!textcommand#0 0 255 rg#!/textcommand# Dieser Text ist blau #!/text# #!/page# // Folgend werden noch weitere Einstellungen bez. Text vorgenommen // Alle werden über textcommand somit also über PDF Syntax vorgenommen // Abstand zwischen Zeichen -> abstandinpunkten Tc Seite 200 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // Abstand zwischen Worten -> abstandinpunkten Tw // Horizontale Skalierung -> skalierunginprozent Tz #!page# #!text# #!textcommand#/F3 20 Tf#!/textcommand# Abstand zwischen Zeichen aendern #!/text# #!text# #!fontsize#15#!/fontsize# Der Abstand zwischen den Zeichen in dieser Zeile ist auf den Default-Wert von 0 Punkten eingestellt. #!textcommand#15 Tc#!/textcommand# Der Abstand zwischen den Zeichen wird auf 15 erhoeht. #!/text# #!text# #!textcommand#/F3 20 Tf#!/textcommand# #!textcommand#0 Tc#!/textcommand# Abstand zwischen Worten aendern #!/text# #!text# #!fontsize#15#!/fontsize# Der Abstand zwischen den Worten in dieser Zeile ist auf den Default-Wert von 0 Punkten eingestellt. #!textcommand#10 Tw#!/textcommand# Der Abstand zwischen den Worten wird auf 10 erhoeht. #!/text# #!text# #!textcommand#/F3 20 Tf#!/textcommand# Seite 201 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten #!textcommand#0 Tw#!/textcommand# Horizontale Skalierung aendern #!/text# #!text# #!fontsize#15#!/fontsize# Der Text wird normal dargestellt. #!textcommand#200 Tz#!/textcommand# Der Text wird skaliert auf die doppelte Groesse #!/text# #!/page# #!page# #!image#./audi.jpg;566;330;300;0;0;0;400;340#!/image# #!text# #!textcommand#/F3 20 Tf#!/textcommand# Bilder einbinden #!/text# #!/page# 5.2.7.2 Anwendungsbeispiel 9-2 // Der Font wird fuer das komplette Dokument gesetzt // spaetere Aenderungen aendern den Font fuer das komplette Dokument #!font#Courier#!/font# #!paper#a4#!/paper# #!title#Beispiel 9-2 Eindbinden von Graphiken#!/title# #!author#Tom Koenig#!/author# #!creator#data2pdf#!/creator# #!keywords#PDF,Text#!/keywords# #!subject#Erzeugung von PDF Dokumenten#!/subject# #!bgtext# /F1 15 Tf Seite 202 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 0 0 0 rg 1 0 0 1 650 40 Tm (Bla Bla) Tj #!/bgtext# #!page# #!text# #!textcommand#/F3 20 Tf#!/textcommand# 1. Einbinden von JPEG Graphiken #!/text# // // // // // // // Die Darstellung mittels Data2pdf ist etwas spezieller Werte a b c d e f g h Die Position des Bildes wird durch g h angegeben Ausdrichtungspunkt ist die linke untere Ecke des Bildes (Koordinatenurpsprung linke untere Ecke) c und f geben die horizontale und vertikale Breite des Bildes an d und e ermöglichen ein Schiefstellen des Bildes um den angegebene Faktor Die Parameter a und b geben die Breite des bereritgestellten Bildes an // // // // Eine originalgetreue Darstellung erfordert folgende Einstellungen a=Breite des Bildes b=Höhe des Bildes c=a d=0 e=0 f=b g,h individuell #!image#./audi.jpg;359;190;359;0;0;190;50;580#!/image# #!image#./earth.jpg;163;158;163;0;0;158;50;300#!/image# #!image#./lotus.jpg;300;200;300;0;0;200;50;10#!/image# #!/page# #!page# #!text# #!textcommand#/F3 20 Tf#!/textcommand# 2. Einbinden von GIF Graphiken #!/text# // Die Darstellung mittels Data2pdf ist etwas spezieller // Werte a b c d e f g h Seite 203 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten // // // // // Die Position des Bildes wird durch g h angegeben Ausdrichtungspunkt ist die linke untere Ecke des Bildes (Koordinatenurpsprung linke untere Ecke) c und f geben die horizontale und vertikale Breite des Bildes an d und e ermöglichen ein Schiefstellen des Bildes um den angegebene Faktor Die Parameter a und b geben die Breite des bereritgestellten Bildes an // // // // Eine originale Darstellung erfordert folgende Einstellungen a=Breite des Bildes b=Höhe des Bildes c=a d=0 e=0 f=b g,h individuell #!text# #!textcommand#/F3 14 Tf#!/textcommand# Das Einbinden von GIF Graphiken war für alle Graphiken ohne Erfolg. Die Webseite stellt unter der Versionsfunktionalität nur den Eintrag JPEG Support added zur Verfügung. #!/text# #!/page# Seite 204 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 5.3 Abbildungsverzeichnis Abbildung 1 : Hierarchie der Text Klassen ______________________ 12 Abbildung 2 : Strukturierungsbaum __________________________ 13 Abbildung 3 : Element Baum _______________________________ 14 Abbildung 4 : Screenshot iText ______________________________ 17 Abbildung 5 : Methode drawTextArea _________________________ 22 Abbildung 6 : Screenshot Thentech ___________________________ 24 Abbildung 7 : Funktionsweise von show_boxed __________________ 29 Abbildung 8 : Screenshot PDFlib _____________________________ 33 Abbildung 9 : Strukturierung einer Seite in FOP___________________ 40 Abbildung 10 : Eigenschaften für fo:block Element________________ 43 Abbildung 11 : Screenshot FOP _____________________________ 45 Abbildung 12: Ausprägungen des orientation Parameters und ihr graphische Darstellung ________________________________________ 50 Abbildung 13 : Screenshot ClibPDF ___________________________ 53 Abbildung 14 : PDF Dokumente erzeugen mittels Java PDF Toolkit ______ 57 Abbildung 15 : Screenshot Java PDF Toolkit _____________________ 60 Abbildung 16 : Gliederung eines Dokumentes in Data2pdf ___________ 66 Abbildung 17 : Abarbeitungsreihenfolge der Operatoren in Data2pdf ____ 66 Abbildung 18 : Screenshot Data2pdf __________________________ 71 Abbildung 19 : Einbinden einzelner HTML Seiten __________________ 78 Seite 205 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 5.4 Tabellenverzeichnis Tabelle 1 : Liste der Werkzeuge______________________________ 9 Tabelle 2 : Versionierung des Thentech Werkzeuges_______________ 18 Tabelle 3 : Angabe der Seitenmaße (in Pt) für verschiedene Seitenformate 27 Tabelle 4 : Kodierungen der Schriftarten in PDFlib ________________ 30 Tabelle 5 : Farbsysteme in PDFlib ___________________________ 32 Tabelle 6 : Kosten für den Einsatz von PDFlib auf einem Server________ 35 Tabelle 7 : Kosten für den Erwerb der Verteilungslizenz für PDFlib______ 35 Tabelle 8 : Eigenschaften einer Seite _________________________ 38 Tabelle 9 : Grundeigenschaften einer Tabelle____________________ 45 Tabelle 10 : Kostenstruktur ClibPDF __________________________ 55 Tabelle 11 : Standard Schrift-Einstellungen _____________________ 61 Tabelle 12 : Kostenstruktur der Glance Werkzeuge________________ 65 Tabelle 13 : Gesamtvergleich der Werkzeuge ___________________ 77 Tabelle 14 : Erklärung der Symbole __________________________ 77 Seite 206 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 5.5 Beispielverzeichnis Beispiel 1 : Erzeugung eines Dokumentes mittels iText______________ 10 Beispiel 2 : Verwalten von Metainformationen mittels iText ___________ 11 Beispiel 3 : Einbinden von Graphiken mittels iText _________________ 16 Beispiel 4 : Erstellen einer Seite mittels Thentech__________________ 20 Beispiel 5 : Einfügen von Metainformationen mittels Thentech _________ 21 Beispiel 6 : Anzeigen von Text in Thentech ______________________ 21 Beispiel 7 : Einbinden einer Graphik mittels Thentech _______________ 24 Beispiel 8 : Verwalten von Metainformationen mittels PDFlib __________ 28 Beispiel 9 : Koordinatenursprung in PDFlib ändern_________________ 28 Beispiel 10 : Schriftart ändern in PDFlib ________________________ 31 Beispiel 11 : Text unterstreichen in PDFlib ______________________ 31 Beispiel 12 : Farbe ändern in PDFlib __________________________ 32 Beispiel 13 : Einbinden einer Graphik mittels PDFlib ________________ 34 Beispiel 14 : Einfaches XSL-FO Dokument ______________________ 36 Beispiel 15 : Erstellen eines Seitenlayouts in XSL-FO _______________ 38 Beispiel 16 : Inhalte einfügen in XSL-FO Dokumenten ______________ 39 Beispiel 17 : Textformatierung in XSL-FO _______________________ 41 Beispiel 18 : Text unterstreichen mittels XSL-FO __________________ 42 Beispiel 19 : Farbe ändern in XSL-FO __________________________ 42 Beispiel 20 : Einbinden von Graphiken in XSL-FO Dokumente _________ 43 Beispiel 21 : Einfache Tabellendefinition in XSL-FO_________________ 44 Beispiel 22 : Minimales C-Programm - ClibPDF ___________________ 47 Beispiel 23 : Verwalten von Metainformationen in ClibPDF ___________ 49 Beispiel 24 : Einbinden eines Textes mittels ClibPDF________________ 49 Beispiel 25 : Text formatieren in ClibPDF _______________________ 53 Beispiel 26 : Setzen der Farbe Grün in ClibPDF ___________________ 54 Beispiel 27 : Einbinden einer Graphik mittels ClibPDF _______________ 54 Beispiel 28: Erstellen eines PDF Dokumentes ____________________ 58 Beispiel 29 : Metainformationen im Java PDF Toolkit _______________ 59 Beispiel 30 : Einbinden eines Textes mittels des Java PDF Toolkit _______ 61 Beispiel 31 : Textformatierung innerhalb eines Strings ______________ 62 Beispiel 32 : Einbinden einer Graphik mittels des Java PDF Toolkits _____ 63 Beispiel 33 : Einbinden von Metainformationen in Data2pdf___________ 68 Beispiel 34 : Setzen eines Textes mittels Data2pdf _________________ 68 Seite 207 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten 5.6 Literaturverzeichnis [AdoR00] Adobe Systems Incorporated , PDF Reference second edition, PDF version 1.3 www.adobe.com [AdoS99] Adobe Systems Incorporated, PDF Specification – PDF version 1.3 www.adobe.com [AdoA01] Adobe Acrobat Reader www.adobe.com [BinT01] BinaryThing.com, Planet PDF www.planetpdf.com [IntB01] InternetBiz, PDF Zone www.pdfzone.com [Lowa01] Bruno Lowagie, iText Packet www.lowagie.com/iText [LowJ01] Bruno Lowagie, iText Java API Referenz www.lowagie.com/iText [Com87] Compuserve, GIF87 specification, 1987 http://member.aol.com/royalef/gif87a.txt [Com90] Compuserve, GIF89 specification, 1989 http://www.w3.org/Graphics/GIF/spec-gif89a.txt [Fsf91] GNU LIBRARY GENERAL PUBLIC LICENSE http://www.lowagie.com/iText/lgpl.txt [ThoTT01] Thoresen Enterprise Technologies, Thentech Terms & Conditions http://www.thentech.com/pdf/driver/download/fe_terms.html Seite 208 Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten [Tho01] Thoresen Enterprise Technologies, Thentech PDF Treiber http://www.thentech.com/pdf/driver/index.html [Tra00] Marcus Trapp, XML Techniken und Anwendung, 2000 http://wwwdbis.informatik.unikl.de/staff/Ritter/seminarws9900.html [Koe00] Tom Koenig, Internet-basiertes Knowledge Management (XML, RDF), 2000 http://wwwagr.informatik.unikl.de/~bergmann/KMSem2k/pdf.gif [FopR01] Running FOP, Aufruf des Werkzeugs FOP http://xml.apache.org/fop/running.html [Har01] Elliot Rusty Harold, XML Bible Second Edition Chapter 18: XSL Formatting Objects, 2001 http://www.ibiblio.org/xml/books/bible2/chapters/ch18.html [ApS99] The Apache Software License, Version 1.1 http://xml.apache.org/fop/license.html [FIOD99] ClibPDF Library Reference Manual, Version 2.01-r2 16, 1999. http://www.fastio.com/cpdfman110.pdf October [FIODL98] Summary of FastIO ClibPDF License This is a brief summary of FastIO ClibPDF License and is NOT legally binding. For Details see [FIOSA00] http://www.fastio.com/licensePlain.html [FIOSA00] FastIO ClibPDF Software License Agreement, (Version 1.30, January 27, 2000) http://www.fastio.com/LICENSE.pdf [Glea01] Glance e-doc assembler PDF Toolkit for Java User's guide Version1.0 May 2001-07-21 http://pdf.glance.ch/sample/EdocTK10.pdf [JPTA01] Java API Referenz zum Java PDF Toolkit Glance Teil der Evaluationsversion: http://pdf.glance.ch/sample/ETK100E.zip Seite 209