Der MetadataNode
Der MetadataNode
bietet zunächst diejenigen Funktionen, die man
von ihm erwartet: Zugriff auf Basisinformationen (getName()
,
getText()
, getCDATA()
), Attribute
(getAttribute(...)
, findAttribute(...)
) und
Kindknoten (getChild*(...)
). Auch der Zugriff auf die darunter liegende
DOM-Repräsentation wird gewährt mittels
getElement()
– auch wenn man diesen Wunsch sicher selten verspüren
wird. Richtig mächtig wird der MetadataNode
aber erst dadurch, dass
er in der Lage ist, Aufgaben nicht nur durch einfache Navigation des
DOM-Baumes zu erledigen, sondern viele Funktionen unter minimalem Aufwand
mittels XPath-Ausdrücken genutzt werden können. Aber lassen wir
doch einfach einige Beispiele sprechen:
// wir laden zunächst ein TIFF-Bild final Reader reader = new Reader(); reader.read(new File("example.tif")); // hiervon holen wir uns die erste Seite und darin das Standard-PageSegment final PageSegment ps = reader.getDocument().getPage(0) .getPageSegment(DocumentLayer.DEFAULT); // lassen wir die Metadaten sprechen final Metadata md = ps.getMetadata(); System.out.println(md.toString()); // simples Ausgeben auf die Konsole
In der Konsole erscheint das Ergebnis, das wie folgt beginnt:
<tiff> <ifd group="TIFF6"> <field code="256" count="1" name="ImageWidth" type="SHORT"> <number>1168</number> </field> [...]
Soweit so einfach. Wir würden nun gerne wissen, welche Beschreibung der Erzeuger des TIFFs für uns hinterlegt hat:
final MetadataNode r = md.getRoot();
r.evalToNumber("ifd[@group='TIFF6']/field[@name='ImageDescription']/string")
Wir hätten den XPath-Ausdruck auch noch weiter vereinfachen
können, zum Beispiel durch Weglassen des /string
oder des
ifd
-Pfadteils, so sehen Sie aber, wie die vollständige und absolute
Adressierung eines Elementes aussieht. Sollten Sie einmal in die Verlegenheit kommen, wissen
zu müssen, wie an welcher Position in der Datei sich der fünfte Strip eines gestripeten
TIFFs befindet – hier ist die Antwort:
// Ja, XPath adressiert seine Arrays 1-basiert! r.evalToNumber("ifd[@group='TIFF6']/field[@name='StripOffsets']/number[5]")
Die Metadaten für TIFF-Dateien umfassen nicht nur die Basisinformationen aus dem TIFF6-Standard, sondern auch eingebettete EXIF- und XMP-Metadaten. Das eingebettete XMP-Dokument (sofern vorhanden) erhalten Sie zum Beispiel mit
r.getChildren("ifd[@group='TIFF6']/field[@name='XMP']").get(0)
Das XMP-Dokument ist jedoch Teil des Metadaten-Baumes, das heißt Abfragen könnten auch unmittelbar Elemente aus diesem adressieren. Auch die Daten aus eventuell eingebetteten ICC-Profilen werden über die Metadaten bereitgestellt. Der Name des Geräteherstellers (Device Manifacturer Description – dmnd) des Geräts, für das das Farbprofil gilt, gefällig? Bitte sehr:
r.evalToString("ifd[@group='TIFF6']/field[@name='ICCProfile']/icc-profile/tag[@signature='dmnd']/ascii")