💡 ตัวอย่างการทำงานเต็มที่มีบน GitHub:
metadata-diff-doc-versions-using-groupdocs-metadata-nodejs

บทนำ

การเปรียบเทียบ metadata เป็นความสามารถของ GroupDocs.Metadata ที่เปิดเผยการเปลี่ยนแปลงที่ซ่อนอยู่ระหว่างเวอร์ชันของเอกสาร ทำให้ผู้ตรวจสอบสามารถตรวจสอบความถูกต้องได้อย่างรวดเร็ว เมื่อทีมกฎหมายต้องพิสูจน์ว่าสัญญาไม่ได้ถูกดัดแปลง คุณสมบัติที่มองไม่เห็น—เช่น ผู้สร้าง, ผู้แก้ไข, เวลาประทับการแก้ไข—มักบอกเล่าเรื่องราวที่แท้จริง

ฉันเจอปัญหานี้ขณะตรวจสอบชุดสัญญาซัพพลายเออร์; แต่ละไฟล์อ้างว่าเป็นวันที่สร้างเดียวกัน แต่ฟิลด์ผู้เขียนที่ซ่อนอยู่ต่างกัน และการตรวจสอบด้วยมือจะใช้เวลาหลายชั่วโมง

ผู้เชี่ยวชาญด้านกฎหมายและการปฏิบัติตามต้องพึ่งพาหลักฐานที่ไม่สามารถเปลี่ยนแปลงได้ แม้ข้อความที่มองเห็นจะเหมือนเดิม การเปลี่ยนแปลงในฟิลด์ 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 %, กำจัดข้อผิดพลาดของมนุษย์, และให้เส้นทางการตรวจสอบที่เครื่องอ่านได้ซึ่งสามารถเชื่อมต่อโดยตรงกับแดชบอร์ดการปฏิบัติตาม

เริ่มต้นใช้งานในสภาพแวดล้อมของคุณ

  1. Try it free – รับใบอนุญาตชั่วคราว 30‑วัน here
  2. Install the SDKnpm install @groupdocs/groupdocs.metadata
  3. Run the sample – คัดลอกรีโปจาก GitHub แล้วรัน node index.js
  4. Explore more – ดูเอกสาร API เต็มรูปแบบสำหรับฟิลเตอร์ขั้นสูงและการจัดการคุณสมบัติที่กำหนดเอง

แหล่งข้อมูล