مثال كامل يعمل متاح على GitHub:
edit-xmp-in-psd-and-ai-files-using-groupdocs-metadata-dotnet

تحدي الإنتاج: البيانات الوصفية التي تعيش حيث لا ينظر أحد

يقوم استوديو العلامة التجارية بتسليم حملة: ملفات PSD متعددة الطبقات، ملفات مصدر AI، مئات الأصول التي تُدفع إلى نظام إدارة الأصول (DAM) الخاص بالعميل. بعد ثلاثة أسابيع، يطلب قسم الترخيص معرفة من يملك الصورة الرئيسية. الجواب موجود، لكنه موجود في سلسلة بريد إلكتروني، لأن الملف نفسه يحمل حقل dc:rights فارغ. تحرير XMP هو قدرة من GroupDocs.Metadata لـ .NET تُصلح هذا النوع من المشكلات على مستوى خط الأنابيب، حيث تقرأ وتكتب حزمة بيانات XMP داخل ملفات PSD و AI دون أي برنامج من Adobe في العملية.

تظهر مشكلة النطاق بهدوء. يمكن لمصمم واحد ملء لوحات البيانات الوصفية يدويًا وبعناية لفترة من الوقت. لا يستطيع فريق الإنتاج الذي ينقل آلاف الأصول كل ربع سنة ذلك، وكل عملية تسليم بين الوكالة، الاستوديو، والعميل تضاعف عدد الملفات التي لم يتم التحقق من بيانات PSD الوصفية فيها. يتوقف البحث عن العثور على الأصول الموجودة. تصبح أسئلة الحقوق علمًا أثريًا، ولا يمتلك علم الآثار أي اتفاقية مستوى خدمة.

ما تحتاجه هذه الفرق فعليًا يقرأ كأنه مواصفة API: التقاط كل ما يحمله الملف عند الاستيعاب، والتحقق من حقول محددة عند بوابات الترخيص، وكتابة الملكية والكلمات المفتاحية عند التصدير، باستخدام كود موحد لكلا صيغتي Adobe.

تحقق من الواقع: الأصل الذي يحتوي على حقل dc:rights فارغ ليس غير مرخص، لكن لا أحد في المراحل اللاحقة يمكنه إثبات العكس دون العثور على شخص يتذكر.

لماذا الحلول المعتادة لا تكفي

عادةً ما تحاول الفرق ثلاث مقاربات قبل الأتمتة الفعلية:

  • تحرير يدوي للوحة في Photoshop أو Bridge: يعمل على كل ملف، لا يمكن تدقيقه، ويتطلب مقعدًا من Adobe لمهمة أساسية هي إدخال بيانات.
  • جداول بيانات جانبية: البيانات الوصفية موجودة لكنها تنفصل عن الأصل بمجرد نسخ الملف أو إعادة تسميته أو إعادة تسليمه.
  • تحليل داخلي: كتل موارد PSD وحاويات AI صيغ غير بسيطة، ومحلل تم تطويره داخليًا يصبح عبئ صيانة بمجرد أن تقوم Adobe بتعديل أي شيء.

GroupDocs.Metadata يغطي الفجوة بواجهة برمجة تطبيقات واحدة: حوّل الحزمة الجذرية إلى IXmp وستصبح الحزمة قابلة للقراءة والكتابة لكلا الصيغتين، إلى جانب أكثر من 170 حزمة أخرى تُدرجها التوثيق.

الحل: عمليات XMP داخل خط الأنابيب

GroupDocs.Metadata لـ .NET يندمج في خط أنابيب الأصول في ثلاث نقاط. عند الاستيعاب يلتقط الحزمة الكاملة في قاموس تُفهرسه قاعدة البيانات. عند بوابة الترخيص يقرأ Dublin Core، المخطط الذي توجد فيه dc:rights و dc:creator. عند التصدير يكتب الملكية وكلمات dc:subject المفتاحية، مُنشئًا المخططات المفقودة في الملفات التي تصل بدون XMP على الإطلاق. لقد جلست في العديد من جلسات ما بعد الإطلاق حيث كان السبب الجذري أصلًا شُحن بدون بيانات حقوق؛ البوابة موجودة لأن جلسات ما بعد الإطلاق أكثر تكلفة من عمليات القراءة.

لمتابعة التنفيذ، ستحتاج إلى:

dotnet add package GroupDocs.Metadata --version 26.6.0

