Annotation Profile für XFDF Annotationen

XFDF Annotationen werden durch ein XFDF Annotationsprofil konfiguriert. Alle Eigenschaften, Editoren, Darstellungskomponenten und Funktionen zum Anlegen von XFDF Annotationen sind diesem Profile zusammengefasst und entsprechend dem zugrunde liegenden Format konfiguriert. Der Dateiname des XFDF Profiles ist 'xfdf-annotation-profile.xml', es findet sich im Root Verzeichnis des XFDF Annotation Moduls.

Annotation-Type Aufbau

Die Annotation-Type Definitionen beschreiben Basistypen von Annotationen. Als Basistyp versteht man die grundlegende Definition einer bestimmten Art von Annotationen. Dieser Basistyp kann in weiterer Verwendung im Profil erweitert werden, um spezifizische Annotationstypen zu definieren, z.B. wird für die Pfeil-Annotation die Linien-Annotation als Basis verwendet. Im Folgenden wird ein Auszug des XFDF Annotionsprofils betrachtet.

<annotation-profile name="XFDF">          
<!-- ############################################################################### -->
<!-- ## Base types to match archetype definitions (used in reader class) -->
<!-- ############################################################################### -->

  <annotation-type name="Line" archetype="Line"
                   class="com.levigo.jadice.format.xfdf.annotation.XFDFLineAnnotation">
      <renderer toolkit="swing"
          class="com.levigo.jadice.format.xfdf.internal.renderer.XFDFLineAnnotationRenderer">
          ...
  	  </renderer>
  	
      <wrangler toolkit="swing"
         class="com.levigo.jadice.swing.internal.annotation.wranglers.xfdf.XFDFLineAnnotationWrangler">
         ...
      </wrangler>
      
      <interpreter class="com.levigo.jadice.format.xfdf.internal.semantics.XFDFLineAnnotationInterpreter"/>

	    <initializer class="com.levigo.jadice.format.xfdf.internal.XFDFAnnotationInitializer">
	       ...
      </initializer>
    
	    <customizer class="my.specific.xfdf.annotation.customizer.implementation.XFDFLineAnnotationCustomizer"/>

    	<fixed name="filled" propertyType="java.lang.Boolean">
		    ...
      </fixed>

      <fixed name="opacity" propertyType="java.lang.Float">
        ...
      </fixed>
  </annotation-type>
...
  <annotation-template name="XFDFLine" extends="Line">
    <labels>
      <label locale="en">Line</label>
      <label locale="de">Linie</label>
    </labels>
  </annotation-template>
...
</annotation-profile>

        
  • annotation-profile

    Das Root-Element des XFDF Profils. Das 'name' Attribut muss mit einem eindeutigen Namen belegt werden. Mit Hilfe des 'name' Attributs können spezifische Annotationsprofile von diesem Profil abgeleitet werden, um alle grundlegenden Definitionen zu übernehmen und spezifische Definitionen zu gestalten.

  • annotation-type

    Das 'annotation-type' Element beschreibt / definiert in dem obigen Beispiel eine Linien-Annotation als Basistyp. Das 'name' Attribut benennt den Basistyp mit einem eindeutigen Namen. Mit Hilfe dieses Namens können über Vererbung verschiedene Arten von Linien-Annotationen definiert werden. Als Beispiel kann der Basistyp der Linien-Annotation verwendet werden, um nachfolgend blaue und rote Linien festzulegen.

    Das 'class' Attribute legt die entsprechende Java-Klasse fest, die die notwendigen Eigenschaften der Annotation bereitstellt.

    Das 'extends' Attribute kann für Vererbung verwendet werden, um für verwandte Typen schon bereits festgelegte Eigenschaften zu übernehmen.

    Die Eindeutigkeit von Annotationen wird durch das 'archetype' Attribut definiert. Dieses Attribut wird in den entsprechenden AnnotationReader- und AnnotationWriter-Klassen zur Klassifizierung verwendet.

    In der weiteren Spezifikation des Basistyps werden Klassen zum Anlegen, Bearbeiten, Initialisieren, Rendern (Darstellung), spezifische Eigenschaften und Editoren definiert.

    Innerhalb einer 'annotation-type' Definition können zusätzlich mehrere eigene Customizer-Implementationen definiert werden, um spezielle Einstellungen schon früh beim Anlegen einer Annotation anzuwenden. Ein typischer Verwendungszweck von Customizer ist z.B. das Setzen von Lesen-/Schreiben-/Löschen Berechtigungen auf Annotationen.

    Die Basistypen Deklaration enthält durch das Format XFDF vorgegebene feste spezifische Vorgaben. Bis auf die Angaben eigener Customizer sollten an diesen Einstellungen keine Änderungen durch den Integrator vollzogenen werden. Für die Angabe spezieller Einstellungen oder das Anlegen spezifischer Annotationen, wie oben im Beispiel blaue und rote Linien, ist die Verwendung von Template-Definitionen vorgesehen.

    Das 'renderer' Element ist für die Darstellung von XFDF Annotation zuständig, das 'class' Attribut bestimmt die Java-Klasse zum Rendern der Annotation. Siehe auch Abschnitt „Renderer-Klassen“.

    Das 'wrangler' Element bestimmt die GUI-Interaktion mit XFDF Annotationen, das 'class' Attribut bestimmt die zugehörige Wrangler Klasse. Siehe auch Abschnitt „Wrangler-Klassen“.

  • annotation-template

    Eine Annotation-Template Konfiguration dient als Vorlage einer speziellen Annotationsdefinition. Das 'name' Attribut muss mit einem eindeutigen Namen belegt werden und es muss ein 'extends' Attribute auf einen Basistyp angegeben werden. Einige typische Annotation-Template Definitionen werden im Abschnitt „Acrobat Annotationen“ erklärt.

