ตัวอย่างการทำงานเต็มที่มีบน GitHub:
edit-xmp-in-psd-and-ai-files-using-groupdocs-metadata-dotnet

ความท้าทายการผลิต: Metadata ที่ซ่อนอยู่ในที่ที่ไม่มีใครมองเห็น

สตูดิโอแบรนด์ส่งมอบแคมเปญ: ไฟล์ PSD ชั้นหลายชั้น, ไฟล์ AI ต้นฉบับ, สินทรัพย์หลายร้อยรายการที่ถูกอัปโหลดเข้าสู่ DAM ของลูกค้า. สามสัปดาห์ต่อมา ฝ่ายลิขสิทธิ์ถามว่าใครเป็นเจ้าของภาพหลัก. คำตอบมีอยู่แล้ว, แต่ซ่อนอยู่ในเธรดอีเมล, เพราะไฟล์เองมีฟิลด์ dc:rights ว่างเปล่า. การแก้ไข XMP เป็นความสามารถของ GroupDocs.Metadata สำหรับ .NET ที่แก้ปัญหาประเภทนี้ในระดับ pipeline, โดยอ่านและเขียนแพ็กเกจ metadata xmp ภายในไฟล์ PSD และ AI โดยไม่ต้องใช้ซอฟต์แวร์ Adobe ใด ๆ

ปัญหาขนาดมาถึงอย่างเงียบ ๆ. นักออกแบบคนหนึ่งอาจกรอก metadata ด้วยมืออย่างระมัดระวังได้สักระยะ. ทีมผลิตที่ต้องเคลื่อนย้ายสินทรัพย์หลายพันรายการต่อไตรมาสทำไม่ได้, และทุกการส่งต่อระหว่างเอเจนซี่, สตูดิโอ, และลูกค้าจะทำให้ไฟล์ PSD ที่ไม่มีการตรวจสอบ metadata เพิ่มจำนวนขึ้น. การค้นหาหยุดทำงานเมื่อสินทรัพย์ที่มีอยู่ไม่ถูกพบ. คำถามเรื่องสิทธิ์กลายเป็นการขุดค้นโบราณคดี, และการขุดค้นโบราณคดีไม่มี SLA

สิ่งที่ทีมเหล่านี้ต้องการจริง ๆ อ่านเหมือนสเปค API: สแนปช็อตทุกอย่างที่ไฟล์บรรจุขณะนำเข้า, ตรวจสอบฟิลด์เฉพาะที่จุดตรวจลิขสิทธิ์, และเขียนข้อมูลเจ้าของและคีย์เวิร์ดขณะส่งออก, ด้วยโค้ดเดียวกันสำหรับทั้งสองฟอร์แมต Adobe

Reality check: สินทรัพย์ที่มีฟิลด์ dc:rights ว่างเปล่าไม่ได้หมายความว่าไม่มีลิขสิทธิ์, แต่ไม่มีใครในสายงานสามารถพิสูจน์ได้ยกเว้นการหาคนที่จำได้

ทำไมวิธีแก้ปกติถึงไม่พอ

ทีมมักลองสามวิธีก่อนจะทำอัตโนมัติอย่างเหมาะสม:

  • การแก้ไขพาเนลด้วยมือใน Photoshop หรือ Bridge: ทำได้ต่อไฟล์, ไม่สามารถตรวจสอบได้, และต้องใช้ที่นั่ง Adobe สำหรับงานที่พื้นฐานเป็นการกรอกข้อมูล.
  • สเปรดชีต sidecar: metadata มีอยู่แต่แยกจากสินทรัพย์ทันทีที่ไฟล์ถูกคัดลอก, เปลี่ยนชื่อ, หรือส่งมอบใหม่.
  • การพาร์สภายในองค์กร: บล็อกทรัพยากร PSD และคอนเทนเนอร์ AI เป็นฟอร์แมตที่ซับซ้อน, และพาร์สเซอร์ที่พัฒนาขึ้นเองกลายเป็นภาระบำรุงรักษาเมื่อตัว Adobe ปรับเปลี่ยนอะไรสักอย่าง.

GroupDocs.Metadata เติมช่องว่างด้วย API หนึ่งเดียว: แคสต์แพ็กเกจรากเป็น IXmp แล้วแพ็กเกจก็สามารถอ่านและเขียนได้สำหรับทั้งสองฟอร์แมต, พร้อมกับ 170+ ฟอร์แมตอื่น ๆ ที่ documentation ระบุไว้.

