💡 Contoh kerja penuh tersedia di GitHub:
metadata-diff-doc-versions-using-groupdocs-metadata-nodejs
Pendahuluan
Perbandingan metadata adalah kemampuan GroupDocs.Metadata yang mengungkap perubahan tersembunyi antara versi dokumen, memungkinkan auditor memverifikasi keaslian dengan cepat. Ketika tim hukum perlu membuktikan bahwa sebuah kontrak tidak diubah, properti tak terlihat—penulis, editor, cap waktu revisi—seringkali menceritakan kisah sebenarnya.
Saya menemui masalah ini saat meninjau sekumpulan perjanjian pemasok; setiap file mengklaim tanggal pembuatan yang sama, tetapi bidang penulis tersembunyi berbeda, dan audit manual akan memakan berjam‑jam.
Mengapa metadata tersembunyi penting bagi tim hukum
Profesional hukum dan kepatuhan mengandalkan bukti yang tidak dapat diubah. Bahkan jika teks yang terlihat tetap sama, perubahan pada bidang Creator atau LastPrinted dapat menunjukkan penyuntingan yang tidak sah. Mendeteksi pergeseran ini lebih awal mencegah sengketa mahal dan memenuhi jejak audit regulatori.
Solusi kami dengan GroupDocs.Metadata
GroupDocs.Metadata untuk Node.js menyediakan satu API yang mengekstrak setiap properti yang didukung, membandingkan dua revisi, dan menghasilkan laporan diff terstruktur. SDK menangani DOCX, PDF, XLSX, dan banyak format lain secara langsung, sehingga Anda tidak memerlukan parser khusus untuk setiap tipe file.
Langkah 1 – Mengambil semua metadata dari dokumen
Helper di bawah ini membuka file, menelusuri seluruh pohon properti, dan mengembalikan peta JavaScript sederhana berupa nama properti → nilai. Ia menggunakan AnySpecification untuk menangkap bidang bawaan maupun kustom.
/** 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;
}
Catatan kinerja: mengekstrak metadata dari DOCX 5 MB selesai dalam kurang dari 200 ms pada CPU 2 GHz tipikal Docs.
Langkah 2 – Menemukan perbedaan antara dua revisi
Dengan kedua versi direpresentasikan sebagai objek sederhana, rutin diff membangun tiga keranjang—added, removed, dan changed—serta menyediakan getter totalChanges yang praktis.
/** 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;
},
};
}
Langkah 3 – Wawasan kepemilikan dan revisi (opsional)
Mendeteksi perubahan kepemilikan
Auditor hukum sering fokus pada siapa yang membuat atau mengedit dokumen. Helper ini mengisolasi bidang‑bidang tersebut dan menandai setiap variasi.
/** 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;
}
Mendeteksi perubahan riwayat revisi
Nomor revisi, total waktu penyuntingan, dan cap waktu terakhir dicetak mengungkap aktivitas tersembunyi.
/** 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;
}
Langkah 4 – Mengekspor laporan audit
Ekspor CSV
Format CSV ideal untuk Excel atau ingest SIEM. Kolom di‑escape untuk menangani koma dan baris baru.
/** 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');
}
Ekspor JSON
JSON mempertahankan struktur hierarkis untuk konsumsi programatik.
/** 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');
}
Skrip driver lengkap
Skrip ini mengikat semuanya, mencetak ringkasan cepat, dan menulis laporan CSV serta 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'));
Menjalankan node index.js membuat metadata-diff.csv dan metadata-diff.json di root proyek.
Bagaimana cara membandingkan metadata antara dua versi dokumen?
Anda membandingkan metadata dengan memuat setiap revisi menggunakan kelas Metadata, mengekstrak peta datar nama‑ke‑nilai melalui extractAllMetadata, dan memberi dua peta tersebut ke compareMetadataSets. Fungsi ini mengembalikan tiga koleksi—added, removed, dan changed—serta penghitung totalChanges. Ini bekerja untuk format apa pun yang didukung oleh GroupDocs.Metadata (DOCX, PDF, XLSX, PPTX, dll.) dan selesai jauh di bawah satu detik untuk file kantor tipikal, menjadikannya cocok untuk pemrosesan batch atau integrasi CI.
Dampak bisnis
| Metric | Manual process | Automated with GroupDocs.Metadata |
|---|---|---|
| Time per document | ~45 min (manual review) | <30 s (metadata diff) |
| Error rate | ~3 % missed changes | 0 % – every property is examined |
| Throughput | 20 docs/day per reviewer | 1 000 + docs/day on a modest VM |
| Audit trail | Hand‑written notes | Structured CSV/JSON logs |
| Cost | $X / hour × N reviewers | Flat license, unlimited runs |
Otomatisasi memotong waktu review lebih dari 99 %, menghilangkan kesalahan manusia, dan menyediakan jejak audit yang dapat dibaca mesin yang terintegrasi langsung dengan dasbor kepatuhan.
Memulai di lingkungan Anda
- Coba gratis – dapatkan lisensi sementara 30‑hari di sini.
- Instal SDK –
npm install @groupdocs/groupdocs.metadata. - Jalankan contoh – kloning repositori GitHub dan jalankan
node index.js. - Jelajahi lebih lanjut – lihat referensi API lengkap untuk filter lanjutan dan penanganan properti khusus.