Docstoc

Analyse der Mglichkeiten zur Erzeugung von PDF Dokumenten

Document Sample
Analyse der Mglichkeiten zur Erzeugung von PDF Dokumenten Powered By Docstoc
					         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     Beschreibung _________________________________________ 10
     2.1.2     Aufbau eines PDF Dokumentes____________________________ 10
       2.1.2.1     Grundlegende Eigenschaften ______________________________       10
       2.1.2.2     Metainformationen ______________________________________        11
       2.1.2.3     Einbinden von Text ______________________________________       11
       2.1.2.4     Strukturierung eines Dokumentes __________________________      13
     2.1.3     Anforderungen ________________________________________ 15
       2.1.3.1     Formatierung des Textes _________________________________       15
       2.1.3.2     Strukturierung des Dokumentes ____________________________      16
       2.1.3.3     Graphiken _____________________________________________         16
       2.1.3.4     Tabellen ______________________________________________         17
       2.1.3.5     Importieren von einzelnen HTML Seiten ______________________    17
       2.1.3.6     Dauer ________________________________________________          17
       2.1.3.7     Komplexität ____________________________________________        18
       2.1.3.8     Kosten ________________________________________________         18

 2.2     Thentech ___________________________________________ 18
     2.2.1     Versionierung _________________________________________ 18
     2.2.2     Beschreibung _________________________________________ 19
     2.2.3     Aufbau eines PDF Dokumentes____________________________ 19
       2.2.3.1     Grundlegende Eigenschaften ______________________________ 19
       2.2.3.2     Metainformationen ______________________________________ 20
       2.2.3.3     Einbinden von Text ______________________________________ 21
     2.2.4     Anforderungen ________________________________________ 22
       2.2.4.1     Formatierung des Textes _________________________________       22
       2.2.4.2     Strukturierung des Dokumentes ____________________________      23
       2.2.4.3     Graphiken _____________________________________________         23
       2.2.4.4     Tabellen ______________________________________________         25
       2.2.4.5     Importieren von einzelnen HTML Seiten ______________________    25
       2.2.4.6     Dauer ________________________________________________          25
       2.2.4.7     Komplexität ____________________________________________        25
       2.2.4.8     Kosten ________________________________________________         25

 2.3     PDFlib _____________________________________________ 26
     2.3.1     Beschreibung _________________________________________ 26
     2.3.2     Aufbau eines PDF Dokumentes____________________________ 26
       2.3.2.1     Grundlegende Eigenschaften ______________________________ 26
       2.3.2.2     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     Anforderungen ________________________________________ 30
        2.3.3.1   Formatierung des Textes __________________________________ 30
        2.3.3.2   Strukturierung des Dokumentes ____________________________ 33
        2.3.3.3   Graphiken _____________________________________________ 33
        2.3.3.4   Tabellen _______________________________________________ 34
        2.3.3.5   Importieren von einzelnen HTML Seiten ______________________ 34
        2.3.3.6   Dauer _________________________________________________ 34
        2.3.3.7   Komplexität ____________________________________________ 34
        2.3.3.8   Kosten ________________________________________________ 35

  2.4     retepPDF ___________________________________________ 35
  2.5     Etymon PJ __________________________________________ 36
  2.6     FOP _______________________________________________ 36
    2.6.1     Beschreibung _________________________________________ 36
    2.6.2     Aufruf _______________________________________________ 36
    2.6.3     Aufbau eines PDF Dokumentes ____________________________ 36
        2.6.3.1   Grundlegende Eigenschaften _______________________________ 37
        2.6.3.2   Metainformationen _______________________________________ 38
        2.6.3.3   Einbinden von Text ______________________________________ 39
    2.6.4     Anforderungen ________________________________________ 41
        2.6.4.1   Formatierung des Textes __________________________________ 41
        2.6.4.2   Strukturierung des Dokumentes ____________________________ 43
        2.6.4.3   Graphiken _____________________________________________ 43
        2.6.4.4   Tabellen _______________________________________________ 44
        2.6.4.5   Importieren von einzelnen HTML Seiten ______________________ 45
        2.6.4.6   Dauer _________________________________________________ 46
        2.6.4.7   Komplexität ____________________________________________ 46
        2.6.4.8   Kosten ________________________________________________ 46

  2.7     ClibPDF ____________________________________________ 46
    2.7.1     Beschreibung _________________________________________ 46
    2.7.2     Aufbau eines PDF Dokumentes ____________________________ 46
        2.7.2.1   Grundlegende Eigenschaften _______________________________ 47
        2.7.2.2   Metainformationen _______________________________________ 49
        2.7.2.3   Einbinden von Text ______________________________________ 49
    2.7.3     Anforderungen ________________________________________ 52
        2.7.3.1   Formatierung von Text ___________________________________ 52
        2.7.3.2   Strukturierung des Dokumentes ____________________________ 54
        2.7.3.3   Graphiken _____________________________________________ 54
        2.7.3.4   Tabellen _______________________________________________ 55
        2.7.3.5   Importieren von einzelnen HTML-Seiten ______________________ 55
        2.7.3.6   Dauer _________________________________________________ 55
        2.7.3.7   Komplexität ____________________________________________ 55
        2.7.3.8   Kosten ________________________________________________ 55

  2.8     PrepTool - Java PDF Toolkit ____________________________ 56
    2.8.1     Beschreibung _________________________________________ 56
        2.8.1.1   Grundinformationen ______________________________________ 58
        2.8.1.2   Metainformationen _______________________________________ 59
        2.8.1.3   Einbinden von Text ______________________________________ 60
    2.8.2     Anforderungen ________________________________________ 61
        2.8.2.1   Formatierung des Textes __________________________________ 61
        2.8.2.2   Strukturierung des Dokumentes ____________________________ 62
        2.8.2.3   Graphiken _____________________________________________ 63