Wrangler-Klassen

Wrangler-Klassen sind die Schnittstelle der Benutzungsoberfläche und dem Anwender. Sie dienen der Interaktion zwischen der GUI und dem Annotationsframework. Anwender können mit ihrer Hilfe Annotationen anlegen, verändern und editieren.

Im folgenden ist eine Übersicht der XFDF Wrangler-Klassen aufgezeigt. Diese Klassen sind zu finden in dem Package com.levigo.jadice.swing.internal.annotation.wranglers.xfdf des XFDF Format Moduls.

Für jede Annotationsklasse die in einer Annnotation-Typ Definition verwendet wird gibt es eine entsprechende Wrangler-Klasse. Der Wrangler-Klassenname setzt sich in der Regel aus den Namen der Annotationsklasse mit der Erweiterung 'Wrangler' am Ende zusammen, z.B. für die XFDFLineAnnotation lautet der Wrangler-Klassenname XFDFLineAnnotationWrangler.

  • XFDFLineAnnotationWrangler

    Anlegen / Ändern von Linien basierenden Annotationen.

  • XFDFSquareAnnotationWrangler

    Anlegen / Ändern von Rechteck basierenden Annotationen.

  • XFDFCircleAnnotationWrangler

    Anlegen / Ändern von Ellipse- / Oval- / Kreis-Annotationen. Die Position und Größe der Annotation kann nach dem Anlegen geändert werden.

  • XFDFInkAnnotationWrangler

    Anlegen / Ändern von freihändig gezeichneten Annotationen. Im Anlege-Modus werden die Elemente gezeichnet. Die Position und Größe der Annotation kann nach dem Anlegen geändert werden.

  • XFDFPolygonAnnotationWrangler

    Anlegen / Ändern von geschlossenen Polygon Annotationen. Im Anlege-Modus wird die Form des Polygonobjekts gezeichnet und wird beim Beenden des Anlegevorgangs automatisch geschlossen, d.h. der letzte Punkt wird mit dem Anfangspunkt verbunden. Die Position und die einzelnen Verbindungspunkte der Annotation können nach dem Anlegen geändert werden.

  • XFDFPolylineAnnotationWrangler

    Anlegen / Ändern von offenen Polygon Annotationen. Im Anlege-Modus wird die Form des Polygonobjekts gezeichnet. Die Position und die einzelnen Verbindungspunkte der Annotation können nach dem Anlegen geändert werden.

  • XFDFTextAnnotationWrangler

    Anlegen / Ändern von Text basierenden Annotationen.

  • XFDFPlainTextAnnotationWrangler

    Anlegen / Ändern von Text basierenden Annotationen.

  • XFDFHighlightAnnotationWrangler

    Bearbeitungskomponente für eine textbasierende Markierungs-Annotation. Keine nachträgliche Änderung der Position / Größe möglich, da die Position und Größe beim Anlegen vom darunterliegenden Text ermittelt wird. Das Anlegen dieser Annotation wird über ein seperate Command-Implementierung ermöglicht, hierzu wird die Textselektions-API benötigt.

  • XFDFUnderlineAnnotationWrangler

    Bearbeitungskomponente für eine textbasierende Unterstreichungs-Annotation. Keine nachträgliche Änderung der Position / Größe möglich, da die Position und Größe beim Anlegen vom darunterliegenden Text ermittelt wird. Das Anlegen dieser Annotation wird über ein seperate Command-Implementierung ermöglicht, hierzu wird die Textselektions-API benötigt.

  • XFDFStrikeOutAnnotationWrangler

    Bearbeitungskomponente für eine textbasierende Durchstreichungs-Annotation. Keine nachträgliche Änderung der Position / Größe möglich, da die Position und Größe beim Anlegen vom darunterliegenden Text ermittelt wird. Das Anlegen dieser Annotation wird über ein seperate Command-Implementierung ermöglicht, hierzu wird die Textselektions-API benötigt.

  • XFDFSquigglyAnnotationWrangler

    Bearbeitungskomponente für eine textbasierende Unterstreichungs-Annotation in Zick-Zack Muster. Keine nachträgliche Änderung der Position / Größe möglich, da die Position und Größe beim Anlegen vom darunterliegenden Text ermittelt wird. Das Anlegen dieser Annotation wird über ein seperate Command-Implementierung ermöglicht, hierzu wird die Textselektions-API benötigt.

  • XFDFCaretAnnotationWrangler

    Bearbeitungskomponente für eine textbasierende Annotation die als visuelles Symbol das Vorhandensein von Textbearbeitungen dienen. Der Annotation kann nicht sichtbarer Text als Zusatzinformation hinzugefügt werden.

  • XFDFStampAnnotationWrangler

    Ändern von Stempel-Annotationen. Die Position und Größe der Annotation kann geändert werden. Das Anlegen muss anhand einer AnnotationCustomizer-Implementierung umgesetzt werden.

