Plně funkční příklad dostupný na GitHubu:
read-and-write-xmp-in-psd-ai-files-java
Starý způsob byl bolestivý
Představte si úklid archivu, do kterého se nikdo nehlásí dobrovolně. Složka s PSD master soubory a AI zdrojovými soubory potřebuje oznámení o právech a klíčová slova, než vstoupí do DAM. Rutina: otevřít soubor ve Photoshopu, otevřít File Info, napsat copyright, napsat klíčová slova, uložit, zavřít, další soubor. Každé uložení znovu renderuje vrstvený soubor jen kvůli změně několika řetězců xmp metadat. Archiv, který mě tuto lekci naučil, byl složka neoznačených souborů Illustratoru, které nikdo nemohl vyhledat; opravili jsme to smyčkou, ne více trpělivostí.
Vynásobte tuto rutinu archivem a přestane to být úkol a stane se projektem. Horší je, že je to neauditovatelné: nikdo nemůže později dokázat, které soubory byly zpracovány, a ty, které byly přeskočeny, vypadají identicky, dokud se na ně neobjeví otázka licencování. Cesta přes panel také tiše spojuje zadávání dat s nástroji pro design. Kdo opravuje metadata, potřebuje licenci Adobe, pracovní stanici, která pohodlně otevírá vrstvené master soubory, a trpělivost čekat na ukládání, která znovu renderuje grafiku jen kvůli změně řetězců.
Skutečná cena ručního provádění: metadata opravená ručně jsou metadata, která nikdo nemůže později ověřit; proces nezanechává žádnou stopu kromě unavených designérů.
Existuje lepší způsob
GroupDocs.Metadata pro Java čte a zapisuje XMP paket přímo. Přetypujte getRootPackage() na IXmp a paket, jeho schémata a pole jsou obyčejné Java objekty, identické pro kontejnery PSD i AI, bez jakéhokoli softwaru Adobe. Dokumentace uvádí více než 170 formátů za stejným API.
Než začneme, budete potřebovat:
- JDK 8 nebo novější s Mavenem
- GroupDocs.Metadata pro Java 24.7 (získat dočasnou licenci)
- Soubor PSD nebo AI pro cvičení
Přidejte závislost a repozitář GroupDocs do svého pom.xml:
mvn dependency:get -Dartifact=com.groupdocs:groupdocs-metadata:24.7
Companion repository dodává připravený pom.xml plus vzorové soubory obou formátů a ověřuje každý krok níže.
Nový způsob: čtyři operace v Javě
Krok 1 – Zjistěte, co soubor obsahuje
Snímek (snapshot) vypíše paket a každé schéma do jednoho LinkedHashMap, zachovávající pořadí, ve kterém soubor deklaruje.
// 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;
Malé pomocné funkce put a collect upřednostňují getInterpretedValue(), takže data jsou čitelná, a prohledávání řízené Specification zachytí vendorové pakety. Verze v repozitáři prochází sedm schémat; struktura zůstává stejná.
Krok 2 – Přečtěte pole, která odpovídají na otázky
Licencování se ptá na dc:rights. Vyhledávání se zajímá o dc:subject. Obě jsou v Dublin Core a cílené čtení zahrnuje devět polí, ne procházení celého stromu.
// 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);
}
Schéma Photoshop funguje stejným způsobem pomocí typovaných getterů (getCity(), getCredit(), getColorMode() a dalších pěti), pokrývajících pole metadata PSD, která čtou filtry Bridge a Lightroom. V repozitáři tento čteč zabaluje každý getter do null-bezpečné pomoci, takže řídce vyplněný soubor vrací prázdné řetězce místo neočekávaných hodnot. Tento detail je důležitější, než vypadá: celý smysl automatizace archivu je, aby se podivná soubory zpracovávala místo zastavení smyčky.
Obě cílená čtení sdílejí nákladový profil, který stojí za zmínku. Otevření jednoho souboru, jedno schéma, žádné procházení stromu. Umístěte je do handlerů požadavků a bran; uložte celý snímek pro ingestní úlohy, které ukládají vše.
Krok 3 – Vložte razítko a štítek bez otevření Adobe
Zapisovače vytvářejí chránené (guard-create) vše, co chybí, což je činí bezpečnými pro čerstvé exporty, které vůbec neobsahují paket.
// 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);
Klíčová slova následují stejný vzor jedním voláním, zapisují celý bag jako neřazené pole:
// 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 uzavírá smyčku: znovu načte výstupy a ověří, že řetězec autorských práv a první klíčové slovo skutečně přežily uložení.
Toto závěrečné ověření si zaslouží větu obhajoby. Zápisy metadata selhávají tiše, když selžou; soubor se uloží, bajty se změní a hodnota, kterou jste chtěli zapsat, prostě chybí, protože objekt schématu byl zastaralý nebo cesta ukazovala na originál. Zpětné čtení po každém zápisu stojí jedno další otevření souboru a převádí „skript dokončen“ na „hodnoty jsou přítomny“, což je výrok, který vlastník archivu skutečně chce. Používejte to v produkci, ne jen v ukázce.
Jak klíčová slova skutečně umožňují najít aktiva?
Vyhledávací nástroje nečtou pixely; čtou dc:subject. Bridge, indexátory DAM a platformy pro stockové obrázky považují tento bag za slovník aktiva, takže soubor bez klíčových slov se jednoduše nikdy neshoduje s dotazem. Zapsání bagu jako neřazeného XmpArray, jak to dělá AddKeywords, je to, co přesune aktivum z neviditelného na vyhledatelné, a zápis stojí jedno uložení.
Vedle sebe: před a po
| Před (úprava v panelu) | Po (pipeline v Javě) | |
|---|---|---|
| Nástroje | Photoshop nebo Bridge pro každý soubor | Jeden Maven projekt, bez licence Adobe |
| Pokrytí | Pole, která panel zobrazuje | Každé schéma plus vendorové pakety |
| Opakovatelnost | Závisí na tom, kdo kliknul | Stejná smyčka, stejný výsledek, auditovatelný |
| Soubory bez XMP | Chování panelu se liší | Ochranné funkce vytvoří paket a schémata |
| Ověření | Důvěra | Ověřený zpětný výpis pro každý soubor |
Řádek s ověřením rozhoduje pro archivy: skript, který dokazuje své vlastní zápisy, je rozdílem mezi „označili jsme soubory“ a „můžeme vám to ukázat“.
Příklad ze skutečného světa: předání agenturou
Studio přijímá smíšené dodávky PSD a AI od tří agentur, každá s vlastní disciplínou metadata. Jejich ingestní úloha nyní při příchodu spustí snímek, označí soubory, jejichž dc:rights je prázdný, vloží do nich řádek s dohodnutými právy a zapíše sadu klíčových slov kampaně. Stejná smyčka slouží oběma formátům, protože v kódu není žádný název kontejneru, a metadata Adobe Illustratoru, která přicházejí prázdná, ponechají ingest označený a vyhledatelný.
Následný efekt je část, kterou studio nečekalo: skóre agentur. Protože ingestní úloha zaznamenává, které dodávky přišly s prázdnými poli práv, nákup nyní vidí, kteří dodavatelé dodávají čistá metadata a kteří se spoléhají na klienta, aby je opravil. Rozhovor s největším porušovatelem trval jeden graf.
Co dalšího můžete dělat s GroupDocs.Metadata?
- EXIF a IPTC ve stejných souborech: PSD obsahují tři standardy metadata; stejná knihovna čte další dva prostřednictvím jejich vlastních balíčků, takže kompletní profil aktiva je vzdálen dva další čtení.
- 170+ dalších formátů: identický vstupní bod
Metadataslouží pro Office, PDF, audio a video soubory, což je způsob, jak jedna ingestní úloha pokrývá celý smíšený archiv. - Vyhledávání vlastností:
findPropertiessSpecificationprohledá libovolný soubor podle libovolného predikátu, který definujete, od kontrol práv po hledání vlastních polí.
Závěr
Co bylo dříve rutinní operací panelu pro každý soubor, je nyní čtyři operace v Javě: snímek, cílené čtení, razítko vlastnictví, zápis klíčových slov. Stejný kód slouží souborům PSD i AI, ochranné funkce činí prázdné exporty bezpečnými a ověřený ukázkový projekt dokazuje celý soubor, než jej nasadíte na skutečný archiv.
Jste připraveni vyřadit panel File Info?
- Sestavte ukázkový projekt pomocí
mvn compile exec:java - Projděte si průvodce použitím ve stylu srovnání
- Přečtěte si referenci Práce s XMP metadata