GitHub’da tam çalışan örnek mevcuttur:
read-and-write-xmp-in-psd-ai-files-java

Eski Yöntem Acı Vericiydi

Arşiv temizliğini hayal edin; kimse gönüllü olmak istemez. PSD ana dosyaları ve AI kaynakları bir klasöründe, DAM’e girmeden önce hak bildirimleri ve anahtar kelimeler eklenmesi gerekir. Rutin: Photoshop’ta bir dosya aç, Dosya Bilgileri’ni aç, telif hakkını yaz, anahtar kelimeleri yaz, kaydet, kapat, bir sonraki dosya. Her kaydetme, sadece birkaç xmp metadata dizesini değiştirmek için katmanlı dosyayı yeniden render eder. Bu dersi bana öğreten arşiv, kimsenin arama yapamadığı etiketlenmemiş Illustrator dosyaları klasörüydu; sabırla değil, bir döngüyle çözdük.

Bu rutini bir arşivle çarptığınızda görev olmaktan çıkar, bir proje haline gelir. Daha da kötüsü, denetlenemez: kimse daha sonra hangi dosyaların işlendiğini kanıtlayamaz ve atlanan dosyalar, bir lisans sorunu ortaya çıkana kadar aynı görünür. Panel yolu ayrıca veri girişini tasarım araçlarıyla sessizce birleştirir. Metadata’yı düzelten kişinin bir Adobe lisansı, katmanlı ana dosyaları rahatça açabilen bir iş istasyonu ve sadece birkaç satır kaydetme için sanat eserinin yeniden render edilmesini bekleyecek sabrı olmalıdır.

Manuel yapmanın gerçek maliyeti: elle düzeltilen metadata, daha sonra kimse tarafından doğrulanamaz; süreç, yorgun tasarımcılar dışında hiçbir iz bırakmaz.

Daha İyi Bir Yol Var

GroupDocs.Metadata for Java, XMP paketini doğrudan okur ve yazar. getRootPackage()‘ı IXmp‘ye dönüştürün; paket, şemalar ve diziler, PSD ve AI konteynerleri için aynı Java nesneleridir, Adobe yazılımı gerekmez. Dokümantasyon aynı API altında 170+ format listeler.

Başlamadan önce şunlara ihtiyacınız olacak:

  • Maven ile JDK 8 veya üzeri
  • GroupDocs.Metadata for Java 24.7 (geçici lisans alın)
  • Üzerinde çalışmak için bir PSD veya AI dosyası

Bağımlılığı ve GroupDocs deposunu pom.xml dosyanıza ekleyin:

mvn dependency:get -Dartifact=com.groupdocs:groupdocs-metadata:24.7

Companion repository hazır bir pom.xml ve her iki format için örnek dosyalar içerir ve aşağıdaki her adımı kanıtlar.

Yeni Yöntem: Java’da Dört İşlem

Adım 1 — Bir Dosyanın Ne Taşıdığını Görün

Anlık görüntü, paketi ve her şemayı tek bir LinkedHashMap içine döker, dosyanın bildirdiği sırayı korur.

// 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;

Küçük put ve collect yardımcıları, tarihlerin okunabilir gelmesi için getInterpretedValue() tercih eder ve Specification‑tabanlı süpürme satıcı paketlerini yakalar. Depo sürümü yedi şemayı dolaşır; yapı aynı kalır.

Adım 2 — Sorulara Cevap Veren Alanları Okuyun

Lisanslama dc:rights sorar. Arama dc:subject ister. İkisi de Dublin Core içinde bulunur ve kapsamlı okuma dokuz alanı getirir, ağaç yürütmesi gerekmez.

// 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);
}

Photoshop şeması da aynı şekilde tip‑güvenli getter’lar (getCity(), getCredit(), getColorMode() ve beş diğeri) üzerinden çalışır; Bridge ve Lightroom filtrelerinin okuduğu psd metadata alanlarını kapsar. Depodaki okuyucu, her getter’ı null‑güvenli bir yardımcıyla sarar, böylece az veri içeren bir dosya boş string döner, sürpriz olmaz. Bu detay, arşivi otomatikleştirmenin bütün noktası olduğu için önemlidir: garip dosyalar döngüyü durdurmaz, akışa devam eder.

Her iki kapsamlı okuma da adlandırmaya değer bir maliyet profili paylaşır. Tek dosya açma, tek şema, ağaç yürütmesi yok. Bunları istek işleyicilerine ve geçitlere koyun; her şeyi saklayan tam anlık görüntüyü yutma işlerine kaydedin.

Adım 3 — Adobe’yi Açmadan Damga ve Etiket Ekleyin

Yazıcılar eksik olan her şeyi koruyucu‑yaratır, bu da hiç paket içermeyen yeni dışa aktarımlar için güvenli olmalarını sağlar.