Seite 2
             Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten



       2.8.2.4     Tabellen ______________________________________________         63
       2.8.2.5     Importieren von einzelnen HTML-Seiten ______________________    64
       2.8.2.6     Dauer ________________________________________________          64
       2.8.2.7     Komplexität ____________________________________________        64
       2.8.2.8     Kosten ________________________________________________         64

 2.9     Data2pdf ___________________________________________ 65
     2.9.1     Aufruf _______________________________________________ 65
     2.9.2     Beschreibung _________________________________________ 65
       2.9.2.1     Grundinformationen _____________________________________ 67
       2.9.2.2     Metainformationen ______________________________________ 67
       2.9.2.3     Einbinden von Text ______________________________________ 68
     2.9.3     Anforderungen ________________________________________ 69
       2.9.3.1     Formatierung von Text ___________________________________       69
       2.9.3.2     Strukturierung des Dokumentes ____________________________      70
       2.9.3.3     Graphiken _____________________________________________         71
       2.9.3.4     Tabellen ______________________________________________         71
       2.9.3.5     Importieren von einzelnen HTML-Seiten ______________________    72
       2.9.3.6     Dauer ________________________________________________          72
       2.9.3.7     Komplexität ____________________________________________        72
       2.9.3.8     Kosten ________________________________________________         72

3.     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        Gesamtvergleich ___________________________________ 76

4.     Importieren von einzelnen HTML-Seiten _______________ 78
 4.1     Eigenschaften von html2ps _____________________________ 79
     4.1.1     einfache Seite (mit Textformatierung) ______________________ 80
     4.1.2     Tabellen _____________________________________________ 81
     4.1.3     Framesets ____________________________________________ 82