Konfiguration der Wrangler-Klassen

Die Wrangler-Klassen haben aktuell keine XFDF formatspezifische Einstellungen. Die allgemeinen Einstellungen sind im Kapitel „Struktur und Aufbau von Annotation Profiles“ erläutert.

Falls bei der Weiterentwicklung Konfigurationsmöglichkeiten hinzukommen, wird dieser Abschnitt entsprechende aktualisiert.

Renderer-Klassen

XFDF Renderer-Klassen visualisieren die Definitionen / Eigenschaften von XFDF Annotationen. Ziel dieser Darstellung kann beispielsweise die Präsentation der Annotation auf der Benutzungsoberfläche oder während eines Druckprozesses sein. Allgemein kann man sagen, jede Form der visuellen Abbildung von XFDF Annotationen werden durch XFDF Renderer umgesetzt.

Die XFDF Annotationstypen besitzen jeweils spezifische Eigenschaften, die ausschließlich von dem zugehörigen XFDF Renderer dargestellt werden. Zur korrekten Darstellung von XFDF Annotationen ist es daher zwingend notwendig, dass zu jedem XFDF Annotationstyp der passende Renderer verwendet wird.

Die folgende Aufstellung gibt einen Überblick der zur Verfügung stehenden XFDF Renderer Klassen. Diese Klassen sind zu finden in dem Package com.levigo.jadice.format.xfdf.internal.renderer des XFDF Format Moduls.

Für jede Annotationsklasse die in einer Annnotation-Typ Definition verwendet wird gibt es eine entsprechende Renderer-Klasse. Der Renderer-Klassenname setzt sich in der Regel aus den Namen der Annotationsklasse mit der Erweiterung 'Renderer' am Ende zusammen, z.B. für die XFDFLineAnnotation lautet der Renderer-Klassenname XFDFLineAnnotationRenderer.

Die XFDF Renderer folgen durch das Format XFDF fest vorgegebenen spezifischen Vorgaben. Änderungen oder Anpassungen an den Renderen durch den Integrator sind daher nicht empfehlenswert. Die Klassen sind als Internal-API markiert, d.h. sie können im Profil verwendet werden, sind aber nicht zur Programmierung freigegeben.