// 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);

Anahtar kelimeler aynı desenle tek bir çağrıyla yapılır; tüm çantayı Unordered (Sırasız) bir dizi olarak yazar:

// 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 döngüyü kapatır: çıktıları yeniden okur ve telif hakkı dizesi ile ilk anahtar kelimenin gerçekten kaydedildiğini doğrular.

Bu kapanış doğrulaması bir savunma cümlesine layıktır. Metadata yazımları başarısız olduğunda sessizce başarısız olur; dosya kaydedilir, baytlar değişir ve yazmak istediğiniz değer, bir şema nesnesi eskiyse ya da yol orijinale işaret ediyorsa basitçe yoktur. Her yazımdan sonra bir geri okuma, dosya başına bir ekstra açma maliyeti getirir ve “betik bitti” ifadesini “değerler mevcut” hâline çevirir; bu, bir arşiv sahibinin gerçekten istediği ifadedir. Sadece demo için değil, üretimde de tutun.

Anahtar Kelimeler Gerçekten Varlıkları Nasıl Bulunabilir Kılar?

Arama araçları piksel okumaz; dc:subject okur. Bridge, DAM indeksleyicileri ve stok platformları bu çantayı varlığın kelime hazinesi olarak görür, bu yüzden anahtar kelime olmayan bir dosya hiçbir sorguya asla eşleşmez. Çantayı Unordered XmpArray olarak yazmak (AddKeywords’in yaptığı gibi), bir varlığı görünmezden bulunabilir hâle getirir ve yazma maliyeti bir kaydetme olur.

Yan Yana: Önce vs. Sonra

Önce (panel düzenleme) Sonra (Java pipeline)
Araçlar Dosya başına Photoshop veya Bridge Tek Maven projesi, Adobe lisansı yok
Kapsam Panelin gösterdiği alanlar Her şema ve satıcı paketleri
Tekrarlanabilirlik Kim tıkladığına bağlı Aynı döngü, aynı sonuç, denetlenebilir
XMP’siz dosyalar Panel davranışı değişir Koruyucular paket ve şemaları oluşturur
Doğrulama Güven Dosya başına doğrulanmış geri okuma

Doğrulama satırı arşivler için belirleyicidir: kendi yazımlarını kanıtlayan bir betik, “dosyaları etiketledik” ile “size gösterebiliriz” arasındaki farktır.

Gerçek Dünya Örneği: Ajans Teslimatı

Bir stüdyo, üç ajanstan gelen karışık PSD ve AI teslimatlarını alır; her birinin kendi metadata disiplinleri vardır. Yeni giriş işi, varışta anlık görüntüyü çalıştırır, dc:rights alanı boş okuyan dosyaları işaretler, sözleşmeli hak satırını ekler ve kampanya anahtar kelime setini yazar. Aynı döngü her iki formatı da hizmet eder çünkü kodda konteyner adı yoktur ve boş gelen Adobe Illustrator metadata’sı, girişin etiketli ve aranabilir olmasını sağlar.

Stüdyonun öngörmediği sonraki etki, ajans skor kartlarıdır. Giriş işi, boş hak alanlarıyla gelen teslimatları kaydettiği için satın alma bölümü, hangi tedarikçilerin temiz metadata gönderdiğini, hangilerinin düzeltmeyi müşteriye bıraktığını görür. En kötü ihlaldeki ajansla yapılan konuşma tek bir grafikle çözüldü.

GroupDocs.Metadata ile Başka Ne Yapabilirsiniz?

  • EXIF ve IPTC aynı dosyalarda: PSD’ler üç metadata standardı taşır; aynı kütüphane diğer ikisini kendi paketleriyle okur, böylece tam varlık profili iki ek okuma uzakta olur.
  • 170+ diğer format: aynı Metadata giriş noktası Office, PDF, ses ve video dosyalarını da hizmet eder; bu, tek bir giriş işinin bütün karışık arşivi kapsamasının yoludur.
  • Özellik arama: findProperties ile bir Specification kullanarak istediğiniz koşulu tanımlarsınız; hak kontrollerinden özel alan aramalarına kadar her dosyada süpürür.

Sonuç

Eskiden dosya başına panel rutini olan şey, artık dört Java işlemi: anlık görüntü, kapsamlı okuma, sahiplik damgası, anahtar kelime yazma. Aynı kod PSD ve AI dosyalarını hizmet eder, koruyucular boş dışa aktarımları güvenli hâle getirir ve kanıtlanmış örnek proje, gerçek bir arşive yöneltmeden önce tüm seti kanıtlar.

File Info panelini emekliye ayırmaya hazır mısınız?

Ek Kaynaklar