โซลูชัน: การดำเนินการ XMP ภายใน Pipeline

GroupDocs.Metadata สำหรับ .NET แทรกเข้าไปใน pipeline ของสินทรัพย์ที่สามจุด. ที่การนำเข้า มันสแนปช็อตแพ็กเกจเต็มเป็นดิกชันนารีที่ฐานข้อมูลของคุณทำดัชนี. ที่จุดตรวจลิขสิทธิ์ มันอ่าน Dublin Core, สคีมาที่มี dc:rights และ dc:creator. ที่การส่งออก มันเขียนข้อมูลเจ้าของและคีย์เวิร์ด dc:subject, สร้างสคีมาที่หายไปบนไฟล์ที่ไม่มี XMP เลย. ฉันเคยอยู่ในหลาย ๆ การประชุม retros ที่สาเหตุหลักคือสินทรัพย์ที่ส่งออกโดยไม่มีข้อมูลสิทธิ์; ประตูตรวจนั้นมีอยู่เพราะ retros มีค่าใช้จ่ายสูงกว่าการอ่านข้อมูล.

เพื่อทำตามการนำไปใช้, คุณจะต้องมี:

  • .NET SDK 8.0 หรือใหม่กว่า
  • GroupDocs.Metadata 26.6.0 (get a temporary license)
  • ไฟล์ PSD หรือ AI เพื่อทดลอง
dotnet add package GroupDocs.Metadata --version 26.6.0

companion repository มีตัวอย่างไฟล์แต่ละฟอร์แมตหนึ่งไฟล์และตรวจสอบทุกขั้นตอนด้านล่าง

การนำ Workflow ไปใช้ขั้นตอนต่อขั้นตอน

ขั้นตอน 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 จะถูกใช้ก่อนเสมอ, ทำให้วันที่และ enumeration แสดงเป็นข้อความที่มนุษย์อ่านได้. การสแกน FindProperties สุดท้ายเป็นการรับประกันความครบถ้วนสำหรับ metadata ของ Adobe Illustrator ที่เขียนโดยปลั๊กอินที่สคีมาที่ตั้งชื่อไม่เคยได้ยินชื่อมาก่อน.

สองข้อสังเกตจากการทำงานที่สเกลการนำเข้า: เก็บสแนปช็อตโดยใช้คีย์เป็น Asset ID และติดวันที่จับ, เพราะไฟล์อาจเปลี่ยนแปลงและสแนปช็อตคือภาพก่อนหน้า. และถือดิกชันนารีว่างเป็นสัญญาณ, ไม่ใช่ข้อผิดพลาด; มันจะส่งสินทรัพย์ตรงไปยังขั้นตอนการประทับตราแทนที่จะทำให้การรับเข้าล้มเหลว.

ขั้นตอน 2 – ตรวจสอบ Dublin Core ที่จุดตรวจลิขสิทธิ์

ฟิลด์ dc:* ทั้ง 9 ตัวตอบคำถามด้านกฎหมายและลิขสิทธิ์ที่จริง ๆ แล้วต้องการ. การอ่านเฉพาะสคีมานี้ทำให้ประตูทำงานเร็ว.

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

เหตุผลที่การตั้งค่านี้สำคัญสำหรับทีมผลิต:

  • Null-conditional chain: ไฟล์ที่ไม่มี XMP เป็นเรื่องปกติในไฟล์ส่งออกใหม่; ดิกชันนารีว่างหมายถึง “ให้ประทับตรา”, ไม่ใช่ “หยุดทำงาน”.
  • ขอบเขตสคีม: ประตูทำงานทุกครั้งที่สินทรัพย์เคลื่อนย้าย, ดังนั้นการอ่านเพียง 9 ฟิลด์แทนที่จะอ่านทั้งต้นไม้ทำให้ต้นทุนต่ำ.

ขั้นตอน 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 คือรายละเอียดที่ควรขโมย: มันอัปเดตทุก property ที่ไลบรารีจัดประเภทเป็นฟิลด์ผู้สร้าง, ไม่ว่าฟอร์แมตจะเก็บไว้ที่ไหน, ดังนั้นเครื่องมือที่ไม่เคยอ่าน 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);