5.     Anhang ________________________________________ 84
 5.1     Installation und Aufruf der Werkzeuge ____________________ 84
     5.1.1     iText ________________________________________________ 84
       5.1.1.1     zugrunde liegende Version ________________________________ 84
       5.1.1.2     Umgebung ____________________________________________ 84
       5.1.1.3     Aufruf ________________________________________________ 84
     5.1.2     Thentech PDF Driver ____________________________________ 84

                                                                              Seite 3
Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten



        5.1.2.1   zugrunde liegende Version_________________________________ 84
        5.1.2.2   Umgebung _____________________________________________ 84
        5.1.2.3   Aufruf _________________________________________________ 84
    5.1.3     PDFlib _______________________________________________ 85
        5.1.3.1   zugrunde liegende Version_________________________________ 85
        5.1.3.2   Umgebung _____________________________________________ 85
        5.1.3.3   Aufruf _________________________________________________ 85
    5.1.4     FOP _________________________________________________ 85
        5.1.4.1   zugrunde liegende Version_________________________________ 85
        5.1.4.2   Umgebung _____________________________________________ 85
        5.1.4.3   Aufruf _________________________________________________ 86
    5.1.5     ClibPDF ______________________________________________ 86
        5.1.5.1   zugrunde liegende Version_________________________________ 86
        5.1.5.2   Umgebung _____________________________________________ 86
        5.1.5.3   Aufruf _________________________________________________ 86
    5.1.6     Data2pdf _____________________________________________ 87
        5.1.6.1   zugrunde liegende Version_________________________________ 87
        5.1.6.2   Umgebung _____________________________________________ 87
        5.1.6.3   Aufruf _________________________________________________ 87
    5.1.7     Glance Java PDF Toolkit _________________________________ 88
        5.1.7.1   zugrunde liegende Version_________________________________ 88
        5.1.7.2   Umgebung _____________________________________________ 88
        5.1.7.3   Aufruf _________________________________________________ 89
    5.1.8     Ghostscript und html2ps_________________________________ 89
  5.2     Anwendungsbeispiele _________________________________ 91
    5.2.1     iText ________________________________________________ 91
        5.2.1.1   Anwendungsbeispiel   1-1   __________________________________ 91
        5.2.1.2   Anwendungsbeispiel   1-2   __________________________________ 98
        5.2.1.3   Anwendungsbeispiel   1-3   _________________________________ 101
        5.2.1.4   Anwendungsbeispiel   1-4   _________________________________ 114
        5.2.1.5   Anwendungsbeispiel   1-5   _________________________________ 117
    5.2.2     Thentech PDF Treiber __________________________________ 121
        5.2.2.1   Anwendungsbeispiel 2-1 _________________________________ 121
        5.2.2.2   Anwendungsbeispiel 2-2 _________________________________ 125
    5.2.3     PDFlib ______________________________________________ 128
        5.2.3.1   Anwendungsbeispiel 3-1 _________________________________ 128
        5.2.3.2   Anwendungsbeispiel 3-2 _________________________________ 135
    5.2.4     FOP ________________________________________________ 139
        5.2.4.1   Anwendungsbeispiel   6-1   _________________________________ 139
        5.2.4.2   Anwendungsbeispiel   6-2   _________________________________ 148
        5.2.4.3   Anwendungsbeispiel   6-3   _________________________________ 150
        5.2.4.4   Anwendungsbeispiel   6-4   _________________________________ 160
    5.2.5     ClibPDF _____________________________________________ 163
        5.2.5.1   Anwendungsbeispiel 7-1 _________________________________ 163
        5.2.5.2   Anwendungsbeispiel 7-2 _________________________________ 175
    5.2.6     Java PDF Toolkit ______________________________________ 178
        5.2.6.1   Anwendungsbeispiel   8-1 _________________________________ 178
        5.2.6.2   Anwendungsbeispiel   8-2 _________________________________ 185
        5.2.6.3   Anwendungsbeispiel   8-3a ________________________________ 188
        5.2.6.4   Anwendungsbeispiel   8-3b ________________________________ 193
    5.2.7     Data2pdf ____________________________________________ 198
        5.2.7.1   Anwendungsbeispiel 9-1 _________________________________ 198
        5.2.7.2   Anwendungsbeispiel 9-2 _________________________________ 202

  5.3     Abbildungsverzeichnis________________________________ 205