Übersicht der Renderer-Klassen

  • XFDFLineAnnotationRender

    Darstellung von Linien-Annotationen

    Zugehörige Annotation: com.levigo.jadice.format.xfdf.annotation.XFDFLineAnnotation

  • XFDFSquareAnnotationRenderer

    Darstellung von Rechteck basierten Annotationen

    Zugehörige Annotation: com.levigo.jadice.format.xfdf.annotation.XFDFSquareAnnotation

  • XFDFCircleAnnotationRenderer

    Darstellung von Kreis-, Ellipse-, Oval-Annotationen

    Zugehörige Annotation: com.levigo.jadice.format.xfdf.annotation.XFDFCircleAnnotation

  • XFDFInkAnnotationRenderer

    Darstellung einer freihändigen Zeichnung

    Zugehörige Annotation: com.levigo.jadice.format.xfdf.annotation.XFDFInkAnnotation

  • XFDFPolygonAnnotationRenderer

    Darstellung von geschlossenen Polygonen

    Zugehörige Annotation: com.levigo.jadice.format.xfdf.annotation.XFDFPolygonAnnotation

  • XFDFPolylineAnnotationRenderer

    Darstellung von offenen Polygonen

    Zugehörige Annotation: com.levigo.jadice.format.xfdf.annotation.XFDFPolylineAnnotation

  • XFDFTextAnnotationRenderer

    Darstellung von Icons / Symbolen, die mit Textinhalt versehen sind

    Zugehörige Annotation: com.levigo.jadice.format.xfdf.annotation.XFDFTextAnnotation

  • XFDFFreeTextAnnotationRenderer

    Darstellung von Text mit unterschiedlichen Font und Farbdefinitionen (Richtext)

    Zugehörige Annotation: com.levigo.jadice.format.xfdf.annotation.XFDFPlainFreeTextAnnotation

  • XFDFPlainFreeTextAnnotationRenderer

    Darstellung von Text mit einem festgelegtem Font und einer Farbdefinition

    Zugehörige Annotation: com.levigo.jadice.format.xfdf.annotation.XFDFPlainFreeTextAnnotation

  • XFDFHighlightAnnotationRenderer

    Darstellung von Textmarkierung

    Zugehörige Annotation: com.levigo.jadice.format.xfdf.annotation.XFDFHighlightAnnotation

  • XFDFUnderlineAnnotationRenderer

    Darstellung von unterstrichenem Text

    Zugehörige Annotation: com.levigo.jadice.format.xfdf.annotation.XFDFUnderlineAnnotation

  • XFDFStrikeOutAnnotationRenderer

    Darstellung von durchgestrichenem Text

    Zugehörige Annotation: com.levigo.jadice.format.xfdf.annotation.XFDFStrikeOutAnnotation

  • XFDFSquigglyAnnotationRenderer

    Darstellung von einer Musterlinie unterstrichenem Text

    Zugehörige Annotation: com.levigo.jadice.format.xfdf.annotation.XFDFSquigglyAnnotation

  • XFDFCaretAnnotationRenderer

    Darstellung von Text spezifischen Bearbeitungen

    Zugehörige Annotation: com.levigo.jadice.format.xfdf.annotation.XFDFCaretAnnotation

  • XFDFStampAnnotationRenderer

    Darstellung von Annotationen mit Stempel ähnlichen Inhalt

    Zugehörige Annotation: com.levigo.jadice.format.xfdf.annotation.XFDFStampAnnotation

Konfiguration / Einstellungen der Renderer-Klassen

Die Renderer-Klassen haben aktuell keine XFDF formatspezifische Einstellungen. Die allgemeinen Einstellungen sind im Kapitel „Struktur und Aufbau von Annotation Profiles“ erläutert.

Falls bei der Weiterentwicklung Konfigurationsmöglichkeiten hinzukommen, wird dieser Abschnitt entsprechende aktualisiert.

Acrobat Annotationen

Acrobat bietet eine vielfältige Auswahl an Annotationstypen, die ein Anwender auf einem Dokument aufbringen kann. Vergleicht man diese Typen mit der im Abschnitt „Übersicht der XFDF Annotationsklassen“ vorgestellten XFDF Annotationsklassen, scheinen sich nicht alle Acrobat Annotationen direkt in XFDF Klassen widerzuspiegeln. Warum ist das so? Hat Acrobat ein eigenes Annotationsmodell? Die Antwort ist Nein. Acrobat nutzt die gleichen Typen von XFDF Annotationen wie sie auch durch die jadice documentplatform bereitgestellt werden. Doch wie kann Acrobat dann diese Vielfalt von Annotionen anbieten?

Das Geheimnis ist, XFDF Annotationstypen sind sehr vielfältig in ihren Möglichkeiten, ihres Erscheinungsbildes und ihres Verhaltens. Somit können aus einem XFDF Basistyp sehr viele unterschiedliche Annotationsarten konfiguriert und dem Anwender zur Nutzung angeboten werden.

Diese Abschnitt beschäftigt sich mit dem Thema, wie Acrobat spezifische Annotationen mit Hilfe der jadice documentplatform abgebildet werden.

Freundlicherweise hat das mitgelieferte jadice Default XFDF Profile die meisten Acrobat spezifischen Annotationen bereits vordefiniert. Für grundlegende Informationen zu dem XFDF Profile siehe auch Abschnitt „Annotation Profile für XFDF Annotationen“.

Abbildung 4.1. Darstellung der Acrobat Annotation Toolbar

Darstellung der Acrobat Annotation Toolbar

In Abbildung 4.1, „Darstellung der Acrobat Annotation Toolbar“ ist die Annotation Toolbar des Acrobats zu sehen.

