💡 דוגמה מלאה עובדת זמינה ב‑GitHub:
metadata-diff-doc-versions-using-groupdocs-metadata-nodejs

מבוא

השוואת מטא‑נתונים היא יכולת של GroupDocs.Metadata שמגלה שינויים מוסתרים בין גרסאות של מסמך, ומאפשרת למבקרים לאמת את האותנטיות במהירות. כאשר צוותים משפטיים צריכים להוכיח שחוזה לא שונה, המאפיינים הבלתי נראים — מחבר, עורך, חותמות זמן של גרסאות — לעיתים מספרים את הסיפור האמיתי.

נתקלתי בבעיה זו בזמן שבדקתי אצווה של הסכמי ספקים; כל קובץ טען את אותה תאריך יצירה, אך שדות המחבר המוסתרים היו שונים, והבדיקה הידנית הייתה אורכת שעות.

למה מטא‑נתונים מוסתרים חשובים לצוותים משפטיים

מקצועני משפט וציות מסתמכים על ראיות בלתי ניתנות לשינוי. אפילו אם הטקסט הגלוי נשאר זהה, שינוי בשדה Creator או LastPrinted יכול להעיד על עריכות בלתי מורשות. גילוי שינויי מטא‑נתונים מוקדם מונע סכסוכים יקרים ומספק מסלול ביקורת רגולטורי.

הפתרון שלנו עם GroupDocs.Metadata

GroupDocs.Metadata עבור Node.js מספק API יחיד שמוציא כל מאפיין נתמך, משווה בין שתי גרסאות, ומייצר דוחות diff מובנים. ה‑SDK תומך ב‑DOCX, PDF, XLSX ועוד פורמטים רבים “out‑of‑the‑box”, כך שאין צורך במפרשים מותאמים לכל סוג קובץ.

שלב 1 – חילוץ כל המטא‑נתונים ממסמך

העזר הבא פותח קובץ, הולך על כל עץ המאפיינים ומחזיר מפת JavaScript פשוטה של שם המאפיין → ערך. הוא משתמש ב‑AnySpecification כדי לתפוס גם שדות מובנים וגם מותאמים.

/** Extract all metadata from a file */
function extractAllMetadata(documentPath) {
  const result = {};
  const metadata = new groupdocs.Metadata(documentPath);
  try {
    const properties = metadata.findProperties(new groupdocs.AnySpecification());
    for (let i = 0; i < properties.getCount(); i++) {
      const p = properties.get_Item(i);
      const name = p.getName();
      const value = valueToString(p);
      result[name] = value;
    }
  } finally {
    metadata.close();
  }
  return result;
}

הערת ביצועים: חילוץ מטא‑נתונים מקובץ DOCX של 5 MB מתבצע בפחות 200 ms על מעבד טיפוסי של 2 GHz Docs.

שלב 2 – איתור הבדלים בין שתי גרסאות

כאשר שתי הגרסאות מיוצגות כאובייקטים פשוטים, רוטינת ה‑diff בונה שלושה דליים — added, removed, ו‑changed — ומספקת getter נוח totalChanges.

/** Compare two metadata maps */
function compareMetadataSets(pathV1, pathV2) {
  const v1 = extractAllMetadata(pathV1);
  const v2 = extractAllMetadata(pathV2);

  const added = {};
  const removed = {};
  const changed = {};

  for (const k of Object.keys(v2)) {
    if (!(k in v1)) added[k] = v2[k];
    else if (v1[k] !== v2[k]) changed[k] = { from: v1[k], to: v2[k] };
  }
  for (const k of Object.keys(v1)) {
    if (!(k in v2)) removed[k] = v1[k];
  }

  return {
    added,
    removed,
    changed,
    get totalChanges() {
      return Object.keys(this.added).length + Object.keys(this.removed).length + Object.keys(this.changed).length;
    },
  };
}

שלב 3 – תובנות על בעלות והיסטוריית גרסאות (אופציונלי)

זיהוי שינויי בעלות

מבקרי משפט לעיתים מתמקדים במי יצר או ערך את המסמך. העזר הזה מבודד את השדות הרלוונטיים ומסמן כל שינוי.

/** Ownership change detection */
function detectOwnershipChanges(pathV1, pathV2) {
  const v1 = readOwnership(pathV1);
  const v2 = readOwnership(pathV2);
  const all = new Set([...Object.keys(v1), ...Object.keys(v2)]);
  const changes = {};
  for (const k of all) {
    const oldV = v1[k] !== undefined ? v1[k] : '<missing>';
    const newV = v2[k] !== undefined ? v2[k] : '<missing>';
    if (oldV !== newV) changes[k] = { from: oldV, to: newV };
  }
  return changes;
}

זיהוי שינויי היסטוריית גרסאות

מספר גרסה, זמן עריכה כולל, וחותמות זמן של הדפסה אחרונה חושפים פעילות מוסתרת.