Seite 4
       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              (beispielsweise   zu
       unterstreichen) um so gewisse Teile hervorzuheben.

      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                                     Schnittstelle Bemerkung
    iText      http://www.lowagie.com/iText                 Java

  Thentech     http://www.thentech.com                      Java

   PDFlib      http://www.pdflib.com                   Java,C,C++,…

  retepPDF     http://www.retep.org.uk/pdf/                 Java       Analyse     wird
                                                                       nicht
                                                                       durchgeführt,
                                                                       Funktionalität
                                                                       zu gering.
   ClibPDF     http://www.fastio.com                         C

  Data2pdf     http://www.sanface.com/data2pdf.html    Skriptsprache

   Glance      http://pdf.glance.ch                         Java

     FOP       http://xml.apache.org/fop/                Java, XML

 Etymon PJ     http://www.etymon.com/pj/                    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 XML-
Dokumente 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.     In
Anwendungsbeispiel 1.1 wird er Einsatz dieser Klassen demonstriert.

2.1.2.4      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        auszuwählen,    wobei   folgende
Schriftarten zur Verfügung gestellt werden:

      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 Beispiel-
Distribution (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
                                                                     Unter Einhaltung
 Limited Freeware
                                 -                    Download           gewisser
   Edition (LFE)
                                                                        Richtlinien
 Standard Edition
                               $250                 Auf Bestellung        Nein
      (SE)

 Enterprise Edition
                              $1500                 Auf Bestellung        Nein
       (EE)


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   Ausrichtung : Portrait
          o   Größe : Size_US_Letter

      createPage(double width,double height)

       Erzeugt eine Seite mit folgenden Eigenschaften:

          o   Ausrichtung : Portrait
          o   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               Ausprägungen,    von   der   folgend   eine
beispielhaft dargestellt wird:

       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 PDFxContext-
Klasse 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         EBCDIC code page 1047 (IBM AS/400, S/390)

       builtin        Original Kodierung        für   nicht-Text   und   nicht-Latein   Text
                      Schriften
        host          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 Basis-
Referenzsystem.
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 Standard-
Anwendungen 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" line-
                  height="30pt">
                        XSL-FO Dokument
                   </fo:block>
                   <fo:block font-size="20pt" font-family="serif" line-
                  height="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 XSL-
FO 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                               Ränder der Seite
                 margin-right



                               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                        im   Beispiel   gezeigt   in
unterschiedlichen Einheiten (pt, cm, in) erfolgen.

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" line-
             height="30pt">
                 XSL-FO Dokument
             </fo:block>
             <fo:block font-size="20pt" font-family="serif" line-
             height="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:static-
content 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, border-
left-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 end-
indent, 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" text-
                   align="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" text-
                   align="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" text-
                   align="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    solid
                                                       fest

                     fo:table-cell,
 background-
                fo:table-row, fo:table-
                                               Hintergrundfarbe des       red
    color
                         column                jeweiligen Elements



                     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;       //   (100)
       int nMaxFonts;       //   (180)
       int nMaxImages;      //   (100)
       int nMaxAnnots;      //   (100)
       int nMaxObjects;     //   (5000)
       } CPDFdocLimits;

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     "0   0   612   792"                     (Standard)
              LEGAL      "0   0   612   1008"
              A4         "0   0   595   842"
              B5         "0   0   499   708"
              C5         "0   0   459   649"

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.


                                                 1
Seite 48                                             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    cpdf_setCreator(pdf, "ClibPDF");
       void    cpdf_setTitle(pdf, "PDF Dokumente erstellen mit ClibPDF");
       void    cpdf_setSubject(pdf, "dynamische PDF Generierung");
       void    cpdf_setKeywords(pdf,"PDF,C");


2.7.2.3         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   cpdf_setTextLeading(CPDFdoc *pdf, float leading);
       void   cpdf_setTextPosition(CPDFdoc *pdf, float x, float y);
       void   cpdf_rawSetTextPosition(CPDFdoc *pdf, float x, float y);
       void   cpdf_textShow(CPDFdoc *pdf, const char *txtstr);
       void   cpdf_textCRLFshow(CPDFdoc *pdf, const char *txtstr);
       void   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
                      Base ClibPDF commercial license
            $1000
                      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          PDF
