Untergeordnete Seiten
  • Drucken mit Seitenmodifikationen
Zum Ende der Metadaten springen
Zum Anfang der Metadaten
Gültig für jadice 5.4

Dieser Artikel beschreibt, wie Seitenmodifikationen zur Dokumentenaufbereitung vor dem Druckvorgang aufgebracht werden können.

Icon

Ab jadice 5.5.0.4 steht eine neue API zur Erstellung eigener PageSegments zur Verfügung. Den entsprechenden Artikel finden Sie unter Wasserzeichen und Kopfzeilen mit dem ContentsCreatorPageSegment

 

Dieser Artikel gibt eine Einführung zur Implementierung von Seitenmodifikation beim Druck (auch bekannt als PageDecorator). In jadice 5 ist dazu ein neues Konzept eingeführt worden, das die Modifikation komplett über eine eigene API erlaubt und deutlich einfacher als die Verwendung von Java's Graphics2D-API ist.

Anforderung

Beim Drucken soll der Inhalt und die Form der auszudruckenden Seiten modifiziert werden. Abdeckbare Anforderungen:

  • Es soll ein Wasserzeichen im Hintergrund der Seite gedruckt werden.
  • Seiteninhalt verkleinern um Platz für zusätzliche Inhalte/Informationen zu schaffen.
  • Zusätzliche Inhalte/Informationen auf Seiten aufbringen.

Lösungsmöglichkeit

Erzeugung und Aufbringung benutzerdefinierter Inhalte

Es gibt die Möglichkeit zwei neuen DocumentLayern (PrintDecorations.PREDECORATION und PrintDecorations.POSTDECORATION) benutzerdefinierte Inhalte zuzuordnen. Dazu muss die abstrakte Klasse DecorationPageSegment implementiert werden und dem gewünschten Layer über die API der Page-Klasse zugeordnet werden (siehe (6) und (7)). Der originale Seiteninhalt bleibt dabei unangetastet.

  • PrintDecorations.PREDECORATION: Die Inhalte, die diesem Layer zugeordnet sind, werden in den Hintergrund gelegt. Die Inhalte der Seite werden nicht verdeckt.
  • PrintDecorations.POSTDECORATION: Die Inhalte, die diesem Layer zugeordnet sind, werden in den Vordergrund gelegt. Die Inhalte der Seite werden evtl. verdeckt.

Die Erzeugung benutzerdefinierter Inhalte wird über die Methode doCreateContents(..) realisiert. Sie gibt Zugriff auf ein GraphicalState-Objekt, das mit Inhalten befüllt werden kann. Zu beachten ist dabei, dass die jadice-interne Auflösung von 7200 DPI als Einheit fungiert. Über die Enumeration Unit können alle der Klasse bekannten Einheiten untereinander konvertiert werden. Im Beispiel weiter unten werden diese Konvertierungen ausführlich beschrieben.

Modifikation des originalen Seiteninhalts

Die Modifikation des originalen Seiteninhalts kann über Methoden der PrintDecorations-Klasse vorgenommen werden. Die Methode transform(..) verändert über eine Transformation das allgemeine Erscheinungsbild der selektierten Layer der Seite. Strukturell wird der Inhalt dabei nicht verändert. transformAll(..) hat dieselbe Aufgabe und selektiert zusätzlich automatisch alle Layer der Seite.

Beispiel

Anhand des nachfolgenden Beispiels soll die Implementierung von Seitenmodifikationen gezeigt werden. Dabei wird das bestehende Druckkommando so erweitert, dass eine Kombination von "Dekorierungen" angewendet wird:

  • Der Seiteninhalt wird verkleinert um Platz für eine Art Kopfzeile zu schaffen.
  • Im Hintergrund wird ein Wasserzeichen mit dem Text "Kopie" schräg aufgebracht. Die eigentlichen Inhalte der Seite werden darüber platziert. Flächendeckende Elemente auf der Seite überlagern das Wasserzeichen.
  • In die Kopfzeile wird zusätzlicher Inhalt aufgebracht.
  • Um eine Abgrenzung zum zusätzlich generierten Inhalt zu schaffen wird ein Rahmen um die tatsächliche Dokumentseite gezeichnet.