/** Revision history change detection */
function detectRevisionHistory(pathV1, pathV2) {
  const v1 = readRevision(pathV1);
  const v2 = readRevision(pathV2);
  const all = new Set([...Object.keys(v1), ...Object.keys(v2)]);
  const changes = {};
  for (const k of all) {
    const oldV = v1[k] !== undefined ? v1[k] : '<missing>';
    const newV = v2[k] !== undefined ? v2[k] : '<missing>';
    if (oldV !== newV) changes[k] = { from: oldV, to: newV };
  }
  return changes;
}

שלב 4 – יצוא דוחות ביקורת

יצוא ל‑CSV

פורמט CSV אידיאלי ל‑Excel או לשאיבת נתונים במערכות SIEM. השדות מוצפנים כדי להתמודד עם פסיקים ושורות חדשות.

/** Export diff to CSV */
function exportDiffToCsv(diff, outputPath) {
  const rows = ['change_type,property,old_value,new_value'];
  for (const [k, v] of Object.entries(diff.added)) rows.push(`added,${esc(k)},,${esc(v)}`);
  for (const [k, v] of Object.entries(diff.removed)) rows.push(`removed,${esc(k)},${esc(v)},`);
  for (const [k, o] of Object.entries(diff.changed)) rows.push(`changed,${esc(k)},${esc(o.from)},${esc(o.to)}`);
  fs.writeFileSync(outputPath, rows.join('\n') + '\n', 'utf-8');
}

יצוא ל‑JSON

JSON שומר על המבנה ההיררכי לצריכה תכנותית.

/** Export diff to JSON */
function exportDiffToJson(diff, outputPath) {
  const payload = { added: diff.added, removed: diff.removed, changed: diff.changed };
  fs.writeFileSync(outputPath, JSON.stringify(payload, null, 2), 'utf-8');
}

סקריפט מנהל מלא

הסקריפט מחבר את כל החלקים, מדפיס סיכום מהיר, וכותב דוחות CSV ו‑JSON.

const path = require('path');
const fs = require('fs');
const groupdocs = require('@groupdocs/groupdocs.metadata');

function esc(txt) { return /[",\n]/.test(txt) ? `"${txt.replace(/"/g, '""')}"` : txt; }

const diff = compareMetadataSets('resources/document-v1.docx', 'resources/document-v2.docx');
console.log(`Total metadata changes: ${diff.totalChanges}`);

exportDiffToCsv(diff, path.resolve('metadata-diff.csv'));
exportDiffToJson(diff, path.resolve('metadata-diff.json'));

הרצת node index.js יוצרת metadata-diff.csv ו‑metadata-diff.json בתיקיית השורש של הפרויקט.

איך אפשר להשוות מטא‑נתונים בין שתי גרסאות של מסמך?

אתה משווה מטא‑נתונים על‑ידי טעינת כל גרסה עם המחלקה Metadata, חילוץ מפת שם‑ל‑ערך שטוחה דרך extractAllMetadata, והזנת שתי המפות ל‑compareMetadataSets. הפונקציה מחזירה שלושה אוספים — added, removed, ו‑changed — בנוסף למונה totalChanges. זה עובד עם כל פורמט הנתמך על‑ידי GroupDocs.Metadata (DOCX, PDF, XLSX, PPTX, וכו’) ומסתיים בפחות שנייה עבור קבצי Office טיפוסיים, מה שהופך אותו למתאים לעיבוד באצוות או אינטגרציה ב‑CI.

השפעה עסקית

מדד תהליך ידני אוטומציה עם GroupDocs.Metadata
זמן לכל מסמך ~45 דק (בדיקה ידנית) <30 ש׳ (diff מטא‑נתונים)
שיעור שגיאות ~3 % שינויים שלא נצפו 0 % – כל מאפיין נבדק
קיבולת 20 מסמכים/יום למבקר 1 000 + מסמכים/יום על VM ממוצע
מסלול ביקורת רשימות כתובות יד לוגים מובנים CSV/JSON
עלות $X /שעה × N מבקרים רישיון קבוע, הרצות בלתי מוגבלות

האוטומציה מקצרת את זמן הבדיקה ביותר מ‑99 %, מבטלת טעויות אנוש, ומספקת מסלול ביקורת קריא למכונה שמשתלב ישירות בלוחות מחוונים של ציות.

התחלה בסביבת העבודה שלך

  1. נסו בחינם – קבלו רישיון זמני ל‑30 יום כאן.
  2. התקנת ה‑SDKnpm install @groupdocs/groupdocs.metadata.
  3. הפעלת הדוגמה – שכפלו את מאגר ה‑GitHub והפעילו node index.js.
  4. חקור עוד – עיינו בתיעוד המלא של ה‑API לקבלת מסננים מתקדמים וטיפול במאפיינים מותאמים.

משאבים