Dokumente erzeugen zu können. Die Analyse beschränkt sich, wie in            den
vorhergehenden Fällen auch, auf die Erzeugung von PDF Dokumenten.            Das
Bearbeiten von bestehenden Dokumenten wird nicht weiter erläutert, kann     aber
dem Handbuch zum Java PDF Toolkit entnommen werden [Glea01].

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               der
Generator-Klasse an das Dokument gebunden.

2.8.1.3      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                2000
           Image Import Tool for PT, Developer
                                                             100
           License
           Image Import Tool for PT, Server Li-
                                                             100
           cense
           Image Import Tool for PT, Application
                                                             500
           License


                   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 document-
Operatoren 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 :        10 Punkt
      Farbe :        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

       -   #!b#…#!/b#
       -   /F3

      Kursiv

       -   #!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   Normal
       /F2   Italic
       /F3   Bold
       /F4   Bold-Italic
       /F5   Symbol
       /F6   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


                                                                                        Java
                                                              Etymon
                       iText   Thentech   PDFlib   retepPDF            FOP   ClibPDF    PDF       Data2pdf
                                                                 PJ
                                                                                       Toolkit

Grundfunktionalität                               -         -                               
Formatierung eines
Textes                                           -         -                                
Strukturierung des
Dokumentes                      -         -         -         -      -       -         -           -

Graphiken                                        -         -                               

Tabellen                        -         -         -         -            -                    -
Importieren      von
einzelnen               -         -         -         -         -      -       -         -           -
Webseiten

Dauer                                           -         -                             
Komplexität                                       -         -                               
Kosten                                          -         -                    -           -


                               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      Tom Koenig
   *   @version     %I%, %G%
   *   @since      JDK1.3
  */

import java.awt.Color;
import java.io.FileOutputStream;
import java.io.IOException;


import   com.lowagie.text.*;
import   com.lowagie.text.html.HtmlWriter;
import   com.lowagie.text.xml.XmlWriter;
import   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);

                     //   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



Seite 92
                                      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(Font.HELVETICA,   12,
Font.BOLD));
section.add(chunk);

// 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        Phrase    mit   Textformatierung",   new    Font(Font.COURIER,    12,
Font.NORMAL, new Color(255, 0, 0)));
section.add(phrase);

// 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        ist   ein    Absatz   mit    Textformatierung",new   Font(Font.HELVETICA,   16,
                   Font.BOLD));
                   section.add(paragraph);




                   // 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         Text      ist         unterstrichen",new   Font(Font.HELVETICA,       12,
                   Font.UNDERLINE)));



Seite 94
                                       Analyse der Möglichkeiten zur serverseitigen Erzeugung von PDF Dokumenten



section.add(new    Paragraph("Dieser    Text    ist     durchgestrichen",new      Font(Font.HELVETICA,      12,
Font.STRIKETHRU)));

section.add(new   Paragraph("Dieser    Text    ist    fett   und   kursiv",new     Font(Font.HELVETICA,     12,
Font.BOLDITALIC)));

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   com.lowagie.text.*;
import   com.lowagie.text.html.HtmlWriter;
import   com.lowagie.text.xml.XmlWriter;
import   com.lowagie.text.pdf.PdfWriter;
import   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    com.lowagie.text.*;
import    com.lowagie.text.html.HtmlWriter;
import    com.lowagie.text.xml.XmlWriter;
import    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   com.lowagie.text.*;
import   com.lowagie.text.html.HtmlWriter;
import   com.lowagie.text.xml.XmlWriter;
import   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    flow-name die Position des Textes an
 //   Es sei hier angemerkt das jegliche Positionen    die genutzt werden sollen, hier ist
 //   das nur die Body region im simple-page-master    angegeben werden müssen fo:region-body,
 //   da ansonsten der Parser an dieser Stelle eine    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" 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 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   flow-name die Position des Textes an
