Contoh kerja penuh tersedia di GitHub:
manage-xmp-in-psd-and-ai-files-python

Pendahuluan

Tim pemasaran mengunggah 400 file PSD ke platform aset Anda. Pengunggahan berhasil. Pencarian tidak, karena tidak ada file yang membawa kata kunci, setengahnya tidak memiliki pemberitahuan hak cipta, dan nama desainer hanya ada di spreadsheet di suatu tempat. Solusinya bukan spreadsheet yang lebih besar. Manajemen XMP adalah kemampuan GroupDocs.Metadata untuk Python via .NET yang membaca dan menulis paket metadata yang tertanam dalam file Photoshop PSD dan Illustrator AI, yang berarti data kepemilikan dan pencarian dapat berada di dalam file itu sendiri.

XMP adalah paket XML di dalam wadah biner, diatur ke dalam skema: Dublin Core untuk bidang yang dipahami semua sistem, skema Photoshop untuk konteks editorial, XmpBasic untuk identitas alat. Mengurai PSD secara manual untuk mencapai paket itu memang sulit. Dengan kelas Metadata cukup tiga pencarian atribut, dan kode yang sama melayani file AI.

Tutorial ini menuntun perjalanan lengkap dalam empat langkah: mengambil snapshot seluruh paket, membaca skema yang penting, menulis hak cipta dan pembuat, serta menandai kata kunci untuk pencarian. Setiap potongan kode berasal dari repositori yang dapat dijalankan dan memastikan nilai yang ditulis tetap ada.

Prasyarat

Sebelum memulai, pastikan Anda memiliki:

  • Python 3 dengan pip
  • GroupDocs.Metadata untuk Python via .NET (repositori mengunci versi 26.5)
  • File PSD atau AI untuk percobaan

Instalasi

pip install groupdocs-metadata-net==26.5

Langkah 1 - Snapshot Seluruh Paket XMP

Mulailah dengan melihat semua yang dibawa file. Snapshot berjalan melalui paket root, setiap skema terdaftar, dan akhirnya menyapu pohon properti untuk apa pun yang tidak standar, mengumpulkannya semua ke dalam satu kamus datar.

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)

Poin penting:

  • interpreted_value pertama: tanggal dan enumerasi muncul dalam format yang dapat dibaca manusia alih-alih mentah.
  • Tujuh skema plus penyapuan: langkah find_properties di akhir menangkap paket vendor yang tidak terjangkau skema bernama.
  • Satu file dibuka: seluruh snapshot memerlukan satu konteks Metadata, yang penting saat mengkonsumsi dalam jumlah besar.

Tip: indeks kamus ini pada saat ingest dan sebagian besar pertanyaan metadata selanjutnya menjadi pencarian kamus alih-alih membaca file.

Skema XMP mana yang harus dibaca integrasi saya pertama kali?

Mulailah dengan Dublin Core. Sembilan bidang dc:‑nya membawa judul, pembuat, hak, dan subjek yang paling banyak disepakati oleh sistem DAM, indeks pencarian, dan pemeriksaan lisensi, dan baik file PSD maupun AI mengekspornya secara identik. Baca skema Photoshop kedua untuk konteks editorial seperti City, Credit, dan DateCreated. Simpan penyapuan paket penuh untuk pekerjaan ingest yang harus menangkap semuanya.

Langkah 2 - Baca Skema yang Menjawab Pertanyaan Nyata

Untuk kode pada saat permintaan, batasi pembacaan ke satu skema. Dublin Core menjawab pertanyaan kepemilikan dan pencarian:

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

Skema Photoshop bekerja dengan cara yang sama melalui properti bertipe: ps.color_mode, ps.icc_profile, ps.city, ps.country, ps.date_created, ps.caption_writer, ps.credit, dan ps.source, masing‑masing dibaca dengan penjagaan None. Itulah bidang yang menjadi kunci filter pencarian Bridge, Lightroom, dan DAM untuk file Adobe.

Perhatikan apa yang terjadi pada file tanpa XMP: penjagaan menghasilkan kamus kosong, bukan pengecualian. Aset yang baru diekspor membuat kasus ini rutin, jadi pertahankan perilaku ini dalam integrasi Anda.

Tiga pencarian yang sama juga berlaku pada file Illustrator. Ganti campaign-hero.psd dengan brand-mark.ai dan tidak ada yang berubah, itulah yang membuat satu jalur kode realistis untuk arsip Adobe campuran. Pada praktiknya, ekspor AI yang baru cenderung memiliki lebih sedikit skema terisi dibandingkan penyimpanan Photoshop, sehingga jalur kamus kosong lebih sering dieksekusi di sana.