การเขียนนี้แทนที่ bag ที่มีอยู่, ดังนั้นการแท็กแบบเพิ่มขึ้นจึงต้องทำ: อ่าน, ผสานใน C#, แล้วเขียน. repository จะเขียนคีย์เวิร์ดตัวอย่างสามคำและตรวจสอบว่าคำแรกยังคงอยู่ในไบต์ที่บันทึกไว้. ทีมที่เวอร์ชัน taxonomy ของตนเองมักจะเก็บชุดคีย์เวิร์ดมาตรฐานต่อแคมเปญและให้ pipeline ปรับไฟล์ให้สอดคล้องกับมันทุกครั้งที่ส่งออก, ทำให้การเบี่ยงเบนคีย์เวิร์ดกลายเป็น diff แทนที่จะเป็นการโต้แย้ง.

เราต้องมีไลเซนส์ Photoshop เพื่อแก้ไข metadata หรือไม่?

ไม่, และนี่มักเป็นเหตุผลหลักที่ทำให้ต้องอัตโนมัติ. GroupDocs.Metadata อ่านและเขียนแพ็กเกจโดยตรงใน .NET, ดังนั้นงานบนเซิร์ฟเวอร์สามารถประทับตราสิทธิ์หรือแก้คีย์เวิร์ดทั่วคลังโดยไม่ต้องเปิดแอป Adobe ใด ๆ. นักออกแบบยังคงใช้เครื่องมือของตนสำหรับงานออกแบบ, ในขณะที่ pipeline ดูแลความสะอาดของ metadata ในระดับใหญ่.

สิ่งที่การเปลี่ยนแปลงนี้ทำให้ธุรกิจเปลี่ยนแปลง

Workflow ข้างต้นทำให้เหตุการณ์ที่เกิดบ่อยสามอย่างกลายเป็นเหตุการณ์ที่ไม่เกิดขึ้น. คำถามเรื่องสิทธิ์ไม่ต้องอาศัยความจำของมนุษย์อีกต่อไป, เพราะ dc:rights ถูกตรวจที่ประตูและประทับตราเมื่อขาด. สินทรัพย์ที่ไม่สามารถค้นหาได้ไม่สะสมต่อไป, เพราะคีย์เวิร์ดถูกเขียนโดย pipeline แทนคนที่จำได้. งาน metadata ไม่กินที่นั่ง Adobe อีกต่อไป, เพราะขั้นตอนสี่ไม่มีการเปิดเครื่องมือของนักออกแบบ.

นอกจากนี้ยังมีเรื่องการตรวจสอบที่การแก้ไขด้วยมือไม่สามารถให้ได้. ทุกการตัดสินใจที่ประตูและทุกการประทับตราเป็นเส้นทางโค้ดที่บันทึกไว้, ดังนั้นเมื่อคลายเอนต์ไคลเอนต์ถามว่าสินทรัพย์ได้สิทธิ์อย่างไร, คำตอบคือบันทึก pipeline ที่มี timestamp. ทั้งหมดเป็นห้าฟังก์ชันเล็ก ๆ, แต่ละฟังก์ชันได้รับการทดสอบใน repository คู่มือทั้ง PSD และ AI, ซึ่งเป็นรูปแบบที่ทีมแพลตฟอร์มสามารถดูแลได้โดยไม่ต้องมีผู้ดูแลเฉพาะ.

สรุป

Metadata XMP ในไฟล์ PSD และ AI จะไม่เป็นงานที่ต้องทำด้วยมือเมื่อ pipeline เป็นเจ้าของ: สแนปช็อตที่การนำเข้า, ตรวจสอบ Dublin Core ที่ประตู, ประทับตราเจ้าของและคีย์เวิร์ดที่การส่งออก. การแคสต์เป็น IXmp หนึ่งครั้งทำงานได้ทั้งสองฟอร์แมต, ตัวป้องกันทำให้การส่งออกใหม่ปลอดภัย, และทุกการดำเนินการที่แสดงที่นี่ได้รับการทดสอบใน repository ตัวอย่าง.

พร้อมที่จะเชื่อมต่อเข้ากับ pipeline ของคุณหรือยัง?

แหล่งข้อมูลเพิ่มเติม