💡 Kompletní funkční příklad je k dispozici na GitHubu:
metadata-diff-between-docs-using-groupdocs-metadata-dotnet
Introduction
Když se během fúze smlouva mění mezi vlastníky, právní tým musí prokázat, že informace o vlastnictví dokumentu – autor, poslední editor, název společnosti – zůstaly nedotčeny. Manuální kontrola vlastností každého souboru je zdlouhavá a náchylná k chybám; jediná opomenutá změna může zneplatnit audit shody. GroupDocs.Metadata je .NET knihovna, která extrahuje a porovnává každou vloženou vlastnost dokumentu, což umožňuje automatizovanou forenzní analýzu změn mezi verzemi. Tento tutoriál ukazuje, jak detekovat výměny vlastníků, úpravy historie revizí a jakékoli jiné úpravy vlastností mezi dvěma verzemi stejného souboru a následně exportovat výsledky do CSV nebo JSON pro další reportování.
Na tento problém jsem narazil při auditu sady 1 200 smluv pro fúzi v roce 2024; audit metadat odhalil 87 neočekávaných změn vlastnictví, které by bez automatizace zůstaly neviditelné.
V následujících sekcích se naučíte:
- Extrahovat všechna metadata ze dvou dokumentů.
- Identifikovat přidané, odebrané a změněné vlastnosti.
- Soustředit se na značky související s vlastnictvím a revizemi.
- Serializovat rozdíl do CSV nebo JSON pro auditní stopy.
Why Metadata Comparison Matters
Přesné porovnání metadat je nezbytné pro:
- Legal e‑discovery: Prokázat původ dokumentu a odhalit manipulaci.
- Regulační shodu: Sledovat, kdo vytvořil nebo upravil soubor pro audity GDPR nebo SOX.
- Forenzní vyšetřování: Odhalit skryté revize nebo neautorizované úpravy.
Podle dokumentace GroupDocs.Metadata (2024) více než 30 % selhání shody pramení z nezdokumentovaných změn vlastností.
Prerequisites
- .NET 6.0 nebo novější
- GroupDocs.Metadata pro .NET 24.10+ ([temporary license][TEMP_LICENSE_URL])
- Dvě verze dokumentu (např.
contract_v1.docxacontract_v2.docx)
Instalace přes NuGet:
dotnet add package GroupDocs.Metadata
How do I compare metadata between two document versions?
Answer: Načtěte každý soubor pomocí MetadataFacade, extrahujte všechny vlastnosti do slovníků a poté iterujte pro vytvoření MetadataDiff, který kategorizuje přidané, odebrané a změněné položky. Rozdíl lze prohlížet programově nebo zapsat do CSV/JSON pro auditní reportování.
Full‑Property Diff
Následující úryvek ukazuje jádro algoritmu rozdílu. Používá pomocnou metodu ExtractAllMetadata.Run (viz níže) k načtení všech vlastností z každé verze.
// Compare all metadata properties between two files
var v1 = ExtractAllMetadata.Run(pathV1);
var v2 = ExtractAllMetadata.Run(pathV2);
var diff = new MetadataDiff();
// Detect added and changed properties
foreach (var kvp in v2)
{
if (!v1.ContainsKey(kvp.Key))
{
diff.Added[kvp.Key] = kvp.Value; // New property in v2
}
else if (v1[kvp.Key] != kvp.Value)
{
diff.Changed[kvp.Key] = (v1[kvp.Key], kvp.Value); // Value changed
}
}
// Detect removed properties
foreach (var kvp in v1)
{
if (!v2.ContainsKey(kvp.Key))
{
diff.Removed[kvp.Key] = kvp.Value; // Property missing in v2
}
}
return diff;
Key points:
MetadataDiffobsahuje tři slovníky:Added,Removed,Changed.- Algoritmus běží v čase O(n), což je vhodné i pro soubory s tisíci vlastnostmi.
- Neprovádí žádný I/O; volající si určuje, jak výsledek uložit.
Detecting Ownership Changes
Značky související s vlastnictvím (Author, LastSavedBy, Manager, Company) jsou často nejkritičtější pro právní audity. Níže uvedená metoda izoluje tyto značky a nahlásí jakékoli rozdíly.
// Get ownership‑related properties from each version
var v1Values = GetOwnershipProperties(pathV1);
var v2Values = GetOwnershipProperties(pathV2);
var changes = new Dictionary<string, (string, string)>();
var allKeys = new HashSet<string>(v1Values.Keys);
foreach (var key in v2Values.Keys) allKeys.Add(key);
foreach (var key in allKeys)
{
var oldV = v1Values.TryGetValue(key, out var o) ? o : "<missing>";
var newV = v2Values.TryGetValue(key, out var n) ? n : "<missing>";
if (oldV != newV)
{
changes[key] = (oldV, newV);
}
}
return changes;
Key points:
- Používá predikáty
Tags.Person.*aTags.Corporate.Company. - Vrací slovník, kde každá položka ukazuje starou → novou hodnotu.
- Ideální pro vytvoření stručné zprávy o změnách vlastnictví.
Helper: GetOwnershipProperties
var dict = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
using (var metadata = new MetadataFacade(path))
{
if (metadata.FileFormat == FileFormat.Unknown) return dict;
var props = metadata.FindProperties(p =>
p.Tags.Contains(Tags.Person.Creator) ||
p.Tags.Contains(Tags.Person.Editor) ||
p.Tags.Contains(Tags.Person.Manager) ||
p.Tags.Contains(Tags.Corporate.Company));
foreach (var p in props)
{
dict[p.Name] = p.InterpretedValue?.ToString() ?? p.Value?.ToString() ?? string.Empty;
}
}
return dict;
Detecting Revision History Changes
Metadata související s revizemi (RevisionNumber, TotalEditingTime, LastPrinted) odhalují, kolikrát byl dokument upravován. Následující úryvek extrahuje tyto vlastnosti a zvýrazní jakékoli odchylky.
var v1 = GetRevisionProperties(pathV1);
var v2 = GetRevisionProperties(pathV2);
var changes = new Dictionary<string, (string, string)>();
var allKeys = new HashSet<string>(v1.Keys);
foreach (var k in v2.Keys) allKeys.Add(k);
foreach (var key in allKeys)
{
var oldV = v1.TryGetValue(key, out var o) ? o : "<missing>";
var newV = v2.TryGetValue(key, out var n) ? n : "<missing>";
if (oldV != newV)
{
changes[key] = (oldV, newV);
}
}
return changes;
Key points:
- Zachycuje jak časové razítka, tak číselné počítadla revizí.
- Užitečné pro odhalení skrytých úprav, které nebyly uloženy jako samostatné verze.
Helper: GetRevisionProperties