💡 Full working example available on GitHub:
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 kimliği 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 iddia ediyordu, ancak gizli yazar alanları farklıydı ve manuel denetim saatler alacaktı.
Why hidden metadata matters for legal teams
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 her özelliği çı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 işler, böylece her dosya türü için özel ayrıştırıcılar geliştirmenize gerek kalmaz.
Step 1 – Pulling all metadata from a document
Aşağıdaki yardımcı fonksiyon 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 getter’ı 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 belgenin kim tarafından oluşturulduğu veya düzenlendiğine odaklanır. Bu yardımcı fonksiyon 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
Bu script her şeyi bir araya getirir, 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 (DOCX, PDF, XLSX, PPTX vb.) tarafından desteklenen herhangi bir formatta çalışır ve tipik ofis dosyaları için bir saniyenin çok altında tamamlanır; bu da toplu işleme veya CI entegrasyonu için uygundur.
Business impact
| Metrik | Manuel süreç | GroupDocs.Metadata ile otomatik |
|---|---|---|
| Belge başına zaman | ~45 dk (manuel inceleme) | <30 s (metadata diff) |
| Hata oranı | ~%3 kaçırılan değişiklik | %0 – her özellik incelenir |
| İş hacmi | 20 doküman/gün denetçi başına | 1 000 + doküman/gün modest bir VM’de |
| Denetim izi | El yazısı notlar | Yapılandırılmış CSV/JSON logları |
| Maliyet | $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
- Try it free – geçici 30‑günlük lisansı buradan alın.
- Install the SDK –
npm install @groupdocs/groupdocs.metadata. - Run the sample – GitHub deposunu klonlayın ve
node index.jskomutunu çalıştırın. - Explore more – gelişmiş filtreler ve özel özellik işleme için tam API referansına bakın.