Contoh kerja penuh tersedia di GitHub:
read-and-write-xmp-in-psd-ai-files-java
Cara Lama Sangat Menyakitkan
Bayangkan pembersihan arsip yang tidak ada yang mau sukarela. Sebuah folder berisi master PSD dan sumber AI membutuhkan pemberitahuan hak cipta serta kata kunci sebelum masuk ke DAM. Rutinnya: buka file di Photoshop, buka File Info, ketik hak cipta, ketik kata kunci, simpan, tutup, file berikutnya. Setiap penyimpanan kembali merender file berlapis hanya untuk mengubah beberapa string metadata XMP. Arsip yang mengajarkan saya pelajaran ini adalah folder berkas Illustrator yang tidak ditandai sehingga tidak ada yang dapat mencarinya; kami memperbaikinya dengan sebuah loop, bukan dengan lebih banyak kesabaran.
Kalikan rutinitas itu dengan skala arsip dan itu tidak lagi menjadi tugas melainkan menjadi proyek. Lebih buruk lagi, hal itu tidak dapat diaudit: tidak ada yang dapat membuktikan setelahnya file mana yang sudah diproses, dan file yang terlewat tampak identik sampai pertanyaan lisensi menemukannya. Jalur panel juga secara diam-diam menggabungkan entri data dengan alat desain. Siapa pun yang memperbaiki metadata membutuhkan lisensi Adobe, workstation yang dapat membuka master berlapis dengan nyaman, dan kesabaran menunggu penyimpanan yang merender ulang karya hanya untuk mengubah string.
Biaya nyata melakukan secara manual: metadata yang diperbaiki secara manual adalah metadata yang tidak dapat diverifikasi nanti; proses ini tidak meninggalkan jejak kecuali desainer yang lelah.
Ada Cara yang Lebih Baik
GroupDocs.Metadata untuk Java membaca dan menulis paket XMP secara langsung. Cast getRootPackage() ke IXmp dan paket, skema, serta array‑nya menjadi objek Java biasa, identik untuk kontainer PSD dan AI, tanpa melibatkan perangkat lunak Adobe. Dokumentasi mencantumkan lebih dari 170 format di balik API yang sama.
Sebelum kita mulai, Anda memerlukan:
- JDK 8 atau lebih baru dengan Maven
- GroupDocs.Metadata untuk Java 24.7 (get a temporary license)
- Sebuah file PSD atau AI untuk dipraktikkan
Tambahkan dependensi dan repositori GroupDocs ke pom.xml Anda:
mvn dependency:get -Dartifact=com.groupdocs:groupdocs-metadata:24.7
Repositori pendamping menyediakan pom.xml siap pakai plus contoh sampel kedua format, dan menegaskan setiap langkah di bawah ini.
Cara Baru: Empat Operasi dalam Java
Langkah 1 — Lihat Apa yang Dibawa File
Snapshot membuang paket dan setiap skema ke dalam satu LinkedHashMap, mempertahankan urutan yang dideklarasikan file.
// 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;
Helper kecil put dan collect lebih menyukai getInterpretedValue() sehingga tanggal muncul dapat dibaca, dan penyaringan berbasis Specification menangkap paket vendor. Versi repositori berjalan melalui tujuh skema; bentuknya tetap sama.
Langkah 2 — Baca Kolom yang Menjawab Pertanyaan
Lisensi menanyakan tentang dc:rights. Pencarian peduli pada dc:subject. Kedua‑nya berada di Dublin Core, dan pembacaan terfokus hanya memerlukan sembilan bidang, bukan penelusuran pohon.
// 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);
}
Skema Photoshop bekerja dengan cara yang sama melalui getter bertipe (getCity(), getCredit(), getColorMode() dan lima lainnya), mencakup bidang metadata PSD yang dibaca filter Bridge dan Lightroom. Di repositori pembaca tersebut membungkus setiap getter dengan helper yang aman‑null, sehingga file yang hanya terisi sebagian mengembalikan string kosong alih‑alih kejutan. Detail itu lebih penting daripada yang terlihat: tujuan mengotomatisasi arsip adalah agar file aneh tetap mengalir melalui loop alih‑alih menghentikannya.
Kedua pembacaan terfokus memiliki profil biaya yang layak disebutkan. Satu pembukaan file, satu skema, tanpa penelusuran pohon. Letakkan mereka di handler permintaan dan gerbang; simpan snapshot lengkap untuk pekerjaan ingest yang menyimpan semuanya.
Langkah 3 — Stempel dan Tag Tanpa Membuka Adobe
Penulis membuat apa pun yang hilang, sehingga aman untuk ekspor baru yang tidak membawa paket sama sekali.
// 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);
Kata kunci mengikuti pola yang sama dengan satu pemanggilan, menulis seluruh bag sebagai array Unordered:
// 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 menutup loop: ia membaca kembali output dan menegaskan bahwa string hak cipta serta kata kunci pertama memang bertahan setelah penyimpanan.
Pernyataan penegasan itu pantas mendapat satu kalimat advokasi. Penulisan metadata gagal secara diam ketika terjadi kegagalan; file tersimpan, byte berubah, dan nilai yang Anda maksud tidak ada karena objek skema sudah usang atau jalur masih mengarah ke yang asli. Membaca kembali setelah setiap penulisan menambah satu pembukaan ekstra per file dan mengubah “skrip selesai” menjadi “nilai ada”, yang merupakan pernyataan yang sebenarnya diinginkan pemilik arsip. Simpan ini di produksi, bukan hanya di demo.
Bagaimana kata kunci sebenarnya membuat aset dapat ditemukan?
Alat pencarian tidak membaca piksel; mereka membaca dc:subject. Bridge, pengindeks DAM, dan platform stok memperlakukan bag itu sebagai kosakata aset, sehingga file tanpa kata kunci tidak pernah cocok dengan kueri. Menulis bag sebagai Unordered XmpArray, seperti yang dilakukan AddKeywords, adalah apa yang memindahkan aset dari tidak terlihat menjadi dapat ditemukan, dan penulisan itu memerlukan satu penyimpanan.
Sisi demi Sisi: Sebelum vs. Sesudah
| Sebelum (pengeditan panel) | Sesudah (pipeline Java) | |
|---|---|---|
| Alat | Photoshop atau Bridge per file | Satu proyek Maven, tanpa lisensi Adobe |
| Cakupan | Bidang yang ditampilkan panel | Setiap skema plus paket vendor |
| Pengulangan | Bergantung pada siapa yang mengklik | Loop yang sama, hasil yang sama, dapat diaudit |
| File tanpa XMP | Perilaku panel bervariasi | Guard membuat paket dan skema |
| Verifikasi | Kepercayaan | Pembacaan kembali yang ditegaskan per file |
Baris verifikasi menentukan segalanya untuk arsip: skrip yang membuktikan tulisannya sendiri adalah perbedaan antara “kami menandai file” dan “kami dapat menunjukkan kepada Anda”.
Contoh Dunia Nyata: Penyerahan dari Agensi
Sebuah studio menerima kiriman campuran PSD dan AI dari tiga agensi, masing‑masing dengan disiplin metadata sendiri. Pekerjaan intake mereka kini menjalankan snapshot saat kedatangan, menandai file yang dc:rights‑nya kosong, menambahkan baris hak cipta yang telah dikontrak, dan menulis set kata kunci kampanye. Loop yang sama melayani kedua format karena tidak ada kode yang menyebutkan kontainer, dan metadata Adobe Illustrator yang tiba kosong tetap ditandai dan dapat dicari.
Dampak lanjutan adalah bagian yang tidak diprediksi studio: kartu skor agensi. Karena pekerjaan intake mencatat kiriman mana yang tiba dengan bidang hak kosong, bagian pengadaan kini dapat melihat pemasok mana yang mengirim metadata bersih dan mana yang mengandalkan klien untuk memperbaikinya. Percakapan dengan pelanggar terburuk hanya memerlukan satu bagan.
Apa Lagi yang Bisa Anda Lakukan dengan GroupDocs.Metadata?
- EXIF dan IPTC dalam file yang sama: PSD membawa tiga standar metadata; pustaka yang sama membaca dua lainnya melalui paket masing‑masing, sehingga profil aset lengkap hanya dua pembacaan lagi.
- 170+ format lainnya: titik masuk
Metadatayang identik melayani Office, PDF, audio, dan video, yang menjadi cara satu pekerjaan intake mencakup seluruh arsip campuran. - Pencarian properti:
findPropertiesdenganSpecificationmenyapu file apa pun untuk predikat apa pun yang Anda definisikan, mulai dari pemeriksaan hak hingga pencarian bidang khusus.
Kesimpulan
Apa yang dulu menjadi rutinitas panel per‑file kini menjadi empat operasi Java: snapshot, pembacaan terfokus, stempel kepemilikan, penulisan kata kunci. Kode yang sama melayani file PSD dan AI, guard membuat ekspor kosong aman, dan proyek contoh yang ditegaskan membuktikan seluruh rangkaian sebelum Anda mengarahkannya ke arsip nyata.
Siap untuk menghentikan penggunaan panel File Info?
- Bangun proyek contoh dengan
mvn compile exec:java - Jelajahi panduan penggunaan gaya perbandingan
- Baca referensi Working with XMP metadata