Analyse der Möglichkeiten zur Erzeugung von

Werbung
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
Herunterladen