전체 작업 예제가 GitHub에 있습니다: read-and-write-xmp-in-psd-ai-files-java

이전 방식은 고통스러웠다

아무도 자원하지 않는 아카이브 정리를 상상해 보세요. PSD 마스터와 AI 소스 파일이 들어 있는 폴더에 권리 고지와 키워드가 필요합니다. 일반적인 절차: Photoshop에서 파일을 열고, 파일 정보를 열고, 저작권을 입력하고, 키워드를 입력하고, 저장하고, 닫고, 다음 파일. 각각의 저장은 레이어 파일을 다시 렌더링하면서 몇 개의 xmp 메타데이터 문자열만 바꾸게 됩니다. 이 교훈을 주었던 아카이브는 아무도 검색할 수 없는 태그가 없는 Illustrator 파일들의 폴더였으며, 우리는 인내심보다 루프를 사용해 해결했습니다.

이 루틴을 아카이브 전체에 적용하면 작업이 아니라 프로젝트가 됩니다. 더 나쁜 점은 감사가 불가능하다는 것: 누가 어떤 파일을 처리했는지 증명할 수 없으며, 건너뛴 파일은 라이선스 문제가 발생할 때까지 동일하게 보입니다. 패널 방식은 데이터 입력을 디자인 툴에 은밀히 결합시킵니다. 메타데이터를 수정하는 사람은 Adobe 라이선스가 필요하고, 레이어 마스터를 편하게 열 수 있는 워크스테이션이 필요하며, 문자열만 바꾸기 위해 아트워크를 다시 렌더링하는 저장을 기다릴 인내심이 필요합니다.

수동으로 수행할 때의 실제 비용: 손으로 수정한 메타데이터는 나중에 아무도 검증할 수 없으며, 프로세스는 피곤한 디자이너 외에 흔적을 남기지 않습니다.

더 나은 방법이 있다

GroupDocs.Metadata for Java는 XMP 패킷을 직접 읽고 씁니다. getRootPackage()를 IXmp로 캐스팅하면 패킷, 스키마, 배열이 일반 Java 객체가 되며, PSD와 AI 컨테이너 모두에 동일하게 적용되고 Adobe 소프트웨어가 전혀 필요하지 않습니다. 문서에는 동일한 API 뒤에 170개 이상의 포맷이 나열되어 있습니다.

시작하기 전에 다음이 필요합니다:

pom.xml에 의존성을 추가하고 GroupDocs 저장소를 추가합니다:

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

동반 저장소에는 준비된 pom.xml과 두 포맷의 샘플이 포함되어 있으며, 아래 단계마다 검증을 수행합니다.

새로운 방식: Java에서 네 가지 작업

Step 1 — 파일이 가지고 있는 내용 보기

스냅샷은 패킷과 모든 스키마를 하나의 LinkedHashMap에 덤프하여 파일이 선언한 순서를 보존합니다.

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

작은 put 및 collect 헬퍼는 getInterpretedValue()를 선호해 날짜를 읽기 쉬운 형태로 반환하고, Specification 기반 스윕은 벤더 패킷을 잡아냅니다. 저장소 버전은 일곱 개 스키마를 순회하지만 형태는 동일합니다.

Step 2 — 질문에 답하는 필드 읽기

라이선스는 dc:rights를 묻고, 검색은 dc:subject를 찾습니다. 두 필드 모두 Dublin Core에 있으며, 범위 지정 읽기는 트리 순회 없이 아홉 개 필드만 읽습니다.

// 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 스키마도 동일하게 타입이 지정된 getter(getCity(), getCredit(), getColorMode() 등 다섯 개)로 작동하며, Bridge와 Lightroom 필터가 읽는 PSD 메타데이터 필드를 포괄합니다. 저장소에서는 각 getter를 null‑safe 헬퍼로 감싸서, 데이터가 부족한 파일은 빈 문자열을 반환하도록 합니다. 이 세부 사항은 겉보기에보다 중요합니다: 아카이브 자동화의 핵심은 이상 파일이 루프를 멈추지 않고 흐르게 하는 것입니다.

두 범위 지정 읽기는 비용 프로파일이 동일합니다. 파일 하나를 열고, 스키마 하나를 읽고, 트리 순회가 없습니다. 이를 요청 핸들러와 게이트에 넣고, 전체 스냅샷을 인제스트 작업에 저장하면 됩니다.

Step 3 — Adobe를 열지 않고 스탬프와 태그 지정

작성자는 누락된 항목을 guard‑create 하므로, 패킷이 전혀 없는 새 내보내기에도 안전합니다.

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