Die folgende Aufzählung beschreibt in der Reihenfolge der oben gezeigten Acrobat Annotation Toolbar die einzelnen Annotationstypen und gibt weitere Hinweise zu der korrespondierenden Deklarationen im XFDF Profile.

Tabelle 4.1. Übersicht der Acrobat Annotationen in Zuordnung der Dekalration im XFDF Annotation Profile

Acrobat Annotation jadice Annotation Annotation Template im XFDF Profile Annotation Basistyp im XFDF Profile Darstellung
Notiz hinzufügen Notiz Annotation, XFDFText

<annotation-template name="XFDFText" extends="Text">

<annotation-type name="Text" archetype="Text" 
  class="com.levigo.jadice.format.xfdf.annotation.XFDFTextAnnotation">

Kleines Sprechblasen Icon mit hinterlegtem Text
Text hervorheben XFDF Highlight Annotation

<annotation-template name="XFDFHighlight" extends="Highlight">

<annotation-type name="Highlight" archetype="Highlight" 
class="com.levigo.jadice.format.xfdf.annotation.XFDFHighlightAnnotation">

Markiert ausgewählten Text. Siehe Abschnitt „Selektionsbasierende Annotationen“
Text unterstreichen XFDF Underline Annotation

<annotation-template name="XFDFUnderline" extends="Underline">

<annotation-type name="Underline" archetype="Underline" 
class="com.levigo.jadice.format.xfdf.annotation.XFDFUnderlineAnnotation">

Unterstreicht ausgewählten Text. Siehe Abschnitt „Selektionsbasierende Annotationen“
Text durchstreichen XFDF StrikeOut Annotation

<annotation-template name="XFDFStrikeOut" extends="StrikeOut">

<annotation-type name="StrikeOut" archetype="StrikeOut"
class="com.levigo.jadice.format.xfdf.annotation.XFDFStrikeOutAnnotation">

Streicht ausgewählten Text durch. Siehe Abschnitt „Selektionsbasierende Annotationen“
Notiz zum Ersetzen von Text XFDF CaretReplace

<annotation-template name="XFDFCaretReplace" extends="Caret">

<annotation-type name="Caret" archetype="Caret"
    class="com.levigo.jadice.format.xfdf.annotation.XFDFCaretAnnotation">

Ausgewählten Text durchstreichen und durch Notiz ersetzen. Siehe Abschnitt „Selektionsbasierende Annotationen“
Füge Text an Textstelle hinzu XFDF Caret

<annotation-template name="XFDFCaret" extends="Caret">

<annotation-type name="Caret" archetype="Caret"
    class="com.levigo.jadice.format.xfdf.annotation.XFDFCaretAnnotation">

An ausgewählter Textstelle eine Notiz hinzufügen. Siehe Abschnitt „Selektionsbasierende Annotationen“
Textkommentar hinzufügen Textkommentar Annotation, XFDFFreeTextTypeWriter

<annotation-template name="XFDFFreeTextTypeWriter" extends="FreeTextTypeWriter">

<annotation-type name="FreeTextTypeWriter" archetype="FreeTextTypeWriter"
class="com.levigo.jadice.format.xfdf.annotation.XFDFPlainFreeTextAnnotation">

Textkommentar auf die Seite aufbringen, schwarze Schrift, kein Rahmen
Textfeld hinzufügen Textfeld Annotation, XFDFFreeText

<annotation-template name="XFDFFreeText" extends="FreeText">

<annotation-type name="FreeText" archetype="FreeText" extends="FreeTextTypeWriter"> und
<annotation-type name="FreeTextTypeWriter" archetype="FreeTextTypeWriter"
class="com.levigo.jadice.format.xfdf.annotation.XFDFPlainFreeTextAnnotation">

Textfeld auf die Seite aufbringen, rote Schrift und Rahmen
Zeichenwerkzeug verwenden Stift Annotation, XFDFInk

<annotation-template name="XFDFInk" extends="Ink">

<annotation-type name="Ink" archetype="Ink"
class="com.levigo.jadice.format.xfdf.annotation.XFDFInkAnnotation">

Durch Mausbewegung induzierte rote Linie auf Seite aufbringen
Zeichnung löschen Diese Funktion wird durch ein Tool bereitgestellt. -/- -/- Siehe Abschnitt „Konfiguration und Verwendung des Rubber-Tools“
Stempel hinzufügen Vordefinierten Stempel aufbringen, XFDFStamp

<annotation-template name="XFDFStamp" extends="Stamp">

<annotation-type name="Stamp" archetype="Stamp"
class="com.levigo.jadice.format.xfdf.annotation.XFDFStampAnnotation">