المستودع المرافق يزرع عينة واحدة من كل صيغة ويؤكد كل خطوة أدناه.

تنفيذ سير العمل خطوة بخطوة

الخطوة 1 – التقاط كل شيء عند الاستيعاب

تمريرة واحدة تلتقط الحزمة، المخططات المسماة، وأي شيء تخفيه أدوات البائع. احفظ القاموس بجانب سجل الأصل وتصبح الأسئلة اللاحقة عمليات بحث في قاعدة البيانات.

// Full XMP snapshot: packet, schemes, then a deep sweep
var result = new Dictionary<string, string>();
using (var metadata = new Metadata(adobeFilePath))
{
    var root = metadata.GetRootPackage() as IXmp;
    if (root?.XmpPackage == null) return result;

    foreach (var property in root.XmpPackage)
    {
        result[property.Name] = property.InterpretedValue?.ToString()
            ?? property.Value?.ToString() ?? string.Empty;
    }
    // CollectScheme(...) repeats this loop for DublinCore, XmpBasic,
    // Photoshop, CameraRaw, PagedText, XmpDynamicMedia, XmpMediaManagement
    foreach (var p in metadata.FindProperties(p => p.Name != null))
    {
        if (!result.ContainsKey(p.Name))
        {
            result[p.Name] = p.InterpretedValue?.ToString()
                ?? p.Value?.ToString() ?? string.Empty;
        }
    }
}
return result;

InterpretedValue يأتي أولًا في جميع الحالات، لذا تصبح التواريخ والقيم المتعددية قابلة للقراءة البشرية. عملية FindProperties اللاحقة هي ضمان الاكتمال لبيانات Adobe Illustrator المكتوبة بواسطة إضافات لم تسمع بها المخططات المسماة.

ملاحظتان تشغيليتان من تشغيل هذا على نطاق الاستيعاب. احفظ اللقطة مُفهرسة بمعرف الأصل وضع طابعًا بتاريخ الالتقاط، لأن الملف سيتغير واللقطة هي صورتك قبل التغيير. وعامل القاموس الفارغ كإشارة، لا كخطأ؛ فهو يوجه الأصل مباشرة إلى خطوة الختم بدلاً من فشل الاستيعاب.

الخطوة 2 – التحقق من Dublin Core عند بوابة الترخيص

تسعة حقول dc:* تجيب على الأسئلة التي يطرحها القانون والترخيص فعليًا. قراءة هذا المخطط فقط تجعل البوابة سريعة.

// dc:* fields only - Title, Creator, Rights, Subject and friends
var result = new Dictionary<string, string>();
using (var metadata = new Metadata(adobeFilePath))
{
    var root = metadata.GetRootPackage() as IXmp;
    var dc = root?.XmpPackage?.Schemes?.DublinCore;
    if (dc == null) return result;

    foreach (var property in dc)
    {
        result[property.Name] = property.InterpretedValue?.ToString()
            ?? property.Value?.ToString() ?? string.Empty;
    }
}
return result;

لماذا هذه الإعدادات مهمة لفرق الإنتاج:

  • سلسلة الشرطية الفارغة: الملفات بدون XMP أمر روتيني في الصادرات الجديدة؛ القاموس الفارغ يعني “ختمني”، لا “تحطم”.
  • نطاق المخطط: البوابات تعمل على كل حركة أصل، لذا قراءة تسعة حقول بدلاً من الشجرة كاملة تجعلها رخيصة.

الخطوة 3 – وضع علامة الملكية عند التصدير

الكتابة تمس ثلاث طبقات بحيث يرى كل قارئ، سواء كان يدعم XMP أم لا، الهوية نفسها. الحراس ينشئون أولًا حزمة المخطط والكائنات المفقودة.

// Guard-create the packet and scheme, then write rights and creator
using (var metadata = new Metadata(inputPath))
{
    var root = metadata.GetRootPackage() as IXmp;
    if (root == null) return;

    if (root.XmpPackage == null)
        root.XmpPackage = new XmpPacketWrapper();
    if (root.XmpPackage.Schemes.DublinCore == null)
        root.XmpPackage.Schemes.DublinCore = new XmpDublinCorePackage();

    var dc = root.XmpPackage.Schemes.DublinCore;
    dc.SetRights(copyright);
    dc.Set("dc:creator", XmpArray.From(new[] { creator }, XmpArrayType.Ordered));
    // Mirror the identity for XmpBasic readers and tag-classified fields
    if (root.XmpPackage.Schemes.XmpBasic == null)
        root.XmpPackage.Schemes.XmpBasic = new XmpBasicPackage();
    root.XmpPackage.Schemes.XmpBasic.CreatorTool = creator;

    metadata.SetProperties(p => p.Tags.Contains(Tags.Person.Creator),
        new PropertyValue(creator));

    metadata.Save(outputPath);
}

