💡 Tam çalışan örnek GitHub’da mevcuttur:
metadata-diff-doc-versions-using-groupdocs-metadata-nodejs
Giriş
Meta veri karşılaştırması, belge sürümleri arasındaki gizli değişiklikleri ortaya çıkaran bir GroupDocs.Metadata yeteneğidir ve denetçilerin kimliği hızlı bir şekilde 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şturulma tarihini iddia ediyordu, ancak gizli yazar alanları farklıydı ve manuel denetim saatler alacaktı.
Gizli meta verilerin hukuk ekipleri için önemi
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.
GroupDocs.Metadata ile çözümümüz
GroupDocs.Metadata for Node.js, her desteklenen özelliği çıkaran, iki revizyonu karşılaştıran ve yapılandırılmış diff raporları üreten tek bir API sağlar. 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 oluşturmanıza gerek kalmaz.
Adım 1 – Bir belgeden tüm meta verileri çekme
Aşağıdaki yardımcı, bir dosyayı açar, tam ö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.
/** Bir dosyadan tüm meta verileri çıkar */
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;
}
Performans notu: 5 MB bir DOCX dosyasından meta veri çıkarmak tipik bir 2 GHz CPU Docs üzerinde 200 ms’nin altında tamamlanır.
Adım 2 – İki revizyon arasındaki farkları bulma
Her iki sürüm de düz nesneler olarak temsil edildiğinde, diff rutini üç kutu oluşturur—eklenen, kaldırılan ve değiştirilen—ve kullanışlı bir totalChanges alıcısı sağlar.
/** İki meta veri haritasını karşılaştır */
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;
},
};
}
Adım 3 – Sahiplik ve revizyon içgörüleri (isteğe bağlı)
Sahiplik değişikliklerini tespit etme
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 varyasyonu işaretler.
/** Sahiplik değişikliği tespiti */
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;
}
Revizyon geçmişi değişikliklerini tespit etme
Revizyon numarası, toplam düzenleme süresi ve son‑yazdırma zaman damgaları gizli etkinliği ortaya çıkar.
/** Revizyon geçmişi değişikliği tespiti */
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;
}
Adım 4 – Denetim raporlarını dışa aktarma
CSV dışa aktarımı
CSV formatı Excel veya SIEM alımları için idealdir. Alanlar virgül ve yeni satırları işlemek için kaçış yapılır.
/** Farkı CSV'ye dışa aktar */
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 dışa aktarımı
JSON, programatik tüketim için hiyerarşik yapıyı korur.
/** Farkı JSON'a dışa aktar */
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');
}
Tam sürücü betiği
Betik 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(`Toplam meta veri değişiklikleri: ${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.
Bir belgenin iki sürümü arasındaki meta verileri nasıl karşılaştırabilirim?
Meta verileri 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 üç koleksiyonun yanı sıra bir totalChanges sayacı döndürür. Bu, GroupDocs.Metadata (DOCX, PDF, XLSX, PPTX vb.) tarafından desteklenen herhangi bir format için ç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.
İş etkisi
| Metrik | Manuel süreç | GroupDocs.Metadata ile otomatik |
|---|---|---|
| Belge başına zaman | ~45 dak (manuel inceleme) | <30 sn (meta veri diff) |
| Hata oranı | ~%3 kaçırılan değişiklik | 0 % – her özellik incelenir |
| İş hacmi | 20 belge/gün gözlemci başına | 1 000 + belge/gün mütevazı bir VM’de |
| Denetim izi | El yazısı notlar | Yapılandırılmış CSV/JSON günlükleri |
| Maliyet | $X / saat × N gözlemci | Sabit 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.
Ortamınızda nasıl başlayabilirsiniz
- Ücretsiz deneyin – geçici 30‑günlük lisansı buradan alın.
- SDK’yı kurun –
npm install @groupdocs/groupdocs.metadata. - Örneği çalıştırın – GitHub deposunu klonlayın ve
node index.jskomutunu çalıştırın. - Daha fazlasını keşfedin – gelişmiş filtreler ve özel özellik işleme için tam API referansına bakın.