💡 Ví dụ hoạt động đầy đủ có sẵn trên GitHub:
metadata-diff-doc-versions-using-groupdocs-metadata-nodejs
Introduction
So sánh siêu dữ liệu là một khả năng của GroupDocs.Metadata giúp phát hiện các thay đổi ẩn giữa các phiên bản tài liệu, cho phép các kiểm toán viên xác minh tính xác thực một cách nhanh chóng. Khi các đội pháp lý cần chứng minh rằng một hợp đồng không bị can thiệp, các thuộc tính vô hình—tác giả, người chỉnh sửa, thời gian sửa đổi—thường nói lên câu chuyện thực tế.
Tôi đã gặp vấn đề này khi rà soát một loạt hợp đồng nhà cung cấp; mỗi tệp đều khẳng định cùng ngày tạo, nhưng các trường tác giả ẩn lại khác nhau, và việc kiểm toán thủ công sẽ mất hàng giờ.
Why hidden metadata matters for legal teams
Các chuyên gia pháp lý và tuân thủ dựa vào bằng chứng không thể thay đổi. Ngay cả khi nội dung hiển thị vẫn giống nhau, một thay đổi trong trường Creator hoặc LastPrinted cũng có thể chỉ ra các chỉnh sửa trái phép. Phát hiện những thay đổi này sớm giúp ngăn ngừa tranh chấp tốn kém và đáp ứng các yêu cầu kiểm toán theo quy định.
Our solution with GroupDocs.Metadata
GroupDocs.Metadata cho Node.js cung cấp một API duy nhất để trích xuất mọi thuộc tính được hỗ trợ, so sánh hai phiên bản và tạo ra các báo cáo diff có cấu trúc. SDK xử lý DOCX, PDF, XLSX và nhiều định dạng khác ngay từ đầu, vì vậy bạn không cần viết bộ phân tích riêng cho từng loại tệp.
Step 1 – Pulling all metadata from a document
Trợ giúp dưới đây mở một tệp, duyệt toàn bộ cây thuộc tính và trả về một bản đồ JavaScript đơn giản dạng tên thuộc tính → giá trị. Nó sử dụng AnySpecification để nắm bắt cả các trường tích hợp và tùy chỉnh.
/** 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: việc trích xuất siêu dữ liệu từ một tệp DOCX 5 MB hoàn thành trong vòng 200 ms trên một CPU 2 GHz tiêu chuẩn Docs.
Step 2 – Spotting differences between two revisions
/** 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
Các kiểm toán viên pháp lý thường tập trung vào người tạo hoặc người chỉnh sửa tài liệu. Trợ giúp này tách riêng các trường đó và đánh dấu bất kỳ sự khác biệt nào.
/** 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
Số phiên bản, tổng thời gian chỉnh sửa và dấu thời gian last‑printed tiết lộ hoạt động ẩn.
/** 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
Định dạng CSV lý tưởng cho Excel hoặc việc nhập vào SIEM. Các trường được escape để xử lý dấu phẩy và xuống dòng.
/** 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 giữ nguyên cấu trúc phân cấp cho việc tiêu thụ bằng chương trình.
/** 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 này kết nối mọi thành phần, in ra tóm tắt nhanh và ghi cả báo cáo CSV và 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'));
Chạy node index.js sẽ tạo ra metadata-diff.csv và metadata-diff.json trong thư mục gốc của dự án.
How can I compare metadata between two versions of a document?
Bạn so sánh siêu dữ liệu bằng cách tải mỗi phiên bản bằng lớp Metadata, trích xuất bản đồ phẳng tên → giá trị qua extractAllMetadata, và đưa hai bản đồ này vào compareMetadataSets. Hàm trả về ba bộ sưu tập—added, removed, và changed—cùng với bộ đếm totalChanges. Cách này hoạt động với bất kỳ định dạng nào được GroupDocs.Metadata hỗ trợ (DOCX, PDF, XLSX, PPTX, v.v.) và hoàn thành trong thời gian dưới một giây cho các tệp văn phòng thông thường, phù hợp cho xử lý hàng loạt hoặc tích hợp CI.
Business impact
| Metric | Manual process | Automated with GroupDocs.Metadata |
|---|---|---|
| Time per document | ~45 phút (kiểm tra thủ công) | <30 giây (diff siêu dữ liệu) |
| Error rate | ~3 % thay đổi bị bỏ lỡ | 0 % – mọi thuộc tính đều được kiểm tra |
| Throughput | 20 tài liệu/ngày mỗi người kiểm tra | >1 000 tài liệu/ngày trên một VM vừa phải |
| Audit trail | Ghi chú viết tay | Nhật ký CSV/JSON có cấu trúc |
| Cost | $X / giờ × N reviewer | Giấy phép cố định, chạy không giới hạn |
Tự động hoá giảm thời gian rà soát hơn 99 %, loại bỏ lỗi con người và cung cấp một chuỗi kiểm toán máy có thể đọc được, tích hợp trực tiếp vào các bảng điều khiển tuân thủ.
Getting started in your environment
- Try it free – nhận giấy phép tạm thời 30 ngày tại đây.
- Install the SDK –
npm install @groupdocs/groupdocs.metadata. - Run the sample – sao chép repo GitHub và thực thi
node index.js. - Explore more – xem toàn bộ tài liệu API để biết các bộ lọc nâng cao và xử lý thuộc tính tùy chỉnh.