Voll funktionsfähiges Beispiel auf GitHub verfügbar:
read-and-write-xmp-in-psd-ai-files-java
Der alte Weg war schmerzhaft
Stellen Sie sich die Archiv‑Aufräumaktion vor, für die sich niemand freiwillig meldet. Ein Ordner mit PSD‑Master‑Dateien und AI‑Quellen benötigt Rechts‑Hinweise und Schlüsselwörter, bevor er ins DAM gelangt. Die Routine: Datei in Photoshop öffnen, Datei‑Info öffnen, Urheberrecht eingeben, Schlüsselwörter eingeben, speichern, schließen, nächste Datei. Jeder Save rendert die mehrschichtige Datei neu, nur um ein paar XMP‑Metadaten‑Strings zu ändern. Das Archiv, das mir diese Lektion erteilte, war ein Ordner mit nicht getaggten Illustrator‑Dateien, die niemand durchsuchen konnte; wir haben es mit einer Schleife behoben, nicht mit mehr Geduld.
Multipliziert man die Routine mit einem Archiv, hört es auf, eine Aufgabe zu sein, und wird zu einem Projekt. Schlimmer noch, es ist nicht auditierbar: Niemand kann später nachweisen, welche Dateien bearbeitet wurden, und die übersprungenen Dateien sehen identisch aus, bis eine Lizenzfrage sie findet. Der Panel‑Weg koppelt zudem stillschweigend die Dateneingabe an Design‑Tools. Wer Metadaten korrigiert, braucht einen Adobe‑Platz, einen Arbeitsplatz, der mehrschichtige Master komfortabel öffnet, und die Geduld, auf Saves zu warten, die das Artwork neu rendern, nur um Strings zu ändern.
Die wirklichen Kosten bei manueller Arbeit: Von Hand korrigierte Metadaten sind Metadaten, die später niemand verifizieren kann; der Prozess hinterlässt keine Spur außer müden Designern.
Es gibt einen besseren Weg
GroupDocs.Metadata für Java liest und schreibt das XMP‑Paket direkt. Casten Sie getRootPackage() zu IXmp und das Paket, seine Schemata und seine Arrays sind gewöhnliche Java‑Objekte, identisch für PSD‑ und AI‑Container, ohne Adobe‑Software. Die Dokumentation listet über 170 Formate hinter derselben API.
Bevor wir starten, benötigen Sie:
- JDK 8 oder neuer mit Maven
- GroupDocs.Metadata für Java 24.7 (holen Sie sich eine temporäre Lizenz)
- Eine PSD‑ oder AI‑Datei zum Üben
Fügen Sie die Abhängigkeit und das GroupDocs‑Repository zu Ihrer pom.xml hinzu:
mvn dependency:get -Dartifact=com.groupdocs:groupdocs-metadata:24.7
Das begleitende Repository liefert ein fertiges pom.xml plus Beispiel‑Dateien beider Formate und prüft jeden Schritt unten.
Der neue Weg: Vier Operationen in Java
Schritt 1 – Sehen, was eine Datei trägt
Der Snapshot gibt das Paket und jedes Schema in einer LinkedHashMap aus und bewahrt die Reihenfolge, in der die Datei sie deklariert.
// Snapshot the packet, then sweep for anything the schemes missed
Map<String, String> result = new LinkedHashMap<>();
try (Metadata metadata = new Metadata(adobeFilePath)) {
IXmp root = (IXmp) metadata.getRootPackage();
if (root != null && root.getXmpPackage() != null) {
for (MetadataProperty p : root.getXmpPackage()) {
put(result, p);
}
XmpSchemes schemes = root.getXmpPackage().getSchemes();
collect(result, schemes.getDublinCore());
collect(result, schemes.getPhotoshop());
collect(result, schemes.getXmpBasic());
collect(result, schemes.getCameraRaw());
}
for (MetadataProperty p : metadata.findProperties(new NamedPropertySpec())) {
if (!result.containsKey(p.getName())) put(result, p);
}
}
return result;
Die kleinen Hilfs‑Methoden put und collect bevorzugen getInterpretedValue(), sodass Daten lesbar ankommen, und der durch Specification gesteuerte Sweep erfasst Hersteller‑Pakete. Die Repository‑Version durchläuft sieben Schemata; die Struktur bleibt gleich.
Schritt 2 – Die Felder lesen, die Fragen beantworten
Lizenz‑Abfragen betreffen dc:rights. Suche interessiert dc:subject. Beide leben im Dublin‑Core, und das gezielte Lesen kostet nur neun Felder, keinen Baum‑Walk.
// dc:* only - the interoperability fields DAM systems agree on
XmpDublinCorePackage dc = root.getXmpPackage().getSchemes().getDublinCore();
if (dc == null) return result;
for (MetadataProperty p : dc) {
String value = "";
if (p.getInterpretedValue() != null
&& p.getInterpretedValue().getRawValue() != null) {
value = String.valueOf(p.getInterpretedValue().getRawValue());
} else if (p.getValue() != null && p.getValue().getRawValue() != null) {
value = String.valueOf(p.getValue().getRawValue());
}
result.put(p.getName(), value);
}
Das Photoshop‑Schema funktioniert auf dieselbe Weise über typisierte Getter (getCity(), getCredit(), getColorMode() und fünf weitere), die die psd‑Metadaten‑Felder abdecken, die Bridge und Lightroom auslesen. Im Repository wird jeder Getter mit einem null‑sicheren Helfer umschlossen, sodass eine spärlich besetzte Datei leere Strings zurückgibt statt Überraschungen. Dieses Detail ist wichtiger, als es aussieht: Der ganze Sinn der Archiv‑Automatisierung ist, dass ungewöhnliche Dateien durchfließen, anstatt die Schleife zu stoppen.
Beide gezielten Lese‑Vorgänge teilen ein Kostenprofil, das namentlich erwähnt werden sollte. Eine Datei öffnen, ein Schema, kein Baum‑Walk. Setzen Sie sie in Request‑Handler und Gates ein; speichern Sie den vollständigen Snapshot für Ingestion‑Jobs, die alles archivieren.
Schritt 3 – Stempeln und Taggen ohne Adobe zu öffnen
Die Writer erzeugen fehlende Strukturen guard‑weise, was sie sicher für frische Exporte macht, die überhaupt kein Paket enthalten.
// Create missing layers, then write rights, creator, and CreatorTool
if (root.getXmpPackage() == null) {
root.setXmpPackage(new XmpPacketWrapper());
}
if (root.getXmpPackage().getSchemes().getDublinCore() == null) {
root.getXmpPackage().getSchemes().setDublinCore(new XmpDublinCorePackage());
}
XmpDublinCorePackage dc = root.getXmpPackage().getSchemes().getDublinCore();
dc.setRights(copyright);
dc.set("dc:creator", XmpArray.from(new String[]{creator}, XmpArrayType.Ordered));
if (root.getXmpPackage().getSchemes().getXmpBasic() == null) {
root.getXmpPackage().getSchemes().setXmpBasic(new XmpBasicPackage());
}
root.getXmpPackage().getSchemes().getXmpBasic().setCreatorTool(creator);
metadata.save(outputPath);
Schlüsselwörter folgen dem gleichen Muster mit einem Aufruf, der das gesamte Bag als ungeordnete Array schreibt:
// Replace the dc:subject bag - merge in Java first for additive tagging
root.getXmpPackage().getSchemes().getDublinCore().set(
"dc:subject", XmpArray.from(keywords, XmpArrayType.Unordered));
metadata.save(outputPath);
Main.java schließt die Schleife: Es liest die Ausgaben erneut und prüft, ob der Urheberrecht‑String und das erste Schlüsselwort tatsächlich erhalten geblieben sind.
Diese abschließende Prüfung verdient einen Satz Advocacy. Metadaten‑Writes schlagen stillschweigend fehl, wenn sie fehlschlagen; die Datei wird gespeichert, die Bytes ändern sich, und der Wert, den Sie schreiben wollten, ist einfach nicht mehr da, weil ein Schema‑Objekt veraltet war oder ein Pfad auf das Original zeigte. Ein Rück‑Read nach jedem Write kostet ein zusätzliches Öffnen pro Datei und verwandelt „das Skript ist fertig“ in „die Werte sind vorhanden“, was die Aussage ist, die ein Archiv‑Besitzer wirklich will. Halten Sie das in der Produktion, nicht nur in der Demo.
Schritt 4 – Wie machen Schlüsselwörter Assets überhaupt auffindbar?
Such‑Tools lesen keine Pixel; sie lesen dc:subject. Bridge, DAM‑Indexer und Stock‑Plattformen behandeln dieses Bag als Vokabular des Assets, sodass eine Datei ohne Schlüsselwörter niemals zu einer Anfrage passt. Das Schreiben des Bags als ungeordnete XmpArray, so wie AddKeywords es tut, ist das, was ein Asset von unsichtbar zu auffindbar bewegt, und der Write kostet einen Save.
Neben‑an‑Neben: Vorher vs. Nachher
| Vorher (Panel‑Bearbeitung) | Nachher (Java‑Pipeline) | |
|---|---|---|
| Werkzeuge | Photoshop oder Bridge pro Datei | Ein Maven‑Projekt, kein Adobe‑Platz |
| Abdeckung | Felder, die das Panel zeigt | Jedes Schema plus Hersteller‑Pakete |
| Wiederholbarkeit | Hängt davon ab, wer geklickt hat | Gleiche Schleife, gleiches Ergebnis, auditierbar |
| XMP‑lose Dateien | Panel‑Verhalten variiert | Guard‑Erstellung erzeugt Paket und Schemata |
| Verifizierung | Vertrauen | Rück‑Read‑Assert pro Datei |
Die Verifizierungs‑Zeile entscheidet für Archive: Ein Skript, das seine eigenen Writes beweist, ist der Unterschied zwischen „wir haben die Dateien getaggt“ und „wir können es Ihnen zeigen“.
Praxisbeispiel: Die Übergabe durch die Agentur
Ein Studio erhält gemischte PSD‑ und AI‑Lieferungen von drei Agenturen, jede mit ihrer eigenen Metadaten‑Disziplin. Ihr Intake‑Job führt jetzt beim Eintreffen den Snapshot aus, markiert Dateien, bei denen dc:rights leer ist, versieht sie mit der vertraglich vereinbarten Rechtszeile und schreibt das Kampagnen‑Keyword‑Set. Die gleiche Schleife dient beiden Formaten, weil im Code kein Container namentlich erwähnt wird, und Illustrator‑Metadaten, die leer ankommen, lassen das Intake getaggt und durchsuchbar zurück.
Die Folgewirkung war der Teil, den das Studio nicht vorhergesehen hatte: Agentur‑Scorecards. Da der Intake‑Job protokolliert, welche Lieferungen leere Rechts‑Felder hatten, sieht die Beschaffung, welche Lieferanten saubere Metadaten liefern und welche darauf vertrauen, dass der Kunde sie korrigiert. Das Gespräch mit dem größten Übeltäter brauchte nur ein Diagramm.
Was können Sie sonst noch mit GroupDocs.Metadata tun?
- EXIF und IPTC in denselben Dateien: PSDs tragen drei Metadaten‑Standards; dieselbe Bibliothek liest die anderen beiden über eigene Pakete, sodass ein vollständiges Asset‑Profil nur zwei weitere Reads entfernt ist.
- 170+ weitere Formate: Der identische
Metadata‑Einstiegspunkt dient Office, PDF, Audio‑ und Video‑Dateien, wodurch ein Intake‑Job ein ganzes gemischtes Archiv abdeckt. - Property‑Suche:
findPropertiesmit einerSpecificationdurchforstet jede Datei nach beliebigen Prädikaten, von Rechts‑Checks bis zu benutzerdefinierten Feld‑Suchen.
Fazit
Was früher eine per‑Datei‑Panel‑Routine war, ist jetzt vier Java‑Operationen: Snapshot, gezieltes Lesen, Eigentums‑Stempel, Schlüsselwort‑Write. Derselbe Code dient PSD‑ und AI‑Dateien, Guard‑Erstellungen machen leere Exporte sicher, und das behauptete Beispiel‑Projekt beweist das gesamte Set, bevor Sie es auf ein echtes Archiv anwenden.
Bereit, das Datei‑Info‑Panel in Rente zu schicken?
- Bauen Sie das Beispiel‑Projekt mit
mvn compile exec:java - Durchlaufen Sie den vergleichs‑artigen Anwendungs‑Leitfaden
- Lesen Sie die Referenz zu Arbeiten mit XMP‑Metadaten