Zum Vergleich die jeweiligen Ausgaben:

Ohne Seitenmodifikation

Mit Seitenmodifikation

In den nachfolgenden Punkten wird die Beispielimplementierung ausführlich beschrieben. Alle anderen Zeilen werden durch kurze Kommentare im Quellcode erläutert.

(1): Definition eines neuen Commands, der von com.levigo.jadice.swing.commands.PrintDocumentCommand oder com.levigo.jadice.swing.commands.DirectPrintDocumentCommand erbt und die addPagesToPrint(..)-Methode überschreibt.

(2): Implementierung von try-finally-Blöcken um den Kontrakt von EventList zu erfüllen. Dieses Konstrukt stellt sicher, dass keine Seiteneffekte beim Benutzen der Listen auftreten. Es werden zwei try-finally-Blöcke benötigt; einer für die lesende Operation und ein zweiter für die schreibende Operation.

(3): Erzeugen der Instanz der Klasse, die die gewünschten Modifikationen anwendet. Die Klasse bekommt eine Quellseite, die modifiziert bzw. dekoriert wird. Die Implementierung der Klasse wird ab (5) näher beschrieben.

(4): Iteration über alle Seiten, die gedruckt werden sollen und Anwendung der Dekorierung. Dabei wird eine neue Seite erzeugt, die bereits vollständig modifiziert ist und der Liste hinzugefügt wird, die alle zu druckenden Seiten enthält.

DecorationExamplePrintDocument.java

(5): Innerhalb der getScaledPage(..)-Methode wird eine neue Seite erzeugt. Diese Seite "dekoriert" gemäß dem Decorator-Pattern die Quellseite und wendet eine Skalierung an. getScaledPage(..) rechnet zu Beginn 1cm und 2cm in die jadice-interne Auflösung um. Als nächstes wird eine Transformation erzeugt die eine Skalierung der originalen Seite von 100% auf 90% vornehmen kann. Zusätzlich wird die Seite um die vorher konvertierten 1cm nach rechts und 2cm nach unten verschoben um Platz für zusätzliche Inhalte in einer Kopfzeile zu schaffen. Die letzte Zeile ruft die PrintDecorations-API auf und erzeugt eine neue Seite, die die Transformation auf die originale Seite anwenden kann.

(6): Instanziierung einer Implementierung von DecorationPageSegment und Zuordnung zum Layer PrintDecorations.PREDECORATION.

(7): Instanziierung einer weiteren Implementierung von DecorationPageSegment und Zuordnung zum Layer PrintDecorations.POSTDECORATION.

(8): Vorbereitung des GraphicalState-Objekts des Seitensegments und Hinzufügen des benutzerdefinierten Inhalts. Die API ist im Stile einer Fluent-API gehalten und ermöglicht so kurze und prägnante Statements. Der erste Schritt bei der Vorbereitung ist das Erfragen eines Factory-Objektes, das Einstellungen entgegennehmen kann und abschließend mit dem Aufruf von create(..) ein neues, vollständig konfiguriertes GraphicalState-Objekt zurückgibt auf dem man eigene Inhalte hinzufügen kann. Im Beispiel wird zuerst die Füllfarbe auf ein mittleres Grau festgelegt, dann die Schriftart und -Größe konfiguriert, gefolgt von der Transformation, die die Drehung beschreibt. Nachdem der neue GraphicalState erzeugt wurde wird der Text "Kopie" hinzugefügt.

DecorationExample.java

Weitere Anwendungsfälle und Lösungsmöglichkeiten

Text rechtsbündig ausrichten

Das obige Beispiel als Basis genommen, muss lediglich innerhalb der doCreateContents(..)-Methode vor dem Hinzufügen eines Textes folgender Quellcode zur Bestimmung der Maße eingefügt werden:

Anpassung der Textbreite und -höhe durch zur Seitengröße relativen Skalierung der Schriftgröße

Falls ein spezieller Text nicht auf eine Seite passt, kann der Text durch Veränderung der Schriftgröße bis zu einem gewissen Punkt eingepasst werden. Der Fall, dass die Schriftgröße zu klein und der Text dadurch nicht lesbar wird, muss abgefangen werden, steht in diesem Beispiel aber nicht im Fokus.