💡 Plně funkční příklad je k dispozici na GitHubu:
remove-pii-from-office-metadata-java

The Compliance Challenge: Why Manual Metadata Review Breaks at Scale

Tým pro správu záznamů odesílá 200 dokumentů externímu auditorovi. Někdo si přečetl každou stránku. Nikdo si neprohlédl vlastnosti, a právě ve vlastnostech leží osobní data: analytik v Author, druhý analytik v LastSavedBy, vedoucí oddělení v Manager, dceřiná společnost v Company, časové razítko LastPrinted z noci před termínem a u všeho, co prošlo SharePointem, ID schvalujícího a cesta pracovního postupu.

Sanitizace metadat je workflow GroupDocs.Metadata pro Javu, které odstraňuje tyto identifikující vlastnosti z Word, Excel a PowerPoint souborů a poté výsledek načte zpět, aby nahlásilo, co přežilo. Tento článek provádí krok za krokem workflow, jak by jej postavila compliance tým: jaké skupiny vlastností existují, které pravidlo odstranění k nim patří, kdy úplné vymazání nahradí cílené průchody a proč by měla verifikace patřit do stejného úkolu místo kontrolního seznamu.

Problém měřítka není v tom, že je odstranění obtížné. Je v tom, že manuální revize nevytváří záznam. Auditor, který se ptá „která pole byla z tohoto souboru odstraněna a kdy“, potřebuje číslo, a dialog vlastností žádné neposkytuje.

Why Generic Cleanup Tools Don’t Work Here

Dialog vlastností Windows upravuje jeden soubor najednou a dosahuje jen podmnožiny polí. Office Document Inspector běží interaktivně, což jej vylučuje z nočního úkolu. Oba ponechávají vlastní OOXML části nedotčené a žádný z nich neukládá něco, co by pipeline mohla zpětně načíst.

Týmy, které jdou o úroveň níž a upravují přímo docProps/core.xml a docProps/custom.xml, přebírají údržbové břemeno: XPath výraz na každé pole, pro každý formát, který se musí znovu projít, kdykoli produkční aplikace změní název. Tato práce také špatně řeší otázku klasifikace. Názvy vlastností se liší napříč balíčky, takže seznam názvů tiše zastarává a pravidlo, které už neodpovídá, vypadá stejně jako soubor, který byl již čistý.

The Solution: GroupDocs.Metadata in a Records Workflow

GroupDocs.Metadata pro Javu spouští vše přes jeden vyhledávač vlastností. Objekt Specification rozhoduje, které vlastnosti odpovídají, removeProperties každou shodu smaže a vrátí počet ovlivněných položek a findProperties spouští stejný predikát jen pro čtení. Vlastnosti nesou tagy, takže Tags.getPerson().getCreator() identifikuje pole typu autor bez ohledu na formát nebo balíček, ze kterého pocházejí.

Java nemá lambda přetížení pro removeProperties, což se zde ukazuje jako výhoda: každé pravidlo je objekt a objekty jsou znovupoužitelné. Stejná instance specifikace, která vyčistí skupinu, může být předána do verifikačního skenu, takže kontrola nemůže odklouznout od čištění, které má testovat.

Implementing the Sanitization Pipeline Step by Step

Step 1 - Clear the identity group by tag

Čtyři specifikace tagů spojené pomocí .or(...) pokrývají tvůrce, editora, manažera a společnost. Nic jiného se nepřesouvá, takže Title, Subject a Keywords zůstávají dostupné pro index záznamů.

try (Metadata metadata = new Metadata(inputPath)) {
    if (metadata.getFileFormat() == FileFormat.Unknown) return 0;
    int affected = metadata.removeProperties(
            new ContainsTagSpecification(Tags.getPerson().getCreator())
                .or(new ContainsTagSpecification(Tags.getPerson().getEditor()))
                .or(new ContainsTagSpecification(Tags.getPerson().getManager()))
                .or(new ContainsTagSpecification(Tags.getCorporate().getCompany())));
    metadata.save(outputPath);
    return affected;
}

Ochrana FileFormat.Unknown má větší význam, než se na první pohled zdá. Bez ní nečitelné soubory vrátí nulu odstranění, což volající nemůže odlišit od dokumentu, který byl při přijetí již čistý.

Step 2 - Clear field families by name

Vlákna komentářů, počítadla revizí a serverová pole nemají žádný tag, takže jsou spárována podle názvu. Malá podtřída Specification přijímá seznam podřetězců (varargs), což umožňuje jedné třídě sloužit třem průchodům:

public class NameContainsSpec extends Specification {
    private final String[] needles;

    public NameContainsSpec(String... needles) {
        this.needles = needles;
    }

    @Override
    public boolean isSatisfiedBy(MetadataProperty candidate) {
        String name = candidate.getName();
        if (name == null) return false;
        for (String n : needles) {
            if (name.contains(n)) return true;
        }
        return false;
    }
}

Časová osa úprav je pro skupinové compliance týmy nejdůležitější, protože počet revizí a datum posledního tisku popisují, jak byl dokument vytvořen:

try (Metadata metadata = new Metadata(inputPath)) {
    if (metadata.getFileFormat() == FileFormat.Unknown) return 0;
    int affected = metadata.removeProperties(new NameContainsSpec(
            "Revision", "TrackedChange", "LastPrinted", "TotalEditingTime", "EditTime"));
    metadata.save(outputPath);
    return affected;
}

