Tam çalışan örnek GitHub’da mevcuttur:
manage-xmp-in-psd-and-ai-files-python

Giriş

Bir pazarlama ekibi varlık platformunuza 400 PSD dosyası bırakıyor. Yükleme çalışıyor. Arama çalışmıyor, çünkü dosyaların hiçbiri anahtar kelime içermiyor, yarısı telif hakkı bildiriminden yoksun ve tasarımcı adları sadece bir yerdeki bir elektronik tabloya kaydedilmiş. Çözüm daha büyük bir elektronik tablo değil. XMP yönetimi, Photoshop PSD ve Illustrator AI dosyalarına gömülü meta veri paketini okuyan ve yazan .NET üzerinden Python için bir GroupDocs.Metadata yeteneğidir; bu sayede sahiplik ve arama verileri dosyaların içinde saklanabilir.

XMP, ikili bir kapsayıcı içinde bulunan bir XML paketidir ve şemalar halinde düzenlenir: Her sistemin anlayabileceği alanlar için Dublin Core, editöryel bağlam için Photoshop şeması, araç kimliği için XmpBasic. Bu pakete ulaşmak için bir PSD’yi elle ayrıştırmak gerçekten zordur. Metadata sınıfı ile bu sadece üç öznitelik sorgulamasıdır ve aynı kod AI dosyaları için de geçerlidir.

Bu öğretici, dört adımda tam bir turu gösterir: tüm paketin anlık görüntüsü, önemli şemaların okunması, telif hakkı ve oluşturucu yazılması ve arama için anahtar kelimelerin etiketlenmesi. Her kod parçacığı, yazılan değerlerin kalıcı olduğunu doğrulayan çalıştırılabilir bir depodan alınmıştır.

Önkoşullar

Başlamadan önce şunların yüklü olduğundan emin olun:

  • pip ile Python 3
  • .NET üzerinden Python için GroupDocs.Metadata (depo sürüm 26.5’i sabitler)
  • Deney yapmak için bir PSD veya AI dosyası

Kurulum

pip install groupdocs-metadata-net==26.5

Adım 1 - Tüm XMP Paketi Anlık Görüntüsü

Dosyanın taşıdığı her şeyi görmekle başlayın. Anlık görüntü, kök paketi, her kayıtlı şemayı ve sonunda standart dışı herhangi bir özelliği toplamak için özellik ağacını dolaşır; hepsini tek bir düz sözlükte toplar.

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:                                  # kök paket özellikleri
            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:                       # özel paketleri yakala
            put(result, p)

Temel noktalar:

  • interpreted_value önce: tarih ve enum değerleri ham yerine insan tarafından okunabilir biçimde gelir.
  • Yedi şema artı bir tarama: son find_properties geçişi, adlandırılmış şemaların kaçırdığı satıcı paketlerini yakalar.
  • Tek dosya açma: tüm anlık görüntü tek bir Metadata bağlamı maliyetindedir; bu toplu alımda önemlidir.

İpucu: Bu sözlüğü alım sırasında indeksleyin; böylece sonraki çoğu meta veri sorusu dosya okuması yerine sözlük sorgulaması olur.

Hangi XMP şeması entegrasyonumun önce okuması gerekir?

İlk olarak Dublin Core ile başlayın. Dokuz dc: alanı, başlık, oluşturucu, haklar ve konu değerlerini taşır; bu değerler çoğu DAM sistemi, arama indeksleri ve lisans kontrolleri tarafından kabul edilir ve hem PSD hem de AI dosyaları bunları aynı şekilde sunar. Editöryel bağlam için Photoshop şemasını ikinci sırada okuyun (City, Credit, DateCreated gibi). Tam paket taramasını ise her şeyi yakalaması gereken alım işlerine bırakın.

Adım 2 - Gerçek Sorulara Cevap Veren Şemaları Oku

İstek zamanındaki kod için okuma kapsamını tek bir şemaya daraltın. Dublin Core, sahiplik ve arama sorularını yanıtlar:

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>"))

Photoshop şeması aynı şekilde tiplenmiş özellikler üzerinden çalışır: ps.color_mode, ps.icc_profile, ps.city, ps.country, ps.date_created, ps.caption_writer, ps.credit ve ps.source; bunların her biri None kontrolüyle okunur. Bu alanlar Bridge, Lightroom ve DAM arama filtrelerinin Adobe dosyalarında kullandığı temel alanlardır.

XMP’si olmayan dosyalarda ne olur bir göz atın: koruyucular boş bir sözlük döndürür, istisna fırlatmaz. Yeni dışa aktarılmış varlıklar bu durumu rutin hâle getirir; entegrasyonunuzda bu davranışı koruyun.

Aynı üç sorgulama Illustrator dosyalarında da çalışır. campaign-hero.psd yerine brand-mark.ai koyun, başka bir şey değişmez; bu da karışık Adobe arşivleri için tek bir kod yolunun gerçekçi olmasını sağlar. Pratikte yeni bir AI dışa aktarımı, Photoshop kaydından daha az doldurulmuş şema ile gelir, bu yüzden boş‑sözlük yolu orada daha sık çalışır.

Adım 3 - Telif Hakkı ve Oluşturanı Yaz

