דוגמה מלאה עובדת זמינה ב‑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.

מוכנים ליישם זאת בפרויקט שלכם? הנה כמה צעדים הבאים:

משאבים נוספים

שאלות על זרימת העבודה של XMP שלכם? שאלו בפורום support forum.