Langkah 3 - Tulis Hak Cipta dan Pembuat

Sekarang jalur penulisan. Penandaan kepemilikan menyentuh tiga bidang sehingga setiap pembaca melihat identitas yang sama: dc:rights untuk pemberitahuan legal, dc:creator sebagai daftar berurutan, dan xmp:CreatorTool untuk alat yang membaca skema XmpBasic alih‑alih Dublin Core. Saya pernah menghabiskan sore karena banner lisensi menampilkan “Unknown author” pada aset yang desainer bersumpah sudah ditandai; nilai tersebut ada di dc:creator sementara alat hanya membaca xmp:CreatorTool. Menulis keduanya mengakhiri kelas bug tersebut.

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

Poin penting:

  • Penjagaan membuat lapisan yang hilang: XmpPacketWrapper dan XmpDublinCorePackage dibuat bila diperlukan, sehingga penulisan bekerja pada file tanpa XMP.
  • Array ORDERED untuk pembuat: urutan penulis memiliki arti, jadi daftar pembuat menggunakan XmpArray berurutan.
  • Simpan ke jalur baru: file sumber tetap tidak tersentuh, yang merupakan default yang tepat untuk langkah ekspor.

Langkah 4 - Tandai Kata Kunci untuk Pencarian

dc:subject adalah kantong kata kunci untuk indeks pencarian DAM. Penulisan menggantikan seluruh kantong dalam satu panggilan:

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

Kata kunci menggunakan array UNORDERED karena urutan tidak penting bagi pengindeks. Dan karena set menggantikan kantong yang ada, bacalah kata kunci saat ini terlebih dahulu dan gabungkan di Python ketika Anda memerlukan penandaan tambahan alih‑alih penggantian.

Untuk memverifikasi setiap penulisan, jalankan kembali pembaca Langkah 2 terhadap file output. Repositori mengotomatiskan hal ini: ia membaca ulang outputnya dan memastikan string hak cipta serta kata kunci pertama tetap ada dalam byte yang disimpan.

Aplikasi Dunia Nyata

Ingesti DAM

Jalankan snapshot Langkah 1 pada setiap file yang masuk dan simpan kamus tersebut bersama catatan aset. Pencarian, deduplikasi, dan pemeriksaan hak kemudian dijalankan terhadap basis data Anda alih‑alih membuka kembali file biner. Snapshot pada contoh PSD kecil repositori sudah mengembalikan tumpukan properti yang sehat dalam satu kali jalan, dan panggilan yang sama tetap berbentuk ketika input menjadi folder berisi ribuan file.

Penegakan Lisensi

Sebelum aset dikirim ke portal klien, wajibkan dc:rights tidak kosong. File yang gagal otomatis diproses dengan langkah 3 untuk penandaan, sehingga tidak ada yang keluar tanpa pemberitahuan.

Penandaan Ulang Batch

Ketika taksonomi berubah, baca dc:subject tiap file, petakan istilah lama ke yang baru di Python, dan tulis kembali kantong yang telah digabung dengan Langkah 4. Baik arsip PSD maupun AI menggunakan loop yang sama. Tidak diperlukan lisensi Photoshop.

Praktik Terbaik dan Tips

  • Anggap kosong sebagai hal normal: file tanpa XMP adalah hal rutin, bukan kesalahan; pola early‑return menjaga alur pipeline tetap mengalir.
  • Gabungkan sebelum menulis kata kunci: set menggantikan dc:subject, jadi penandaan tambahan berarti baca, perpanjang, tulis.
  • Tulis identitas ke kedua skema: memadukan dc:creator dengan xmp:CreatorTool menjaga pembaca Dublin Core dan XmpBasic tetap sejalan.
  • Verifikasi penulisan dengan membaca kembali: membaca ulang setelah penyimpanan murah dan langsung menangkap kejutan kontainer.
  • Lisensi untuk produksi: mode evaluasi menjalankan semua contoh di sini; gunakan lisensi sebelum menandai aset klien yang sesungguhnya.

Kesimpulan

Membaca dan menulis XMP pada file Adobe menyederhanakan menjadi tiga langkah: temukan paket melalui get_root_package(), lindungi skema yang Anda butuhkan, dan baca atau tulis nilai bertipe. Dengan tiga langkah itu Anda telah membangun perjalanan lengkap dalam tutorial ini, dari snapshot paket hingga pembacaan skema, penandaan hak cipta, dan penandaan kata kunci, dengan kode yang sama melayani file PSD dan AI.

Siap mengimplementasikan ini dalam proyek Anda? Berikut beberapa langkah selanjutnya:

Sumber Daya Tambahan

Pertanyaan tentang alur kerja XMP Anda? Tanyakan di forum dukungan.