Şimdi yazma yoluna geçelim. Sahiplik damgası üç alana dokunur, böylece her okuyucu aynı kimliği görür: yasal bildirim için dc:rights, sıralı bir liste olarak dc:creator ve Dublin Core yerine XmpBasic şemasını okuyan araçlar için xmp:CreatorTool. Bir keresinde tasarımcıların etiketli olduğunu iddia ettikleri varlıklarda “Bilinmeyen yazar” gösteren bir lisans banner’ı yüzünden bir öğleden sonrayı kaybetmiştim; değerler dc:creator içinde duruyordu ama araç sadece xmp:CreatorTool’ı okuyordu. İkisini de yazmak bu hatayı ortadan kaldırdı.

with Metadata("campaign-hero.psd") as metadata:
    root = metadata.get_root_package()
    xmp = getattr(root, "xmp_package", None)
    if xmp is None:                          # dosyada hiç XMP yok
        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")

Temel noktalar:

  • Koruyucular eksik katmanları oluşturur: XmpPacketWrapper ve XmpDublinCorePackage ihtiyaç duyulduğunda yaratılır, böylece XMP’siz dosyalarda da yazma çalışır.
  • ORDERED dizi oluşturucular için: yazar sırası anlam taşır, bu yüzden oluşturucu listesi sıralı bir XmpArray kullanır.
  • Yeni bir yola kaydet: kaynak dosya dokunulmaz kalır; bu dışa aktarma adımları için doğru varsayılandır.

Adım 4 - Arama İçin Anahtar Kelimeleri Etiketle

dc:subject DAM arama indekslerinin anahtar kelime çantasıdır. Yazma işlemi, tek bir çağrıyla tüm çantayı değiştirir:

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")

Anahtar kelimeler UNORDERED bir dizi olarak kullanılır çünkü indeksleyici için sıra önemsizdir. set mevcut çantayı değiştirdiği için, ekleme etiketlemesi gerektiğinde önce mevcut anahtar kelimeleri okuyup Python’da birleştirmeniz gerekir.

Herhangi bir yazmayı doğrulamak için, çıktı dosyası üzerinde Adım 2 okuyucusunu yeniden çalıştırın. Depo tam olarak bunu otomatikleştirir: çıktıyı yeniden okur ve telif hakkı dizesi ile ilk anahtar kelimenin kaydedilen baytlarda hâlâ mevcut olduğunu doğrular.

Gerçek Dünya Uygulamaları

DAM Alımı

Adım 1 anlık görüntüsünü her gelen dosyada çalıştırın ve sözlüğü varlık kaydının yanına saklayın. Arama, çiftleme kontrolü ve hak kontrolleri daha sonra veritabanınızda, ikili dosyaları yeniden açmadan yürütülür. Depodaki küçük örnek PSD’nin anlık görüntüsü zaten tek geçişte sağlıklı bir özellik yığını döndürür; aynı çağrı, giriş binlerce dosyadan oluşan bir klasöre dönüştüğünde de şeklini korur.

Lisans Uygulaması

Bir varlık müşterinin portalına gönderilmeden önce boş olmayan bir dc:rights zorunlu kılın. Başarısız dosyalar otomatik olarak Adım 3 damga işlemine tabi tutulur; böylece hiçbir şey bildirim olmadan dışarı çıkmaz.

Toplu Yeniden Etiketleme

Taksonomi değiştiğinde, her dosyanın dc:subject değerini okuyun, eski terimleri Python’da yeni olanlarla eşleştirin ve birleştirilmiş çantayı Adım 4 ile geri yazın. Hem PSD hem de AI arşivleri aynı döngüyü kullanır. Photoshop lisansı gerekmez.

En İyi Uygulamalar ve İpuçları

  • Boşluğu normal kabul edin: XMP’siz dosyalar rutin bir durumdur, hata değildir; erken dönüş deseni boru hatlarını akıcı tutar.
  • Anahtar kelimeleri yazmadan önce birleştirin: set dc:subject‘i değiştirir, bu yüzden ekleme etiketlemesi okuma‑genişletme‑yazma anlamına gelir.
  • Kimliği her iki şemaya da yazın: dc:creator ile xmp:CreatorTool eşleştirilmesi, Dublin Core okuyucuları ile XmpBasic okuyucularının aynı bilgiyi görmesini sağlar.
  • Yazmayı bir okuma ile doğrulayın: Kaydetmeden hemen sonra yeniden okuma ucuzdur ve kapsayıcı sürprizlerini anında yakalar.
  • Üretim için lisans alın: Değerlendirme modu burada gösterilen her şeyi çalıştırır; gerçek müşteri varlıklarını damgalamadan önce bir lisans kullanın.

Sonuç

Adobe dosyalarında XMP’yi okumak ve yazmak üç adıma indirgenir: paketi get_root_package() ile çözümleyin, ihtiyacınız olan şemayı koruyun ve tiplenmiş değerleri okuyun ya da yazın. Bu adımlarla bu öğreticide paket anlık görüntüsü, şema okumaları, telif hakkı damgası ve anahtar kelime etiketlemesi gibi tam bir tur oluşturmuş olduk; aynı kod PSD ve AI dosyalarına hizmet eder.

Projenizde bunu uygulamaya hazır mısınız? İşte bazı sonraki adımlar:

Ek Kaynaklar

XMP iş akışınızla ilgili sorularınız mı var? support forum üzerinden sorun.