Plně funkční příklad dostupný na GitHubu:
manage-xmp-in-psd-and-ai-files-python
Úvod
Marketingový tým nahodí 400 souborů PSD do vaší platformy pro digitální aktiva. Nahrávání funguje. Vyhledávání ne, protože žádný ze souborů neobsahuje klíčová slova, polovina postrádá upozornění na autorská práva a jména designérů jsou uložena jen v tabulce někde jinde. Řešením není větší tabulka. Správa XMP je schopnost GroupDocs.Metadata pro Python přes .NET, která čte a zapisuje paket metadat vložený do souborů Photoshop PSD a Illustrator AI, což znamená, že informace o vlastnictví a vyhledávání mohou žít přímo v souborech.
XMP je XML paket uvnitř binárního kontejneru, organizovaný do schémat: Dublin Core pro pole, která rozumí každý systém, schéma Photoshop pro editační kontext, XmpBasic pro identitu nástroje. Parsování PSD ručně, aby se dosáhlo na tento paket, je opravdu obtížné. S třídou Metadata jsou to jen tři vyhledávání atributů a stejný kód funguje i pro AI soubory.
Tento tutoriál provede kompletní cyklus ve čtyřech krocích: pořídit snímek celého paketu, přečíst důležitá schémata, zapsat autorská práva a tvůrce a označit klíčová slova pro vyhledávání. Každý úryvek pochází z spustitelného repozitáře, který ověřuje, že zapsané hodnoty přetrvávají.
Požadavky
Před zahájením se ujistěte, že máte:
- Python 3 s pip
- GroupDocs.Metadata pro Python přes .NET (repozitář fixuje verzi 26.5)
- Soubor PSD nebo AI, se kterým můžete experimentovat
Instalace
pip install groupdocs-metadata-net==26.5
Krok 1 – Snímek celého XMP balíčku
Začněte tím, že si prohlédnete vše, co soubor nese. Snímek prochází kořenový paket, každé registrované schéma a nakonec prohledá strom vlastností pro cokoliv nestandardního, sbírá vše do jedné ploché slovníkové struktury.
result = {}
def put(props, prop):
value = (str(prop.interpreted_value) if prop.interpreted_value is not None
else (str(prop.value) if prop.value is not None else ""))
props[prop.name] = value
with Metadata("campaign-hero.psd") as metadata:
root = metadata.get_root_package()
xmp = getattr(root, "xmp_package", None)
if xmp is not None:
for p in xmp: # root packet properties
put(result, p)
schemes = xmp.schemes
for scheme in (schemes.dublin_core, schemes.xmp_basic, schemes.photoshop,
schemes.camera_raw, schemes.paged_text,
schemes.xmp_dynamic_media, schemes.xmp_media_management):
if scheme is None:
continue
for p in scheme:
put(result, p)
for p in metadata.find_properties(lambda p: p.name is not None):
if p.name not in result: # catch custom packets
put(result, p)
Klíčové body:
interpreted_valuejako první: data a výčty přicházejí v lidsky čitelné podobě místo surových hodnot.- Sedm schémat plus prohledání: závěrečný průchod
find_propertieszachytí vendorové pakety, které pojmenovaná schémata minou. - Jedno otevření souboru: celý snímek stojí jediný kontext
Metadata, což je důležité při hromadném ingestování.
Tip: indexujte tento slovník při ingestování a většina pozdějších otázek o metadatech se změní na vyhledávání ve slovníku místo čtení souboru.
Který XMP schéma by měla moje integrace číst nejdříve?
Začněte s Dublin Core. Jeho devět polí dc: nese název, tvůrce, práva a předmět, které většina DAM systémů, vyhledávacích indexů a kontrol licencí používá, a jak PSD, tak AI soubory je vystavují identicky. Druhé čtěte schéma Photoshop pro editační kontext jako City, Credit a DateCreated. Kompletní prohledání paketu nechte na ingestovacích úlohách, které musí zachytit vše.
Krok 2 – Čtení schémat, která odpovídají na skutečné otázky
Pro kód během požadavku omezte čtení na jedno schéma. Dublin Core odpovídá na otázky vlastnictví a vyhledávání:
dc_fields = {}
with Metadata("campaign-hero.psd") as metadata:
xmp = getattr(metadata.get_root_package(), "xmp_package", None)
dc = xmp.schemes.dublin_core if xmp is not None else None
if dc is not None:
for p in dc:
dc_fields[p.name] = (str(p.interpreted_value)
if p.interpreted_value is not None else
str(p.value) if p.value is not None else "")
print(dc_fields.get("dc:rights", "<no rights recorded>"))
Schéma Photoshop funguje stejným způsobem přes typované vlastnosti: ps.color_mode, ps.icc_profile, ps.city, ps.country, ps.date_created, ps.caption_writer, ps.credit a ps.source, každá čtená s ochranou proti None. To jsou pole, na která se filtrují vyhledávací nástroje Bridge, Lightroom a DAM pro soubory Adobe.
Všimněte si, co se stane u souborů bez XMP: ochrany vytvoří prázdný slovník, ne výjimku. Čerstvě exportovaná aktiva tento případ běžně představují, takže si tuto vlastnost zachovejte ve své integraci.
Stejné tři vyhledávání fungují i pro soubory Illustrator. Vyměňte campaign-hero.psd za brand-mark.ai a nic dalšího se nezmění, což umožňuje mít jeden kódový tok pro smíšené Adobe archivy. V praxi čerstvý AI export často obsahuje méně vyplněných schémat než uložení Photoshopu, takže cesta s prázdným slovníkem se tam častěji používá.
Krok 3 – Zapsání autorských práv a tvůrce
Nyní cesta zápisu. Oznámení vlastnictví se dotýká tří polí, aby každý čteč viděl stejnou identitu: dc:rights pro právní upozornění, dc:creator jako uspořádaný seznam a xmp:CreatorTool pro nástroje, které čtou schéma XmpBasic místo Dublin Core. Jednou jsem ztratil odpoledne kvůli licenčnímu banneru zobrazujícímu „Unknown author“ na aktivech, která designéři tvrdili, že jsou označena; hodnoty byly v dc:creator, ale nástroj četl jen xmp:CreatorTool. Zapsání obou ukončilo tuto třídu chyb.
with Metadata("campaign-hero.psd") as metadata:
root = metadata.get_root_package()
xmp = getattr(root, "xmp_package", None)
if xmp is None: # file has no XMP at all
root.xmp_package = XmpPacketWrapper()
xmp = root.xmp_package
if xmp.schemes.dublin_core is None:
xmp.schemes.dublin_core = XmpDublinCorePackage()
dc = xmp.schemes.dublin_core
dc.set_rights("(C) 2026 GroupDocs Sample")
dc.set("dc:creator", XmpArray.from_(["Digital Asset Team"],
XmpArrayType.ORDERED))
if xmp.schemes.xmp_basic is None:
xmp.schemes.xmp_basic = XmpBasicPackage()
xmp.schemes.xmp_basic.creator_tool = "Digital Asset Team"
metadata.save("campaign-hero-stamped.psd")
Klíčové body:
- Ochrany vytvářejí chybějící vrstvy:
XmpPacketWrapperaXmpDublinCorePackagejsou vytvořeny na vyžádání, takže zápis funguje i u souborů bez XMP. - ORDERED pole pro tvůrce: pořadí autorů nese význam, proto seznam tvůrců používá uspořádané
XmpArray. - Uložení do nové cesty: zdrojový soubor zůstane nedotčený, což je správná výchozí volba pro exportní kroky.
Krok 4 – Označení klíčových slov pro vyhledávání
dc:subject je „bag“ klíčových slov pro indexy DAM. Zápis nahradí celý „bag“ jedním voláním:
with Metadata("campaign-hero.psd") as metadata:
root = metadata.get_root_package()
xmp = getattr(root, "xmp_package", None)
if xmp is None:
root.xmp_package = XmpPacketWrapper()
xmp = root.xmp_package
if xmp.schemes.dublin_core is None:
xmp.schemes.dublin_core = XmpDublinCorePackage()
xmp.schemes.dublin_core.set(
"dc:subject",
XmpArray.from_(["landscape", "sunset", "commercial"],
XmpArrayType.UNORDERED))
metadata.save("campaign-hero-tagged.psd")
Klíčová slova používají UNORDERED pole, protože pořadí pro indexer nic neznamená. A protože set nahrazuje existující „bag“, nejprve přečtěte aktuální klíčová slova a sloučte je v Pythonu, pokud potřebujete přidávat značky místo nahrazení.
Pro ověření jakéhokoli zápisu spusťte znovu čtečku ze Krok 2 proti výstupnímu souboru. Repo automatizuje právě to: znovu načte své výstupy a ověří, že řetězec autorských práv a první klíčové slovo přetrvávají v uložených bajtech.
Praktické aplikace
Ingestování do DAM
Spusťte snímek z Krok 1 na každý příchozí soubor a uložte slovník vedle záznamu o aktivu. Vyhledávání, deduplikace a kontrola práv pak probíhají proti vaší databázi místo opětovného otevírání binárních souborů. Snímek z malého ukázkového PSD v repozitáři už při jednom průchodu vrací zdravou zásobu vlastností a stejné volání si zachová strukturu, když vstupem bude složka s tisíci soubory.
Vynucování licencí
Před tím, než se aktivum odešle do klientského portálu, vyžadujte ne‑prázdné dc:rights. Souborům, které selžou, se automaticky aplikuje ošetření z Krok 3, takže nic neopustí bez upozornění.
Hromadné přeoznačování
Když se změní taxonomie, přečtěte dc:subject každého souboru, mapujte staré termíny na nové v Pythonu a zapište sloučený „bag“ zpět pomocí Krok 4. Oba archivy PSD i AI používají stejný cyklus. Není potřeba žádná licence Photoshopu.
Nejlepší postupy a tipy
- Považujte prázdné za normální: soubory bez XMP jsou běžné, ne chyby; vzor „early‑return“ udržuje pipeline plynulou.
- Sloučte před zápisem klíčových slov:
setnahrazujedc:subject, takže přidávání značek znamená přečíst, rozšířit, zapsat. - Zapište identitu do obou schémat: spárování
dc:creatorsxmp:CreatorTooludržuje čtenáře Dublin Core i XmpBasic v souladu. - Ověřte zápisy zpětným čtením: opětovné načtení po uložení je levné a okamžitě zachytí neočekávané změny kontejneru.
- Licence pro produkci: evaluační režim spouští vše, co je zde ukázáno; před označováním reálných klientských aktiv použijte licenci.
Závěr
Čtení a zápis XMP v souborech Adobe se redukuje na tři kroky: získat paket pomocí get_root_package(), vytvořit ochranu pro potřebné schéma a číst nebo zapisovat typované hodnoty. S těmito kroky jste v tomto tutoriálu postavili kompletní cyklus – od snímku paketu přes čtení schémat až po označení autorských práv a klíčových slov – se stejným kódem fungujícím pro PSD i AI soubory.
Jste připraveni implementovat to ve svém projektu? Zde jsou další kroky:
- Přečtěte si dokumentaci Práce s XMP metadaty pro aktualizaci a odstraňování paketů
- Postupujte podle průvodce zaměřeného na integraci postaveného na stejném repozitáři
- Naklonujte ukázkový projekt a spusťte jej proti vlastním aktivům
Další zdroje
- Dokumentace GroupDocs.Metadata
- Reference API
- Ukázkové projekty na GitHubu
- Kategorie blogu GroupDocs.Metadata
Otázky ohledně vašeho XMP workflow? Zeptejte se na fórum podpory.