Wasserzeichen und Kopfzeilen mit dem ContentsCreatorPageSegment
Dieser Artikel beschreibt, wie Seitenmodifikationen mit dem ContentsCreatorPageSegment durchgeführt werden können
Dieser Artikel gibt eine Einführung zur Erzeugung eigener PageSegments, die beim Druck oder bei der Anzeige verwendet werden können, um zusätzliche Informationen auf ein Dokument aufzubringen. Hierzu wird gezeigt, wie mit der API des ContentsCreatorPageSegmentBuilder Inhalte eines PageSegment definiert werden und anschließend damit ein PageSegment erzeugt wird.
Anforderungen
Es soll ein PageSegment erzeugt werden, das Informationen enthält, mit denen ein Dokument bei Anzeige oder Druck angereichert wird. Mögliche Anwendungsfälle für ein solches PageSegment sind beispielsweise
Das Aufbringen einer Kopfzeile auf dem ursprünglichen Dokument
Das Aufbringen eines Wasserzeichen
Verkleinern des eigentlichen Seiteninhalts, um Zusatzinformationen aufzubringen
Lösungsansätze
Überblick
Um diese Anforderungen zu erfüllen, stellt jadice das ContentsCreatorPageSegment bereit. Zur Erzeugung eines ContentsCreatorPageSegment wird zunächst mit der API des ContentsCreatorPageSegmentBuilder der Inhalt des PageSegments definiert. Beim Aufruf der finish()-Methode des Builders wird dann ein PageSegment mit den definierten Inhalten erzeugt. Das so erzeugte ContentsCreatorPageSegment implementiert das jadice PageSegment-Interface und kann entsprechend verwendet werden. Durch die Definition des Dokumentenlayers, in dem das PageSegment eingebunden wird, werden Sichtbarkeit und Überdeckung des PageSegment festgelegt. Detaillierte Informationen zum jadice-Dokumentenmodell finden sich in der jadice-Dokumentation.
Beispielimplementierungen
Um den Beispielcode besser lesbar zu machen, findet das Laden der Seite und des verwendeten Fonts in separaten Klassen statt. Diese können rechts heruntergeladen werden.
Hinzufügen einer Kopfzeile auf einer Seite
In diesem Beispiel wird eine Kopfzeile auf einer Seite aufgebracht. Dazu wird zunächst mit dem ContentsCreatorPageSegmentBuilder ein ContentsCreatorPageSegment erzeugt, das den Text der Kopfzeile enthält. Anschließend wird dieses ContentsCreatorPageSegment auf die Seite aufgebracht. Eventuell vorhandene Inhalte des Ur-Dokuments werden dabei durch die Kopfzeile überdeckt.
Durch Ausführen der main()-Methode wird die angeforderte Seite aus der gegebenen Datei gelesen und das in createSimpleTextPageSegment() erzeugte PageSegment auf diese Seite aufgebracht. Anschließend wird die Seite mit dem neuen PageSegment in ein BufferedImage gerendert und in einem JFrame dargestellt.
Die Ur-Seite: Gerenderte Seite ohne Wasserzeichen | Seite mit Kopfzeile: Seite mit aufgebrachter Kopfzeile |
Wasserzeichen auf einer Seite
In diesem Beispiel wird ein Wasserzeichen auf einer Seite aufgebracht. Dazu wird wieder mit dem ContentsCreatorPageSegmentBuilder ein ContentsCreatorPageSegment erzeugt, das das Wasserzeichen enthält. Anschließend wird dieses PageSegment auf die Seite aufgebracht.
Das Wasserzeichen soll folgende Eigenschaften haben:
Der Text des Wasserzeichens lautet "COPY"
Die Farbe des Texts ist halbtransparent
Der Text ist um 45 Grad gedreht
Der Text ist so eingepasst, dass er maximal 80% der Breite oder der Höhe der Seite einnimmt.
Für PrintDecorations gibt es zwei vordefinierte Layer:
Elemente im Layer PrintDecorations.PREDECORATION werden in den Hintergrund gelegt. Die Inhalte der Seite werden nicht verdeckt.
Elemente im Layer PrintDecorations.POSTDECORATION werden in den Vordergrund gelegt. Die Inhalte der Seite werden eventuell verdeckt
Hierzu wird ähnlich wie im Beispiel "Hinzufügen einer Kopfzeile" ein PageSegment erzeugt, das einen Text enthält. Um diesen einzupassen und zu drehen, werden verschiedene Transformationen angewendet.
Zur Berechnung der Transformationen werden ContentsCreatorControls definiert, die den Text gedreht in einer bestimmten Textgröße rendern würden. Die so ermittelte Dimension dient dann als Grundlage zur Berechnung der Skalierung auf 80% der Höhe oder der Breite.
Durch Ausführen der main()-Methode wird die angeforderte Seite aus der gegebenen Datei gelesen und das Wasserzeichen als PageSegment auf diese Seite aufgebracht. Anschließend wird die Seite mit dem neuen PageSegment in ein BufferedImage gerendert und in einem JFrame dargestellt.
Wasserzeichen im Layer PREDECORATION Seite mit Wasserzeichen im Pre-Decoration Layer | Wasserzeichen im Layer POSTDECORATION Seite mit Wasserzeichen im Post-Decoration Layer |
Verkleinern der ursprünglichen Seite um zusätzliche Informationen aufzubringen
In diesem Beispiel wird auf einer Seite der Inhalt einer eingelesenen Seite mit neuen Inhalten aus einem ContentsCreatorPageSegment kombiniert um eine Kopfzeile zu erzeugen die keine Seiteninhalte verdeckt. Dazu wird ein CompositePageSegment verwendet, in dem die verschiedenen PageSegments miteinander kombiniert werden können.
Zunächst werden die PageSegments einer eingelesenen Seite skaliert und in ein CompositePageSegment für jede DocumentLayer-Instanz eingefügt. Anschließend wird ein Rahmen darum gezeichnet (Methode addScaledPageSegmentsToPage()).
Danach wird ein ContentsCreatorPageSegment definiert, das den verbleibenden Platz oberhalb der skalierten Seite einnimmt. In diese Kopfzeile werden verschiedene Informationen eingefügt (Methode createHeadlinePageSegment()).
Die skalierten CompositePageSegmente werden auf der neu erstellten Zielseite eingefügt.
Durch Ausführen der main()-Methode wird die angeforderte Seite aus der gegebenen Datei gelesen und zusammen mit einem ContentsCreatorPageSegment in ein CompositePageSegment eingefügt. Anschließend wird die so erzeugte Seite in ein BufferedImage gerendert und in einem JFrame dargestellt.
Skalierte Seite mit Kopfzeilen Skalierte Seite mit zusätzlicher Kopfzeile |