키워드도 동일한 패턴으로 한 번에 전체 bag을 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는 루프를 마무리합니다: 출력물을 다시 읽고 저작권 문자열과 첫 번째 키워드가 실제로 저장되었는지 검증합니다.

이 검증은 한 문장으로 강조할 가치가 있습니다. 메타데이터 쓰기는 실패해도 조용히 넘어가며, 파일은 저장되고 바이트는 변하지만 쓰려던 값이 사라질 수 있습니다(스키마 객체가 오래되었거나 경로가 원본을 가리키는 경우). 각 쓰기 후에 한 번씩 읽어보면 파일당 한 번의 추가 오픈이 발생하지만, “스크립트가 끝났다”를 “값이 존재한다”로 바꿔줍니다. 이는 아카이브 소유자가 실제로 원하는 진술입니다. 데모뿐 아니라 프로덕션에서도 유지하세요.

Step 4 — 키워드가 실제로 자산을 찾을 수 있게 만드는 방법

검색 도구는 픽셀을 읽지 않고 dc:subject를 읽습니다. Bridge, DAM 인덱서, 스톡 플랫폼은 그 bag을 자산의 어휘로 취급하므로, 키워드가 없는 파일은 절대 쿼리와 일치하지 않습니다. AddKeywords가 하는 것처럼 Unordered XmpArray로 bag을 쓰는 것이 자산을 보이지 않음에서 찾을 수 있게 만드는 방법이며, 쓰기 비용은 한 번의 저장뿐입니다.

나란히 비교: 이전 vs. 이후

이전 (패널 편집) 이후 (Java 파이프라인)
툴링 파일당 Photoshop 또는 Bridge 하나의 Maven 프로젝트, Adobe 라이선스 불필요
커버리지 패널이 노출하는 필드 모든 스키마와 벤더 패킷
반복 가능성 누가 클릭했는지에 따라 동일한 루프, 동일한 결과, 감사 가능
XMP 없는 파일 패널 동작이 다양함 Guard가 패킷과 스키마를 생성
검증 신뢰 파일당 읽어‑돌려 확인

검증 행이 아카이브에 결정적입니다: 자체 쓰기를 증명하는 스크립트가 “파일에 태그를 달았다”와 “증명할 수 있다” 사이의 차이를 만듭니다.

실제 사례: 에이전시 인수인계

스튜디오는 세 개 에이전시로부터 혼합된 PSD와 AI 전달물을 받습니다. 각 에이전시는 자체 메타데이터 규칙을 가지고 있습니다. 이제 인수 작업은 도착 시 스냅샷을 실행하고, dc:rights가 비어 있는 파일을 표시하고, 계약된 권리 문구를 스탬프하고, 캠페인 키워드 세트를 씁니다. 동일한 루프가 두 포맷을 모두 처리하는데, 코드에 컨테이너 이름이 없으며, Illustrator 메타데이터가 비어 있어도 인수 단계에서 태그와 검색이 가능하게 됩니다.

예상치 못한 부수 효과는 스튜디오가 예측하지 못한 에이전시 점수표입니다. 인수 작업이 빈 권리 필드가 있는 전달물을 로그에 남기면서, 구매팀은 어느 공급업체가 메타데이터를 깔끔하게 제공하고 어느 공급업체가 클라이언트에게 수정을 의존하는지 파악합니다. 최악의 위반자와의 대화는 한 차트만 필요했습니다.

GroupDocs.Metadata로 할 수 있는 다른 일은?

  • 동일 파일 내 EXIF와 IPTC: PSD는 세 가지 메타데이터 표준을 포함하고, 동일 라이브러리가 다른 두 패키지를 통해 읽을 수 있어 전체 자산 프로필을 두 번의 추가 읽기로 완성합니다.
  • 170개 이상의 다른 포맷: 동일한 Metadata 진입점이 Office, PDF, 오디오, 비디오 파일을 지원하므로 하나의 인수 작업으로 혼합 아카이브 전체를 커버할 수 있습니다.
  • 속성 검색: findProperties와 Specification을 사용하면 권리 검사부터 사용자 정의 필드 탐색까지 파일을 원하는 조건으로 스윕할 수 있습니다.

결론

예전에는 파일당 패널 루틴이었지만 이제는 네 가지 Java 작업(스냅샷, 범위 지정 읽기, 소유권 스탬프, 키워드 쓰기)으로 바뀌었습니다. 동일한 코드는 PSD와 AI 파일 모두에 적용되고, Guard가 빈 내보내기를 안전하게 만들며, 검증된 샘플 프로젝트가 실제 아카이브에 적용하기 전에 전체 흐름을 증명합니다.

File Info 패널을 이제 은퇴시킬 준비가 되었나요?

추가 리소스