Průchod pro komentáře a průchod pro SharePoint jsou stejná volání s různými seznamy podřetězců: Comment, Reviewer, Reviewed pro stopy recenzí a Server, Workflow, Approver, ContentType, Template pro pole serveru dokumentu.

Step 3 - Wipe at the boundary

Když soubor opustí organizaci, selektivita přestává mít cenu. Jedno volání vymaže každý balíček metadat, který knihovna detekuje, včetně vlastních OOXML částí, na které žádný cílený predikát nehlédá:

try (Metadata metadata = new Metadata(inputPath)) {
    if (metadata.getFileFormat() == FileFormat.Unknown) return 0;
    int affected = metadata.sanitize();
    metadata.save(outputPath);
    return affected;
}

Step 4 - Verify and classify what is left

Sken provádí sjednocení všech pravidel přes findProperties a třídí výsledky do dvou seznamů. Prázdné hodnoty a nulové počítadla se přeskočí a položky, jejichž názvy začínají na Comment, Revision nebo Inspection, jsou obaly nad obsahem těla místo metadat:

String value = "";
if (p.getValue() != null && p.getValue().getRawValue() != null) {
    value = String.valueOf(p.getValue().getRawValue());
}
if (value.isEmpty() || value.equals("0") || value.equals("0.0")) continue;
String entry = p.getName() + "=" + value;
String name = p.getName() == null ? "" : p.getName();
if (name.startsWith("Comment") || name.startsWith("Revision")
        || name.startsWith("Inspection")) {
    report.contentLevelLeaks.add(entry);
} else {
    report.metadataLeaks.add(entry);
}

Rozdělení je to, co udržuje signál průchodu/neúspěchu poctivý. Úniky metadat musí být prázdné. Úniky na úrovni obsahu zůstávají informativní, protože komentáře Wordu a autoři sledovaných změn žijí uvnitř word/document.xml a knihovna metadat je hlásí, aniž by je upravovala; jejich odstranění vyžaduje knihovnu pro úpravu obsahu, jako je Aspose.Words.

When is a targeted pass better than a full sanitize?

Vždy, když dokument stále provádí práci. Soubor cirkulující mezi recenzenty potřebuje Title, Subject a Keywords pro vyhledávání a klasifikaci záznamů, a sanitize() je všechny tři odstraní. Spusťte průchody identity a komentářů během spolupráce, zachovejte popisná pole a úplné vymazání nechte na okamžik, kdy soubor překročí hranici k externí straně.

Real Workflow: An Export Job for an External Auditor

Představte si noční úkol. Načte seznam ID dokumentů, zkopíruje každý soubor do staging cesty, aplikuje průchod identity a průchod serveru, zavolá sanitize() na vše, co je označeno jako opouštějící organizaci, a pak spustí kontrolu úniku proti uložené kopii. Každý krok přispívá svým počtem ovlivněných položek do jednoho řádku logu na soubor a ne‑prázdný seznam úniků metadat způsobí selhání úkolu místo zaznamenání varování.

Jednou jsem strávil odpoledne verzí tohoto úkolu, která hlásila nulu odstranění u 40 souborů a vypadala jako čistá dávka. Vstupní složka obsahovala staré binární .doc soubory, ochrana formátu vracela okamžitě u každého z nich a v logu se neodlišovalo „nic k odstranění“ od „nic nebylo načteno“. Zaznamenání formátu vedle počtu to opravilo.

Business Impact: What This Changes

Aspekt Manuální revize GroupDocs.Metadata pipeline
Pokrytí pole viditelná v dialogu vlastností každý balíček, který knihovna detekuje, včetně vlastních OOXML částí
Záznam práce poznámky, pokud je někdo napsal počet ovlivněných položek za soubor a za skupinu vlastností
Opakovatelnost závisí na tom, kdo to provedl jedna specifikace na pravidlo, aplikovaná identicky na každý soubor
Verifikace znovu otevřít soubor a podívat se scan findProperties s dvoucestnou klasifikací
Měřítko jeden soubor najednou stejných šest operací běží v cyklu nad složkou exportu

Other Scenarios Where GroupDocs.Metadata Fits

Stejný motor vlastností čte i odstraňuje. Porovnání metadat mezi dvěma verzemi dokumentu ukazuje, co se změnilo během editace, což je užitečné při sporech o vlastnictví a při hledání souboru, který byl přepsán mimo proces. Práce s metadata tags místo názvů je to, co dělá oba případy přenositelné napříč formáty DOCX, XLSX, PPTX, PDF a obrázky.

Getting Started with GroupDocs.Metadata for Java

Přidejte GroupDocs Java repozitář do pom.xml a závislost na com.groupdocs:groupdocs-metadata. Knihovna běží v evaluačním režimu bez licence, což stačí k provedení všech šesti operací na ukázkovém DOCX a k zobrazení počtů. Začněte s průchodem identity, přidejte průchody pro rodiny polí podle toho, co vaše zdroje dokumentů vyžadují, a zapojte kontrolu úniku dříve, než se kterýkoli z nich dostane do produkce.

Resources