Siehe Abschnitt „Konfiguration und Verwendung von vordefinierten Stempel“
Datei anhängen Diese Funktion wird derzeit nicht bereitgestellt. -/- -/- -/-
Audio aufzeichnen Diese Funktion wird derzeit nicht bereitgestellt. -/- -/- -/-
Linie zeichnen Linien Annotation, XFDFLine

<annotation-template name="XFDFLine" extends="Line">

<annotation-type name="Line" archetype="Line"
class="com.levigo.jadice.format.xfdf.annotation.XFDFLineAnnotation">

Gerade rote Linie
Pfeil zeichnen Pfeil Annotation,

<annotation-template name="XFDFLineArrow" extends="LineArrow">

<annotation-type name="LineArrow" archetype="LineArrow" extends="Line"> und
<annotation-type name="Line" archetype="Line"
class="com.levigo.jadice.format.xfdf.annotation.XFDFLineAnnotation">

Roter Pfeil mit offener Spitze
Rechteck zeichnen Rechteck Annotation, XFDFSquare

<annotation-template name="XFDFSquare" extends="Square">

<annotation-type name="Square" archetype="Square"
class="com.levigo.jadice.format.xfdf.annotation.XFDFSquareAnnotation">

Rotes Rechteck
Oval zeichnen Oval Annotation, XFDFCircle

<annotation-template name="XFDFCircle" extends="Circle">

<annotation-type name="Circle" archetype="Circle" extends="Square"
class="com.levigo.jadice.format.xfdf.annotation.XFDFCircleAnnotation">

Rotes Oval, Kreis
Textlegende hinzufügen Textlegende Annotation, XFDFFreeTextCallout

<annotation-template name="XFDFFreeTextCallout" extends="FreeTextCallout">

<annotation-type name="FreeTextCallout" archetype="FreeTextCallout" extends="FreeText">

Kommentar in roter Schrift mit rotem Rahmen mit einem Pfeil
Polygon zeichnen Polygon Annotation, XFDFPolygon

<annotation-template name="XFDFPolygon" extends="Polygon">

<annotation-type name="Polygon" archetype="Polygon"
class="com.levigo.jadice.format.xfdf.annotation.XFDFPolygonAnnotation">

Rotes Polygon
Kommentarwolke zeichnen Kommentarwolke, XFDFPolygonCloud

<annotation-template name="XFDFPolygonCloud" extends="PolygonCloud">

<annotation-type name="PolygonCloud" archetype="PolygonCloud"
class="com.levigo.jadice.format.xfdf.annotation.XFDFPolygonAnnotation">

Rotes gekringeltes Polygon
Verbundene Linien zeichnen Verbundene Linien Annotation, XFDFPolyline

<annotation-template name="XFDFPolyline" extends="Polyline">

<annotation-type name="Polyline" archetype="Polyline"
class="com.levigo.jadice.format.xfdf.annotation.XFDFPolylineAnnotation">

Rotes Polygon


Selektionsbasierende Annotationen

Selektionsbasierte Annotation brauchen für ihre Anwendbarkeit ein vorab ausgewählten, selektierten Text. Solche Annotationen sind XFDFHighlight, XFDFUnderline, XFDFStrikeOut, XFDFCaretReplace und XFDFCaret. Dieser Abschnitt befasst sich mit der Sicherstellung einer Text Selektion zum Aufbringen der genannten Annotationen.

Um diese Aufgabe zu erfüllen werden zwei Dinge benötigt, zum Einen ein TextSelectionTool zur Bereitstellung von selektierten Text, zum Anderen wird ein Command benötigt, das vor dem Aufbringen einer selektionsbasierenden Annotation eine Text Auswahl sicherstellt.

Weiterführende Informationen zum TextSelectionTool und Commands finden sich in den Abschnitten „Modus-Tools“ und „Kommandos (Command)“.

Das TextSelectionTool wird inital zum Start einer Anwendung im ToolManager registriert. Ein Beispiel findet sich hierzu in der Demoklasse BasicDemoApplication

ToolManager tm = ...; 
tm.register(TextSelectionTool.class, true);

Damit ist die erste Voraussetzung, ein TextSelectionTool zur Bereitstellung von selektierten Text, bereits gegeben. Im Weiteren wird ein Command benötigt, das vor dem Aufbringen einer selektionsbasierenden Annotation eine Text Auswahl sicherstellt.

Für jeden Typ von selektionsbasierenden Annotationen, wird ein entsprechendes Command benötigt. Allen dieser Commands liegt die Bereitstellung von selektierten Text zugrunde. Von daher macht es Sinn eine passende abstrakte Basisklasse zu anzulegen, die diese Prüfung übernimmt.

Codebeispiel einer abstrakten Command Basisklasse zum Anlegen einer textselektionsbasierten Annotation:

import static java.awt.geom.PathIterator.SEG_CLOSE;
import static java.awt.geom.PathIterator.SEG_LINETO;
import static java.awt.geom.PathIterator.SEG_MOVETO;

import java.awt.geom.GeneralPath;
import java.awt.geom.Path2D;
import java.awt.geom.PathIterator;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import org.jadice.util.log.Logger;
import org.jadice.util.log.LoggerFactory;

import com.levigo.jadice.annotation.Annotation;
import com.levigo.jadice.annotation.AnnotationPageSegment;
import com.levigo.jadice.annotation.Annotations;
import com.levigo.jadice.annotation.profiles.AnnotationProfile;
import com.levigo.jadice.document.Document;
import com.levigo.jadice.document.Selection;
import com.levigo.jadice.format.xfdf.annotation.XFDFAnnotation;
import com.levigo.jadice.swing.commands.AbstractDocumentCommand;
import com.levigo.jadice.swing.search.tool.TextSelectionTool;

public abstract class CreateTextSelectionBasedAnnotation extends AbstractDocumentCommand {

  private static final Logger LOGGER = LoggerFactory.getLogger(CreateTextSelectionBasedAnnotation.class);

  @Override
  protected void execute() {
    try {
      TextSelectionTool tool = getPageView().getToolManager().getTool(TextSelectionTool.class);

      List<Path2D> selections = new ArrayList<>();

      if (tool.getSelections().size() > 0) {
        for (Selection selection : tool.getSelections()) {
          final float[] tmp = new float[6];
          GeneralPath part = new GeneralPath();

          for (final PathIterator i = selection.getShape().getPathIterator(null); !i.isDone(); i.next()) {
            final int type = i.currentSegment(tmp);
            if (type == SEG_MOVETO) {
              part.moveTo(tmp[0], tmp[1]);
            }
            if (type == SEG_LINETO) {
              part.lineTo(tmp[0], tmp[1]);
            }
            if (type == SEG_CLOSE) {
              part.closePath();
              selections.add(new GeneralPath(part));
              part.reset();
            }
          }

          AnnotationPageSegment annotationPageSegment = Annotations.getAnnotationPageSegment(selection.getPage(), true);
          Annotation a = createAnnotation(selections);
          update(a);
          annotationPageSegment.addAnnotation(a);
        }

        tool.clearSelection();
      }
    } catch (Exception e) {
      LOGGER.error("Error creating annotation", e);
    }
  }

  protected abstract Annotation createAnnotation(List<Path2D> selections) throws Exception;

  protected abstract String getName();

  @Override
  protected boolean canExecute() {
    return getPageView() != null && getPageView().getDocument() != null && getPageView().getToolManager() != null
        && getPageView().getToolManager().getTool(TextSelectionTool.class) != null
        && getPageView().getToolManager().getTool(TextSelectionTool.class).getSelections().size() > 0;
  }

  protected AnnotationProfile getProfile(Document document) {
    AnnotationProfile profile = (AnnotationProfile) document.getProperties().get(AnnotationProfile.class.getName());
    if (profile == null) {
      profile = AnnotationProfile.getDefaultProfile();
    }
    return profile;
  }

  public void update(Annotation a) {
    updateTitle(a);
    updateID(a);
  }

  public void updateTitle(Annotation a) {
    if (a instanceof XFDFAnnotation) {
      final XFDFAnnotation xfdf = ((XFDFAnnotation) a);
      if (xfdf.getTitle() == null) {
        // Set user name -> Adobe-Reader behavior
        final String title = System.getProperty("user.name");
        xfdf.setTitle(title);
      }
    }
  }

  public void updateID(Annotation a) {
    if (a.getID() == null) {
      UUID id = UUID.randomUUID();
      a.setID(id.toString());
    }
  }
}

Die obige Klasse prüft das Vorhandensein von selektierten Text und bestimmt über den Rückgabewert der canExecute-Methode den Enabled-State des Command der Annotation.

Codebeispiel zum Anlegen einer Markierungsannotation:

import java.awt.geom.Path2D;
import java.util.List;

import com.levigo.jadice.annotation.Annotation;
import com.levigo.jadice.annotation.profiles.AnnotationProfile;
import com.levigo.jadice.format.xfdf.annotation.XFDFTextMarkupAnnotation;

public class CreateTextHighlightAnnotation extends CreateTextSelectionBasedAnnotation {

  @Override
  protected Annotation createAnnotation(List<Path2D> selections) throws Exception {
    AnnotationProfile profile = getProfile(getPageView().getDocument());
    XFDFTextMarkupAnnotation a = (XFDFTextMarkupAnnotation) profile.getTemplate(getName()).createNewInstance();
    a.setCoords(selections);
    return a;
  }
  