//   Es sei hier angemerkt das jegliche Positionen   die genutzt werden sollen, hier ist
//   das nur die Body region im simple-page-master   angegeben werden müssen fo:region-body,
//   da ansonsten der Parser an dieser Stelle eine   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      Anwendungsbeispiel 6-3


Seite 150
                                                           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   flow-name die Position des Textes an
 //   Es sei hier angemerkt das jegliche Positionen   die genutzt werden sollen, hier ist
 //   das nur die Body region im simple-page-master   angegeben werden müssen fo:region-body,
 //   da ansonsten der Parser an dieser Stelle eine   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"   text-align="center" font-weight="bold">
          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"   text-align="center">
          1
          </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">
          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"   text-align="center">
          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"   text-align="center">
          2
          </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">
          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"   text-align="center">
          59
          </fo:block>
      </fo:table-cell>


                                                                                                              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"        text-align="center">
                  3
                  </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">
                  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"        text-align="center">
                  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"        text-align="center">
                  4
                  </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">
                  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"        text-align="center">
                  54
                  </fo:block>
              </fo:table-cell>
            </fo:table-row>

      </fo:table-body>
    </fo:table>


Seite 154
                                                       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"        text-align="center">
                  1
                  </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">
                  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"        text-align="center">
                  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"        text-align="center">
                  2
                  </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">
                  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"        text-align="center">
                  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"        text-align="center">
                  3
                  </fo:block>
              </fo:table-cell>


Seite 156
                                                     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"   text-align="center">
                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"   text-align="center">
                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"   text-align="center">
                4
                </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">
                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"   text-align="center">
                54
                </fo:block>
            </fo:table-cell>
          </fo:table-row>

    </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"   text-align="center" font-weight="bold">
          5678
          </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">
          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"   text-align="center" font-weight="bold">
          Wiwi
          </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">

          </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   flow-name die Position des Textes an
//   Es sei hier angemerkt das jegliche Positionen   die genutzt werden sollen, hier ist
//   das nur die Body region im simple-page-master   angegeben werden müssen fo:region-body,
//   da ansonsten der Parser an dieser Stelle eine   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,    "audi.jpg", JPEG_IMG, 70, 550, 0.0, &width, &height, &xscal, &yscal, 1);
     width = 0;
     height = 0;
     cpdf_rawImportImage(pdf,    "earth.jpg", JPEG_IMG, 70, 325, 0.0, &width, &height, &xscal, &yscal, 1);
     width = 0;
     height = 0;
     cpdf_rawImportImage(pdf,    "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,   ub11   );
        template.addFrame( myFrame11, text11   );
          template.addFrame( ueberschrift12,   ub12   );
        template.addFrame( myFrame12, text12   );
          template.addFrame( ueberschrift11,   ub11   );
        template.addFrame( myFrame11, text11   );
          template.addFrame( ueberschrift12,   ub12   );
        template.addFrame( myFrame12, text12   );
          template.addFrame( ueberschrift21,   ub21   );
        template.addFrame( myFrame21, text21   );
        template.addFrame( myFrame22, text22   );
        template.addFrame( myFrame23, text23   );
        template.addFrame( myFrame24, text24   );
          template.addFrame( ueberschrift31,   ub31   );
        template.addFrame( myFrame31, text31   );
        template.addFrame( myFrame32, text32   );
        template.addFrame( myFrame33, text33   );
          template.addFrame( ueberschrift41,   ub41   );
        template.addFrame( myFrame41, text41   );

        //####################################### 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 & Condi-
          tions
          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.uni-
             kl.de/staff/Ritter/seminarws9900.html

[Koe00]      Tom Koenig, Internet-basiertes Knowledge Management (XML,
             RDF), 2000
             http://wwwagr.informatik.uni-
             kl.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             October
             16, 1999.
             http://www.fastio.com/cpdfman110.pdf

[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