Ví dụ hoạt động đầy đủ có trên GitHub:
manage-xmp-in-psd-and-ai-files-python
Giới thiệu
Một đội marketing đưa 400 tệp PSD lên nền tảng tài sản của bạn. Việc tải lên hoạt động bình thường. Tìm kiếm không hoạt động, vì không có tệp nào chứa từ khóa, một nửa thiếu thông báo bản quyền, và tên nhà thiết kế chỉ tồn tại trong một bảng tính nào đó. Giải pháp không phải là một bảng tính lớn hơn. Quản lý XMP là khả năng của GroupDocs.Metadata cho Python thông qua .NET, cho phép đọc và ghi gói siêu dữ liệu nhúng trong các tệp Photoshop PSD và Illustrator AI, nghĩa là dữ liệu sở hữu và tìm kiếm có thể tồn tại trực tiếp trong các tệp.
XMP là một gói XML bên trong một container nhị phân, được tổ chức thành các scheme: Dublin Core cho các trường mà mọi hệ thống đều hiểu, scheme Photoshop cho ngữ cảnh biên tập, XmpBasic cho nhận dạng công cụ. Phân tích một PSD bằng tay để tới gói này thực sự khó. Với lớp Metadata chỉ cần ba lần tra cứu thuộc tính, và mã giống hệt cũng áp dụng cho các tệp AI.
Bài hướng dẫn này thực hiện vòng tròn đầy đủ trong bốn bước: chụp ảnh toàn bộ gói, đọc các scheme quan trọng, ghi bản quyền và người tạo, và gắn từ khóa để tìm kiếm. Mỗi đoạn mã đều lấy từ một kho lưu trữ có thể chạy được và xác nhận các giá trị đã ghi vẫn tồn tại.
Yêu cầu trước
Trước khi bắt đầu, hãy chắc chắn rằng bạn có:
- Python 3 cùng pip
- GroupDocs.Metadata cho Python thông qua .NET (kho lưu trữ cố định phiên bản 26.5)
- Một tệp PSD hoặc AI để thử nghiệm
Cài đặt
pip install groupdocs-metadata-net==26.5
Bước 1 – Chụp ảnh toàn bộ gói XMP
Bắt đầu bằng cách xem mọi thứ mà tệp chứa. Quá trình chụp ảnh duyệt qua gói gốc, mỗi scheme đã đăng ký, và cuối cùng quét cây thuộc tính để tìm bất kỳ mục nào không chuẩn, thu thập tất cả vào một dict phẳng.
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: # thuộc tính gói gốc
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: # bắt gói tùy chỉnh
put(result, p)
Các điểm chính:
interpreted_valuetrước: ngày tháng và enum sẽ xuất hiện ở dạng dễ đọc thay vì dạng thô.- Bảy scheme cộng một lần quét: phần
find_propertiescuối cùng bắt các gói của nhà cung cấp mà các scheme đã đặt tên không phát hiện. - Mở tệp một lần: toàn bộ chụp ảnh chỉ tốn một ngữ cảnh
Metadata, điều này quan trọng khi xử lý hàng loạt.
💡 Mẹo: lập chỉ mục dict này khi nhập dữ liệu và hầu hết các câu hỏi siêu dữ liệu sau này sẽ trở thành việc tra cứu dict thay vì đọc lại tệp.
Scheme XMP nào nên được tích hợp đọc đầu tiên?
Bắt đầu với Dublin Core. Chín trường dc: của nó chứa tiêu đề, người tạo, quyền và chủ đề—các giá trị mà hầu hết hệ thống DAM, chỉ mục tìm kiếm và kiểm tra giấy phép đều đồng ý, và cả tệp PSD và AI đều cung cấp chúng một cách giống nhau. Đọc scheme Photoshop thứ hai để lấy ngữ cảnh biên tập như City, Credit và DateCreated. Để việc quét toàn gói cho các công việc nhập dữ liệu cần nắm bắt mọi thứ.
Bước 2 – Đọc các Scheme trả lời các câu hỏi thực tế
Trong mã thực thi khi yêu cầu, chỉ cần giới hạn việc đọc vào một scheme. Dublin Core trả lời các câu hỏi về sở hữu và tìm kiếm:
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>"))
Scheme Photoshop hoạt động tương tự thông qua các thuộc tính có kiểu: ps.color_mode, ps.icc_profile, ps.city, ps.country, ps.date_created, ps.caption_writer, ps.credit, và ps.source, mỗi thuộc tính đều được bảo vệ bằng kiểm tra None. Đó là các trường mà Bridge, Lightroom và các bộ lọc tìm kiếm DAM dựa vào cho các tệp Adobe.
Lưu ý điều gì xảy ra với các tệp không có XMP: các kiểm tra sẽ trả về một dict rỗng, không gây ngoại lệ. Các tài sản mới xuất thường gặp trường hợp này, vì vậy hãy giữ hành vi này trong tích hợp của bạn.
Ba truy vấn trên cũng hoạt động với các tệp Illustrator. Thay campaign-hero.psd bằng brand-mark.ai và không có gì thay đổi, đây là lý do một luồng mã duy nhất thực tế cho các kho lưu trữ Adobe hỗn hợp. Thực tế, một tệp AI mới xuất thường có ít scheme được điền hơn so với một tệp Photoshop, vì vậy đường đi trả về dict rỗng sẽ được thực thi thường xuyên hơn.
Bước 3 – Ghi Bản quyền và Người tạo
Bây giờ là phần ghi. Đánh dấu sở hữu chạm vào ba trường để mọi người đọc đều thấy cùng một danh tính: dc:rights cho thông báo pháp lý, dc:creator dưới dạng danh sách có thứ tự, và xmp:CreatorTool cho các công cụ chỉ đọc scheme XmpBasic thay vì Dublin Core. Tôi từng mất một buổi chiều vì một biểu ngữ giấy phép hiển thị “Unknown author” trên các tài sản mà các nhà thiết kế khẳng định đã gắn thẻ; các giá trị đã nằm trong dc:creator nhưng công cụ chỉ đọc xmp:CreatorTool. Ghi cả hai đã giải quyết lỗi này.
with Metadata("campaign-hero.psd") as metadata:
root = metadata.get_root_package()
xmp = getattr(root, "xmp_package", None)
if xmp is None: # tệp không có XMP nào
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")
Các điểm chính:
- Kiểm tra tạo lớp thiếu:
XmpPacketWrappervàXmpDublinCorePackageđược tạo khi cần, vì vậy việc ghi hoạt động ngay cả trên các tệp không có XMP. - Mảng ORDERED cho người tạo: thứ tự tác giả mang ý nghĩa, vì vậy danh sách người tạo sử dụng
XmpArraycó thứ tự. - Lưu vào đường dẫn mới: tệp nguồn không bị thay đổi, đây là mặc định đúng cho các bước xuất.
Bước 4 – Gắn Từ khóa để Tìm kiếm
dc:subject là “bag” từ khóa cho các chỉ mục DAM. Việc ghi thay thế toàn bộ bag trong một lời gọi:
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")
Từ khóa sử dụng mảng UNORDERED vì thứ tự không có ý nghĩa đối với bộ chỉ mục. Và vì set thay thế bag hiện có, hãy đọc các từ khóa hiện tại trước và hợp nhất trong Python khi bạn cần gắn thẻ cộng thêm thay vì thay thế.
Để xác minh bất kỳ lần ghi nào, chạy lại đoạn đọc Bước 2 trên tệp đầu ra. Kho lưu trữ tự động thực hiện việc này: nó đọc lại các đầu ra và khẳng định chuỗi bản quyền và từ khóa đầu tiên vẫn tồn tại trong byte đã lưu.
Ứng dụng Thực tế
Nhập dữ liệu DAM
Chạy chụp ảnh Bước 1 trên mọi tệp đến và lưu dict cùng với bản ghi tài sản. Tìm kiếm, loại trừ trùng lặp và kiểm tra quyền sau đó thực hiện trên cơ sở dữ liệu của bạn thay vì mở lại các tệp nhị phân. Việc chụp ảnh mẫu PSD nhỏ trong kho lưu trữ đã trả về một loạt thuộc tính đầy đủ trong một lần, và cùng một lời gọi vẫn giữ nguyên cấu trúc khi đầu vào trở thành một thư mục chứa hàng ngàn tệp.
Thực thi giấy phép
Trước khi tài sản được đưa lên cổng khách hàng, yêu cầu trường dc:rights không rỗng. Các tệp không đáp ứng sẽ tự động được xử lý bằng Bước 3 để gắn nhãn, vì vậy không có tài sản nào rời đi mà không có thông báo.
Gắn thẻ hàng loạt
Khi taxonomy thay đổi, đọc dc:subject của mỗi tệp, ánh xạ các thuật ngữ cũ sang mới trong Python, và ghi lại bag đã hợp nhất bằng Bước 4. Cả hai kho lưu trữ PSD và AI đều thực hiện cùng một vòng lặp. Không cần máy Photoshop.
Thực hành Tốt và Mẹo
- Xem rỗng là bình thường: các tệp không có XMP là chuyện thường, không phải lỗi; mẫu trả về sớm giữ cho pipeline luôn chạy.
- Hợp nhất trước khi ghi từ khóa:
setthay thếdc:subject, vì vậy gắn thẻ cộng thêm nghĩa là đọc, mở rộng, ghi lại. - Ghi danh tính vào cả hai scheme: đồng thời ghi
dc:creatorvàxmp:CreatorToolgiúp các trình đọc Dublin Core và XmpBasic đồng nhất. - Xác minh ghi bằng việc đọc lại: một lần đọc lại sau khi lưu là nhanh và ngay lập tức phát hiện các bất ngờ trong container.
- Mua giấy phép cho môi trường sản xuất: chế độ đánh giá chạy mọi thứ trong hướng dẫn này; hãy sử dụng giấy phép trước khi dán nhãn tài sản thực tế của khách hàng.
Kết luận
Đọc và ghi XMP trong các tệp Adobe chỉ cần ba bước: truy cập gói qua get_root_package(), bảo vệ scheme cần thiết, và đọc hoặc ghi các giá trị có kiểu. Với ba bước này bạn đã xây dựng một vòng tròn đầy đủ trong tutorial này, từ chụp ảnh gói, đọc scheme, dán nhãn bản quyền và gắn thẻ từ khóa, với cùng một đoạn mã phục vụ cả tệp PSD và AI.
Sẵn sàng triển khai trong dự án của bạn? Dưới đây là một số bước tiếp theo:
- Đọc tài liệu Working with XMP metadata để cập nhật và xóa gói
- Theo dõi integration-focused use case guide được xây dựng trên cùng một kho lưu trữ
- Sao chép sample project và chạy nó trên các tài sản của bạn
Tài nguyên Bổ sung
- GroupDocs.Metadata Documentation
- API Reference
- Sample Projects on GitHub
- GroupDocs.Metadata Blog Category
Câu hỏi về quy trình XMP của bạn? Hỏi trên support forum.