💡 ตัวอย่างการทำงานเต็มที่มีบน GitHub:
metadata-diff-doc-versions-using-groupdocs-metadata-nodejs
บทนำ
การเปรียบเทียบ metadata เป็นความสามารถของ GroupDocs.Metadata ที่เปิดเผยการเปลี่ยนแปลงที่ซ่อนอยู่ระหว่างเวอร์ชันของเอกสาร ทำให้ผู้ตรวจสอบสามารถตรวจสอบความถูกต้องได้อย่างรวดเร็ว เมื่อทีมกฎหมายต้องพิสูจน์ว่าสัญญาไม่ได้ถูกดัดแปลง คุณสมบัติที่มองไม่เห็น—เช่น ผู้สร้าง, ผู้แก้ไข, เวลาประทับการแก้ไข—มักบอกเล่าเรื่องราวที่แท้จริง
ฉันเจอปัญหานี้ขณะตรวจสอบชุดสัญญาซัพพลายเออร์; แต่ละไฟล์อ้างว่าเป็นวันที่สร้างเดียวกัน แต่ฟิลด์ผู้เขียนที่ซ่อนอยู่ต่างกัน และการตรวจสอบด้วยมือจะใช้เวลาหลายชั่วโมง
Why hidden metadata matters for legal teams
ผู้เชี่ยวชาญด้านกฎหมายและการปฏิบัติตามต้องพึ่งพาหลักฐานที่ไม่สามารถเปลี่ยนแปลงได้ แม้ข้อความที่มองเห็นจะเหมือนเดิม การเปลี่ยนแปลงในฟิลด์ Creator หรือ LastPrinted สามารถบ่งบอกการแก้ไขโดยไม่ได้รับอนุญาต การตรวจจับการเปลี่ยนแปลงเหล่านี้ตั้งแต่เนิ่นๆ จะช่วยป้องกันข้อพิพาทที่มีค่าใช้จ่ายสูงและตอบสนองเส้นทางการตรวจสอบตามกฎระเบียบ
โซลูชันของเราด้วย GroupDocs.Metadata
GroupDocs.Metadata สำหรับ Node.js ให้ API เดียวที่สกัดทุกคุณสมบัติที่รองรับ, เปรียบเทียบสองรุ่น, และสร้างรายงาน diff ที่มีโครงสร้าง SDK รองรับ DOCX, PDF, XLSX และรูปแบบอื่น ๆ มากมายโดยไม่ต้องเขียน parser เองสำหรับแต่ละประเภทไฟล์
Step 1 – Pulling all metadata from a document
ตัวช่วยด้านล่างเปิดไฟล์, เดินผ่านต้นไม้ของคุณสมบัติทั้งหมด, และคืนค่าแผนที่ JavaScript ธรรมดาแบบ property name → value มันใช้ AnySpecification เพื่อดึงข้อมูลทั้งฟิลด์ที่มาพร้อมและฟิลด์ที่กำหนดเอง
/** 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: การสกัด metadata จาก DOCX ขนาด 5 MB เสร็จในเวลาน้อยกว่า 200 ms บน CPU 2 GHz ปกติ Docs.
ขั้นตอน 2 – การตรวจจับความแตกต่างระหว่างสองรุ่น
/** 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;
},
};
}
ขั้นตอน 3 – ความเข้าใจเกี่ยวกับความเป็นเจ้าของและประวัติการแก้ไข (ไม่บังคับ)
การตรวจจับการเปลี่ยนแปลงความเป็นเจ้าของ
ผู้ตรวจสอบกฎหมายมักให้ความสำคัญกับผู้สร้างหรือผู้แก้ไขเอกสาร ตัวช่วยนี้แยกฟิลด์เหล่านั้นและทำเครื่องหมายเมื่อมีความแตกต่าง
/** 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;
}
การตรวจจับการเปลี่ยนแปลงประวัติการแก้ไข
หมายเลขรุ่น, เวลาการแก้ไขรวม, และเวลาประทับการพิมพ์ครั้งสุดท้ายเปิดเผยกิจกรรมที่ซ่อนอยู่
/** 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;
}
ขั้นตอน 4 – การส่งออกรายงานการตรวจสอบ
การส่งออก CSV
รูปแบบ CSV เหมาะสำหรับ Excel หรือการนำเข้าข้อมูลใน SIEM ฟิลด์ทั้งหมดจะถูก escape เพื่อรองรับเครื่องหมายคอมม่าและบรรทัดใหม่
/** 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
JSON รักษาโครงสร้างแบบลำดับชั้นสำหรับการใช้งานโปรแกรม
/** 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');
}
สคริปต์ไดรเวอร์เต็ม
สคริปต์นี้เชื่อมทุกอย่างเข้าด้วยกัน, พิมพ์สรุปสั้น ๆ, และเขียนรายงาน CSV และ 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'));
การรัน node index.js จะสร้างไฟล์ metadata-diff.csv และ metadata-diff.json ที่โฟลเดอร์รากของโปรเจกต์
ฉันจะเปรียบเทียบ metadata ระหว่างสองเวอร์ชันของเอกสารได้อย่างไร?
คุณเปรียบเทียบ metadata โดยโหลดแต่ละรุ่นด้วยคลาส Metadata, สกัดแผนที่ชื่อ‑ค่าแบนผ่าน extractAllMetadata, แล้วส่งแผนที่สองชุดเข้าไปใน compareMetadataSets ฟังก์ชันจะคืนค่าสามคอลเลกชัน—added, removed, changed—พร้อมตัวนับ totalChanges ทำงานได้กับทุกฟอร์แมตที่ GroupDocs.Metadata รองรับ (DOCX, PDF, XLSX, PPTX ฯลฯ) และเสร็จภายในเวลาน้อยกว่าวินาทีสำหรับไฟล์สำนักงานทั่วไป ทำให้เหมาะกับการประมวลผลเป็นชุดหรือการรวมเข้ากับ CI
ผลกระทบทางธุรกิจ
| 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 |
การอัตโนมัติเช่นนี้ลดเวลาการตรวจสอบลงกว่า 99 %, กำจัดข้อผิดพลาดของมนุษย์, และให้เส้นทางการตรวจสอบที่เครื่องอ่านได้ซึ่งสามารถเชื่อมต่อโดยตรงกับแดชบอร์ดการปฏิบัติตาม
เริ่มต้นใช้งานในสภาพแวดล้อมของคุณ
- Try it free – รับใบอนุญาตชั่วคราว 30‑วัน here
- Install the SDK –
npm install @groupdocs/groupdocs.metadata - Run the sample – คัดลอกรีโปจาก GitHub แล้วรัน
node index.js - Explore more – ดูเอกสาร API เต็มรูปแบบสำหรับฟิลเตอร์ขั้นสูงและการจัดการคุณสมบัติที่กำหนดเอง