  @Override
  protected String getName() {
    return "XFDFHighlight";
  }
}                        

Codebeispiel zum Anlegen einer durchgestrichenen Caret-Annotation:

import java.awt.geom.Path2D;
import java.awt.geom.Rectangle2D;
import java.util.List;

import com.levigo.jadice.annotation.Annotation;
import com.levigo.jadice.annotation.profiles.AnnotationProfile;
import com.levigo.jadice.format.xfdf.annotation.XFDFCaretAnnotation;
import com.levigo.jadice.format.xfdf.annotation.XFDFStrikeOutAnnotation;

public class CreateCaretAnnotation extends CreateTextSelectionBasedAnnotation {

  @Override
  protected Annotation createAnnotation(List<Path2D> selections) throws Exception {
    AnnotationProfile profile = getProfile(getPageView().getDocument());
    XFDFCaretAnnotation caret = (XFDFCaretAnnotation) profile.getTemplate(getName()).createNewInstance();
    if ("Replace".equals(caret.getIntent())) {
      XFDFStrikeOutAnnotation strikeOut = (XFDFStrikeOutAnnotation) profile.getTemplate(
          getName()).createNewInstance();
      strikeOut.getCoords().addAll(selections);
      strikeOut.setStrokeColor(caret.getStrokeColor());
      caret.setStrikeOut(strikeOut);
    }
    Rectangle2D selection = selections.get(selections.size() - 1).getBounds2D();
    double h = selection.getHeight() * (2d / 3d);
    double w = h * 1.27d; // ratio width / height taken from AdobeReader created caret anno
    double x = selection.getX() + selection.getWidth() - (w / 2d);
    double y = selection.getY() + (selection.getHeight() * (1d / 3d));
    caret.setLocation(x, y);
    caret.setSize(w, h);
    return caret;
  }
  
  @Override
  protected String getName() {
    return "XFDFStrikeOutTextEdit";
  }
}

Konfiguration und Verwendung von vordefinierten Stempel

Acrobat bietet zwei verschiedene Sets "Dynamisch" und "Geschäftlich" von vordefinierten Stempeln an. Diese kann man ähnlich konfigurieren oder auch eigene Stempel Typen anlegen. Im Folgenden wird ein "Hier unterschreiben"- Stempel examparisch beschrieben.

Für die Verwendung von vordefinierten Stempeln muss im ersten Schritt ein entsprechendes Template angelegt werden. Das in der Tabelle Tabelle 4.1, „Übersicht der Acrobat Annotationen in Zuordnung der Dekalration im XFDF Annotation Profile“ genannte Stamp Annotation Template dient dabei als zu erweiternde Basis für die Spezifikation spezifischer Stempel.

          
<!-- Template to define customizer -->
<annotation-template name="XFDFCustomStamp" extends="XFDFStamp">
  <customizer class="com.levigo.jadice.format.xfdf.annotation.customizer.XFDFStampAnnotationCustomizer" />
</annotation-template>

          

Im obigen Beispiel wird ein XFDFCustomStamp als Standard Template für alle zu definierenden Stempel erzeugt. Die Klasse XFDFStampAnnotationCustomizer dient dabei als Customizer für die zu erzeugenden Stempel. Customize können als Beispiel ein gewünschtes Icon oder auch Appearance setzen.

Im nächsten Schritt wird der "Hier unterschreiben"-Stempel konfiguriert.

          
<annotation-template name="XFDFStampSHSignHere" extends="XFDFCustomStamp">
  <labels>
  <label locale="en">Sign here</label>
  <label locale="de">Hier unterschreiben</label>
  </labels>
  <default name="icon">SHSignHere</default>
</annotation-template>

Die Labels bestimmen den Anzeigename bzw. den Tooltip der Annotation. Die Konfiguration erlaubt die Angabe Locale spezifischer Labels. Weiterhin wird eine passende Icon Resource mit dem Namen "SHSignHere" benannt. Icon Resource NAmen sollten dabei eindeutig gewählt werden. Es ist Aufgabe des Customizers das passende Icon für die angebende Icon Resource der Stamp Annotation zur Verfügung zu stellen.

Konfiguration und Verwendung des Rubber-Tools

Die XFDFRubberTool Klasse ist eine Tool Implementierung mit der man Elemente der XFDF Ink-Annotation löschen / entfernen kann.

Um das Rubber-Tool verwenden zu können muss es bei der ToolManager Klasse registriert werden:

ToolManager tm = ...; 
tm.register(XFDFRubberTool.class, true);

[jadice viewer Version 6.0.0: Dokumentation für Entwickler. Veröffentlicht: 2024-07-11]