דוגמה מלאה עובדת זמינה ב‑GitHub:
manage-xmp-in-psd-and-ai-files-python
מבוא
צוות שיווק משחרר 400 קבצי PSD לפלטפורמת הנכסים שלך. ההעלאה עובדת. החיפוש לא, מכיוון שאין בקבצים מילות מפתח, חצי מהם חסרים הודעת זכויות יוצרים, ושמות המעצבים קיימים רק בגיליון אלקטרוני כלשהו. הפתרון אינו גיליון אלקטרוני גדול יותר. ניהול XMP הוא יכולת של GroupDocs.Metadata עבור Python דרך .NET שקוראת וכותבת את חבילת המטה‑דטה המוטמעת בקבצי Photoshop PSD ו‑Illustrator AI, מה שאומר שפרטי הבעלות והחיפוש יכולים לחיות בתוך הקבצים עצמם.
XMP הוא חבילת XML בתוך מכולה בינרית, מאורגנת לסכמות: Dublin Core לשדות שכל מערכת מבינה, סכמת Photoshop להקשר עריכתי, XmpBasic לזיהוי כלי. פענוח PSD ידנית כדי להגיע לחבילה הוא משימה קשה באמת. עם מחלקת Metadata מדובר בשלושה חיפושי תכונה, והקוד הזהה משמש גם קבצי AI.
המדריך הזה מוביל את המסלול המלא בארבעה שלבים: צילום כל החבילה, קריאת הסכמות החשובות, כתיבת זכויות יוצרים ויוצר, ותיוג מילות מפתח לחיפוש. כל קטע קוד מגיע ממאגר שניתן להריץ שמוודא שהערכים שנכתבו נשמרים.
דרישות מוקדמות
לפני שמתחילים, ודאו שיש ברשותכם:
- Python 3 עם pip
- GroupDocs.Metadata עבור Python דרך .NET (המאגר מציין גרסה 26.5)
- קובץ PSD או AI להתנסות
התקנה
pip install groupdocs-metadata-net==26.5
שלב 1 – צילום כל חבילת ה‑XMP
התחילו בלראות את כל מה שהקובץ נושא. הצילום עובר על חבילת השורש, כל סכמת רשומה, ולבסוף סורק את עץ המאפיינים לכל דבר שאינו סטנדרטי, ומאגד הכל למילון שטוח אחד.
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)
נקודות מפתח:
interpreted_valueראשונה: תאריכים ו‑enumerations מגיעים בצורה קריאה לבן אדם במקום ערך גולמי.- שבע סכמות ועוד סריקה: הקריאה
find_propertiesבתום הלולאה תופסת חבילות של יצרנים שהסכמות המוגדרות אינן כוללות. - פתיחה של קובץ אחת: כל הצילום מתבצע בהקשר
Metadataיחיד, מה שחשוב כשמעבדים כמויות גדולות.
טיפ: אינדקסו את המילון בזמן הקליטה וכך רוב השאלות על מטה‑דטה יהפכו לחיפושי מילון במקום קריאת קבצים.
איזו סכמת XMP על האינטגרציה שלי לקרוא ראשונה?
התחילו עם Dublin Core. תשעת השדות dc: שלו נושאים את הכותרת, היוצר, הזכויות והנושא – ערכים שרוב מערכות DAM, אינדקסי חיפוש ובדיקות רישוי מתבססים עליהם, והם נחשפים באופן זהה בקבצי PSD ו‑AI. קראו את סכמת Photoshop שנייה להקשר עריכתי כגון City, Credit, ו‑DateCreated. שמרו על סריקת החבילה המלאה למקרים של קיבול נתונים מלא.
שלב 2 – קריאת הסכמות שמענות על שאלות ממשיות
בקוד בזמן בקשה, גבו את הקריאה לסכמה אחת. Dublin Core עונה על שאלות של בעלות וחיפוש:
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>"))
סכמת Photoshop פועלת באותו אופן דרך מאפיינים typed: ps.color_mode, ps.icc_profile, ps.city, ps.country, ps.date_created, ps.caption_writer, ps.credit, ו‑ps.source, שכל אחד נקרא עם שמירת None. אלו השדות שמסנני Bridge, Lightroom ו‑DAM מתמקדים בהם עבור קבצי Adobe.
שימו לב למה שקורה בקבצים ללא XMP: השומרות מחזירות מילון ריק, ולא יוצאות שגיאה. נכסי יצוא חדשים מייצרים מצב זה באופן שגרתי, ולכן יש לשמר התנהגות זו באינטגרציה שלכם.
שלוש הקריאות האלו עובדות גם על קבצי Illustrator. החליפו campaign-hero.psd ב‑brand-mark.ai ושום דבר אחר לא ישתנה, וזה מה שהופך מסלול קוד יחיד למעשי בארכיונים מעורבים של Adobe. בפועל, ייצוא AI טרי נוטה להגיע עם פחות סכמות מאוכלסות מאשר שמירת Photoshop, ולכן נתיב המילון הריק מתבצע בתדירות גבוהה יותר שם.
שלב 3 – כתיבת זכויות יוצרים ויוצר
עכשיו נתיב הכתיבה. חותמת בעלות נוגעת לשלושה שדות כך שכל קורא רואה את אותה זהות: dc:rights להודעת החוק, dc:creator כרשימה מסודרת, ו‑xmp:CreatorTool לכלים שקוראים את סכמת XmpBasic במקום Dublin Core. פעם אחת איבדתי אחר הצהריים בגלל באנר רישוי שהציג “מחבר לא ידוע” על נכסים שהמעצבים קבעו שהם מתוייגים; הערכים היו ב‑dc:creator בעוד שהכלי קרא רק xmp:CreatorTool. כתיבת שני השדות יחד סגרה את סוג הבאג הזה.
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")
נקודות מפתח:
- שומרות יוצרות שכבות חסרות:
XmpPacketWrapperו‑XmpDublinCorePackageנוצרות לפי דרישה, כך שהכתיבה עובדת גם על קבצים ללא XMP. - מערך ORDERED ליוצרים: סדר המחברים חשוב, ולכן רשימת היוצרים משתמשת ב‑
XmpArrayמסודר. - שמירה לנתיב חדש: קובץ המקור נשאר ללא שינוי, וזה ברירת המחדל הנכונה שלב של יצוא.
שלב 4 – תיוג מילות מפתח לחיפוש
dc:subject הוא שקית המילות מפתח של אינדקסי DAM. הכתיבה מחליפה את כל השקית בקריאה אחת:
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")
מילות המפתח משתמשות במערך UNORDERED מכיוון שהסדר אינו משמעותי למנועי חיפוש. מכיוון שה‑set מחליפה את השקית הקיימת, קראו תחילה את המילות מפתח הנוכחיות ומזגו ב‑Python כאשר נדרש תיוג מצטבר במקום החלפה.
כדי לאמת כל כתיבה, הריצו שוב את קורא של שלב 2 על קובץ הפלט. המאגר מאמת זאת אוטומטית: הוא קורא מחדש את הפלטים שלו ומוודא שהמחרוזת של זכויות היוצרים והמילה המפתח הראשונה נשארות בבייטים השמורים.
יישומים בעולם האמיתי
קיבול DAM
הפעילו את צילום שלב 1 על כל קובץ נכנס ושמרו את המילון לצד רשומת הנכס. חיפוש, זיהוי כפילויות ובדיקות זכויות מתבצעים כעת מול מסד הנתונים במקום פתיחת קבצים בינריים. הצילום של הדוגמה הקטנה של המאגר מחזיר ערימת תכונות בריאה בפעם אחת, והקריאה זהה גם כשקלט הוא תיקייה של אלפי קבצים.
אכיפת רישוי
לפני שהנכס נשלח לפורטל לקוח, דרשו dc:rights שאינה ריקה. קבצים שלא עומדים בתנאי יקבלו טיפול חותמת של שלב 3 באופן אוטומטי, כך שלא יעזוב דבר ללא הודעה.
תיוג קבוצתי מחדש
כאשר הטקסונומיה משתנה, קראו את dc:subject של כל קובץ, המירו מונחים ישנים לחדשים ב‑Python, וכתבו את השקית הממוזגת חזרה עם שלב 4. הן קבצי PSD והן AI עוברים את אותו הלולאה. אין צורך במושב Photoshop.
שיטות עבודה מומלצות וטיפים
- התייחסו לריק כאל נורמלי: קבצים ללא XMP הם שגרה, לא שגיאות; תבנית החזרה המוקדמת משמרת זרימת צינור העבודה.
- מזגו לפני כתיבת מילות מפתח:
setמחליף אתdc:subject, ולכן תיוג מצטבר דורש קריאה, הרחבה, כתיבה. - כתבו זהות לשתי הסכמות: צירוף
dc:creatorעםxmp:CreatorToolמשאיר קוראי Dublin Core וקוראי XmpBasic בתיאום. - אמתו כתיבות עם קריאה חוזרת: קריאה מחדש אחרי שמירה היא זולה ותופסת הפתעות במכולה מיד.
- רישיון לייצור: מצב הערכה מריץ את כל מה שמוצג כאן; השתמשו ברישיון לפני חותמת נכסים של לקוחות אמיתיים.
סיכום
קריאה וכתיבה של XMP בקבצי Adobe מצטמצמת לשלושה שלבים: מציאת החבילה דרך get_root_package(), שמירת הסכמה הדרושה, וקריאה או כתיבה של ערכים typed. עם שלבים אלה בניתם מסלול שלם במדריך זה, מצילום חבילה, דרך קריאת סכמות, חותמת זכויות יוצרים ותיוג מילות מפתח, עם קוד זהה עבור קבצי PSD ו‑AI.
מוכנים ליישם זאת בפרויקט שלכם? הנה כמה צעדים הבאים:
- קראו את התיעוד של Working with XMP metadata לעדכון והסרת חבילות
- עקבו אחרי integration-focused use case guide המבוסס על אותו מאגר
- השיבו את sample project והפעלו אותו על הנכסים שלכם
משאבים נוספים
- GroupDocs.Metadata Documentation
- API Reference
- Sample Projects on GitHub
- GroupDocs.Metadata Blog Category
שאלות על זרימת העבודה של XMP שלכם? שאלו בפורום support forum.