💡 Tam çalışan örnek GitHub’da mevcuttur:
metadata-diff-doc-versions-using-groupdocs-metadata-nodejs

Introduction

Metadata karşılaştırması, belge sürümleri arasındaki gizli değişiklikleri ortaya çıkaran bir GroupDocs.Metadata özelliğidir ve denetçilerin özgünlüğü hızlıca doğrulamasını sağlar. Hukuk ekiplerinin bir sözleşmenin değiştirilmediğini kanıtlaması gerektiğinde, yazar, düzenleyici, revizyon zaman damgaları gibi görünmez özellikler genellikle gerçek hikâyeyi anlatır.

Bu sorunu, tedarikçi anlaşmalarının bir partisini incelerken fark ettim; her dosya aynı oluşturma tarihini gösteriyordu, ancak gizli yazar alanları farklıydı ve manuel denetim saatler alacaktı.

Hukuk ve uyumluluk profesyonelleri değiştirilemez kanıtlara dayanır. Görünür metin aynı kalsa bile Creator veya LastPrinted alanındaki bir değişiklik yetkisiz düzenlemeleri gösterebilir. Bu kaymaları erken tespit etmek maliyetli anlaşmazlıkları önler ve düzenleyici denetim izlerini karşılar.

Our solution with GroupDocs.Metadata

GroupDocs.Metadata for Node.js, desteklenen tüm özellikleri çıkaran, iki revizyonu karşılaştıran ve yapılandırılmış diff raporları üreten tek bir API sunar. SDK, DOCX, PDF, XLSX ve birçok diğer formatı kutudan çıkar çıkmaz destekler; böylece her dosya türü için özel ayrıştırıcılar yazmanıza gerek kalmaz.

Step 1 – Pulling all metadata from a document

Aşağıdaki yardımcı, bir dosyayı açar, tüm özellik ağacını dolaşır ve özellik adı → değer şeklinde düz bir JavaScript haritası döndürür. Hem yerleşik hem de özel alanları yakalamak için AnySpecification kullanır.

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

Performance note: extracting metadata from a 5 MB DOCX completes in under 200 ms on a typical 2 GHz CPU Docs.

Step 2 – Spotting differences between two revisions

Her iki sürüm de düz nesneler olarak temsil edildiğinde, diff rutini üç kova oluşturur—added, removed ve changed—ve kullanışlı bir totalChanges alıcısı sağlar.

/** 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;
    },
  };
}

Step 3 – Ownership and revision insights (optional)

Detecting ownership changes

Hukuk denetçileri genellikle bir belgenin kim tarafından oluşturulduğu veya düzenlendiğine odaklanır. Bu yardımcı, bu alanları izole eder ve herhangi bir farklılığı işaretler.

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

Detecting revision‑history changes

Revizyon numarası, toplam düzenleme süresi ve son‑yazdırma zaman damgaları gizli etkinliği ortaya çıkarır.

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

Step 4 – Exporting audit reports

CSV export

CSV formatı, Excel veya SIEM entegrasyonu için idealdir. Alanlar, virgül ve yeni satır karakterlerini işlemek üzere kaçış yapılır.

/** 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 export

JSON, hiyerarşik yapıyı programatik tüketim için korur.

/** 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');
}

Full driver script

Script, tüm adımları birleştirir, hızlı bir özet yazdırır ve hem CSV hem de JSON raporlarını yazar.

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 komutunu çalıştırmak, proje kökünde metadata-diff.csv ve metadata-diff.json dosyalarını oluşturur.

How can I compare metadata between two versions of a document?

Metadata’yı karşılaştırmak için her revizyonu Metadata sınıfı ile yükler, extractAllMetadata ile düz bir ad‑değer haritası çıkarır ve iki haritayı compareMetadataSets fonksiyonuna beslersiniz. Fonksiyon, eklenen, kaldırılan ve değiştirilen üç koleksiyon ile bir totalChanges sayacı döndürür. Bu, GroupDocs.Metadata tarafından desteklenen (DOCX, PDF, XLSX, PPTX vb.) herhangi bir format için çalışır ve tipik ofis dosyalarında bir saniyeden çok daha kısa sürede tamamlanır; bu da toplu işleme veya CI entegrasyonuna uygundur.

Business impact

Metric Manual process Automated with GroupDocs.Metadata
Time per document ~45 min (manuel inceleme) <30 s (metadata farkı)
Error rate ~%3 kaçırılan değişiklik %0 – her özellik incelenir
Throughput Günde 20 doküman/denetçi Günde 1 000 + doküman modest bir VM’de
Audit trail El yazısı notlar Yapılandırılmış CSV/JSON günlükleri
Cost $X / saat × N denetçi Tek lisans, sınırsız çalıştırma

Otomasyon, inceleme süresini %99’dan fazla azaltır, insan hatasını ortadan kaldırır ve uyumluluk panolarına doğrudan entegre olabilen makine‑okunur bir denetim izi sağlar.

Getting started in your environment

  1. Ücretsiz deneyin – geçici 30‑günlük lisansı burada alın.
  2. SDK’yı kurunnpm install @groupdocs/groupdocs.metadata.
  3. Örneği çalıştırın – GitHub deposunu klonlayın ve node index.js komutunu yürütün.
  4. Daha fazlasını keşfedin – gelişmiş filtreler ve özel özellik işleme için tam API referansına bakın.

Resources