استدعاء SetProperties مع Tags.Person.Creator هو التفصيل الذي يستحق السرقة: فهو يُحدّث كل خاصية تصنفها المكتبة كحقل منشئ، أينما خزنها التنسيق، لذا الأدوات التي لا تقرأ XMP لا تزال تُظهر الاسم الصحيح.

الخطوة 4 – كتابة الكلمات المفتاحية للبحث

dc:subject هو المفردات التي يفهرسها بحث DAM. بدونها، الأصول موجودة لكن لا تتطابق أبدًا مع أي استعلام.

// Replace the dc:subject bag with the pipeline's keyword list
root.XmpPackage.Schemes.DublinCore.Set(
    "dc:subject",
    XmpArray.From(keywords, XmpArrayType.Unordered));
metadata.Save(outputPath);

الكتابة تستبدل الحقيبة الحالية، لذا فإن الوسم الإضافي يعني قراءة، دمج في C#، كتابة. المستودع يكتب ثلاث كلمات مفتاحية نموذجية ويؤكد أن الأولى تبقى في البايتات المحفوظة. الفرق التي تُصنّف تصنيفها عادةً تخزن مجموعة الكلمات المفتاحية الرسمية لكل حملة وتدع الخط الأنابيب يطابق الملفات معها في كل تصدير، مما يحول انحراف الكلمات المفتاحية إلى فرق بدلاً من جدال.

هل نحتاج إلى تراخيص Photoshop فقط لتصحيح البيانات الوصفية؟

لا، وهذا عادةً ما يكون هدف أتمتة العملية. GroupDocs.Metadata يقرأ ويكتب الحزمة مباشرة في .NET، لذا يمكن لوظيفة على الخادم ختم الحقوق أو تصحيح الكلمات المفتاحية عبر أرشيف دون فتح أي تطبيق من Adobe. يبقى المصممون بأدواتهم للعمل التصميمي، بينما يتحكم خط الأنابيب في نظافة البيانات الوصفية على نطاق واسع.

ما الذي يغيّره هذا للأعمال

يحوّل سير العمل أعلاه ثلاث حوادث متكررة إلى غير موجودة. تتوقف أسئلة الحقوق عن طلب الذاكرة البشرية، لأن dc:rights يُفحص عند بوابة ويتم ختمه عندما يكون مفقودًا. تتوقف الأصول غير القابلة للبحث عن التراكم، لأن الكلمات المفتاحية تُكتب بواسطة الخط الأنابيب بدلاً من من تذكرها. وتتوقف أعمال البيانات الوصفية عن استهلاك مقاعد Adobe، لأن أيًا من الخطوات الأربع لا يفتح أداة مصمم.

هناك أيضًا قصة تدقيق لا يمكن للتحرير اليدوي تقديمها. كل قرار بوابة وكل ختم هو مسار شفرة مسجَّل، لذا عندما يسأل العميل كيف حصل الأصل على سطر الحقوق، يكون الجواب سجلًا زمنيًا من الخط الأنابيب. السطح كله يتكون من خمس طرق صغيرة، كل واحدة مُؤكدة في المستودع المرافق ضد كل من عينة PSD وعينة AI، وهو بالضبط النوع من البصمة التي يمكن لفريق المنصة امتلاكها دون صيانة مخصصة.

الخلاصة

تتوقف بيانات XMP الوصفية في ملفات PSD و AI عن كونها مهمة يدوية بمجرد أن يتحكم فيها خط الأنابيب: التقاط عند الاستيعاب، فحص Dublin Core عند البوابات، ختم الملكية والكلمات المفتاحية عند التصدير. تحويل واحد إلى IXmp يخدم الصيغتين، الحراس يجعلون الصادرات الجديدة مدخلًا آمنًا، وكل عملية موضحة هنا تُنفذ ومؤكدة في مستودع العينة.

هل أنت مستعد لدمجها في خط الأنابيب الخاص بك؟

موارد إضافية