Voll funktionsfähiges Beispiel auf GitHub verfügbar:
strip-pdf-metadata-dotnet

Einführung

Die PDF‑Metadaten‑Sanitisierung ist ein GroupDocs.Metadata‑Workflow für .NET, der das PDF‑Info‑Dictionary und XMP‑Identitätsfelder aus C#‑Diensten entfernt. Wenn ein Vertrags‑PDF ein internes Laufwerk verlässt, bleiben Autor, Ersteller, Produzent, Schlüsselwörter und XMP‑Pakete häufig erhalten. Browser‑Cleaner und ein kurzer Acrobat‑Durchlauf können erfolgreich aussehen, während XMP immer noch den ursprünglichen Autor nennt. Ich stieß auf diese Lücke, als ein „gesäubertes“ Entwurfs‑PDF nach dem Öffnen durch einen Partner immer noch Alice Example unter Autor anzeigte.

GroupDocs.Metadata für .NET bietet C#‑Diensten zwei klare Intensitäten der Bereinigung desselben Metadata‑Objekts: Sanitize() für ein vollständiges Löschen erkannter Pakete und RemoveProperties, wenn Titel und Betreff erhalten bleiben sollen, die Personen‑Identität jedoch nicht. Dieser Artikel vergleicht beide Ansätze mit den Inspektions‑ und Verifikationsschritten, die das Ergebnis prüfbar machen.

Am Ende verfügen Sie über funktionierende .NET 8‑Beispiele, eine Entscheidungsregel für ausgehende versus archivfreundliche Bereinigung und ein Verifikations‑Prädikat, das Author / Person.Creator prüft, anstatt nach dem Save über PDF‑Engine‑Creator/Producer‑Fingerabdrücke zu panikieren.

Warum die Bereinigung von PDF‑Metadaten wichtig ist

Ausgehende Dateifreigaben, Multi‑Tenant‑Downloads und regulierte Archive benötigen eine wiederholbare API zum Entfernen von Metadaten statt eines Desktop‑Klicks. Dieser Ansatz ist besonders wertvoll für:

  • Partnerportale: Vollständiges Löschen, bevor ein PDF eine Vertrauensgrenze überschreitet
  • Archivsuche: Titel/Betrifft behalten, während autorbezogene Felder entfernt werden
  • Incident‑Response: Nachweisen, dass der Autor nach einer falschen Freigabe verschwunden ist
  • CI‑Gates: Build fehlschlagen lassen, wenn die Verifikation false zurückgibt

Eine einzeilige Richtlinie („Metadaten entfernen“) verbirgt die Wahl zwischen Sanitize und selektiver Bereinigung. Die Benennung der Intensität im Code‑Review verhindert stillschweigende Über‑Löschungen von Schlüsselwörtern, die Ihr Archiv noch benötigt.

Voraussetzungen

Stellen Sie vor dem Start sicher, dass Sie Folgendes haben:

  • .NET 8 SDK
  • GroupDocs.Metadata 26.8.0 (temporäre Lizenz)
  • Ein PDF, das noch Info‑ und/oder XMP‑Identitätsfelder enthält
  • Visual Studio 2022 oder VS Code (optional)

Installation

Installieren Sie GroupDocs.Metadata über NuGet:

dotnet add package GroupDocs.Metadata --version 26.8.0

Oder stellen Sie das Sample‑Projekt aus der .csproj‑Datei wieder her. Für uneingeschränktes Save setzen Sie die Umgebungsvariable LIC_METADATA_VALID auf den Ordner, der GroupDocs.Metadata.Product.Family.lic enthält.

Methode 1 – Inspektion, bevor Sie bereinigen

Beginnen Sie mit einer schreibgeschützten Auflistung, damit Sie wissen, welche Felder das PDF tatsächlich enthält. Browser‑Tools übersehen häufig XMP; diese Auflistung ist die Basis für einen Vorher/Nachher‑Check.

using var metadata = new Metadata(inputPath);
var properties = metadata.FindProperties(p =>
    p.Tags.Contains(Tags.Person.Creator) ||
    p.Tags.Contains(Tags.Tool.Software) ||
    p.Tags.Contains(Tags.Content.Title) ||
    p.Tags.Contains(Tags.Content.Subject) ||
    string.Equals(p.Name, "Author", StringComparison.OrdinalIgnoreCase) ||
    string.Equals(p.Name, "Creator", StringComparison.OrdinalIgnoreCase) ||
    string.Equals(p.Name, "Producer", StringComparison.OrdinalIgnoreCase) ||
    string.Equals(p.Name, "Keywords", StringComparison.OrdinalIgnoreCase));

foreach (var property in properties)
{
    Console.WriteLine($"{property.Name} = {property.Value}");
}

Wichtige Punkte:

  • Tags plus Namen: Kombinieren Sie Tag‑Prüfungen mit Author / Keywords‑Vergleichen für Produzenten, die Felder anders taggen
  • Keine Mutation: Sicher für Trockenläufe und Support‑Tickets
  • Gemeinsame Filter: Die gleichen Ideen später in Entferungs‑Prädikaten wiederverwenden

Methode 2 – Alle erkannten Metadaten sanitisieren

Verwenden Sie Sanitize(), wenn das PDF ohne jegliche Urheberspur das Unternehmen verlassen muss. Der Aufruf löscht erkannte Pakete, einschließlich Info‑Dictionary‑Felder und XMP, sofern die API sie erkennt, und Sie speichern anschließend eine neue Datei.

using var metadata = new Metadata(inputPath);
int removed = metadata.Sanitize();
Console.WriteLine(removed);
metadata.Save(outputPath);

Wichtige Punkte:

  • Ein Aufruf: Kleine Angriffsfläche für ausgehende Pfade
  • Zähler protokollieren: Betreiber können bereits bereinigte Eingaben von großen Löschungen unterscheiden
  • Werkzeug‑Stempel erwarten: Nach Save können Creator/Producer Werte des PDF‑Engine‑Tools anzeigen

Am besten geeignet für: Partner‑Downloads, öffentliche Links, Austausch zwischen Mandanten.

Methode 3 – Nur autorbezogene Eigenschaften entfernen

Wenn Titel, Betreff und Schlüsselwörter weiterhin für die Suche benötigt werden, entfernen Sie Personen‑Identität mit RemoveProperties anstatt jedes Paket zu löschen.

using var metadata = new Metadata(inputPath);
int removed = metadata.RemoveProperties(p =>
    p.Tags.Contains(Tags.Person.Creator) ||
    p.Tags.Contains(Tags.Person.Editor) ||
    string.Equals(p.Name, "Author", StringComparison.OrdinalIgnoreCase) ||
    string.Equals(p.Name, "Creator", StringComparison.OrdinalIgnoreCase) ||
    string.Equals(p.Name, "Producer", StringComparison.OrdinalIgnoreCase));
Console.WriteLine(removed);
metadata.Save(outputPath);

Wichtige Punkte:

  • Prädikat ist prüfbar: Im Code‑Review kann genau gesehen werden, welche Identitätsfelder entfernt werden
  • Beschreibende Felder bleiben: Titel/Betrifft/Schlüsselwörter bleiben bei diesem Filter erhalten
  • Gleiche SDK: Keine zweite Bibliothek für den selektiven Pfad nötig

Am besten geeignet für: interne Archive, zirkulierende Entwürfe, Richtlinien, die Autor verbieten, aber Schlüsselwörter zulassen.

Wie beweist man das Entfernen des Autors nach Save?

Öffnen Sie das bereinigte PDF erneut und suchen Sie ausschließlich nach Author / Person.Creator / Person.Editor. Geben Sie True aus, wenn nichts mehr vorhanden ist. Behandeln Sie verbleibende Creator/Producer‑Tool‑Software‑Fingerabdrücke nicht als fehlgeschlagene Bereinigung – Save kann diese mit dem Namen der PDF‑Engine überschreiben. Diese Unterscheidung hält Compliance‑Checks in CI ehrlich und verhindert Fehlalarme, wenn das Engine‑Tool seine eigenen Felder setzt.

using var metadata = new Metadata(inputPath);
var leftovers = metadata.FindProperties(p =>
    p.Tags.Contains(Tags.Person.Creator) ||
    p.Tags.Contains(Tags.Person.Editor) ||
    string.Equals(p.Name, "Author", StringComparison.OrdinalIgnoreCase));

Console.WriteLine(!leftovers.Any());

Wichtige Punkte:

  • Die richtige Frage stellen: „Ist der Autor weg?“ und nicht „Ist Creator leer?“
  • Zweites Öffnen: Nach Save verifizieren, nicht nur im Speicher
  • CI‑freundlich: Ein boolescher Wert für Tests und Logs

Entscheidung zwischen Sanitize und RemoveProperties

Frage Sanitize bevorzugen RemoveProperties bevorzugen
Datei verlässt das Unternehmen? Ja Nur wenn beschreibende Felder erhalten bleiben müssen
Archivsuche benötigt Titel? Nein Ja
Richtlinie sagt „keine Personen in Metadaten“? Beide, dann verifizieren Ja, mit personen‑fokussiertem Prädikat
Bediener will einen Knopf? Ja Hinter einer benannten Route verpacken

strip-pdf-metadata-dotnet ist ein ausführbares .NET‑Demo, das alle vier Schritte gegen Resources/contract-with-metadata.pdf verkabelt, sodass Sie Inspektion, Sanitisierung, selektive Entfernung und Verifikation in einem Konsolenlauf sehen können.

Häufige Fehler

  • Nur einem Browser‑Cleaner vertrauen: XMP überlebt häufig.
  • Creator/Producer‑Namen verifizieren: Engine‑Fingerabdrücke nach Save führen zu falschen Fehlschlägen.
  • Ein Prädikat für immer verwenden: Feldnamen für Identität neu prüfen, wenn neue Produzenten auftauchen.
  • Lizenz‑Setup für Save überspringen: Der Evaluierungsmodus kann uneingeschränkte Schreibvorgänge blockieren; setzen Sie LIC_METADATA_VALID für vollständige Pipeline‑Tests.
  • Inspektion überspringen: Ohne Vorher‑Auflistung können Sie nicht sagen, ob Sanitize 7 Felder oder 0 entfernt hat, weil die Datei bereits sauber war.

Im mitgelieferten Beispiel contract-with-metadata.pdf gibt ein lizenzierter Durchlauf typischerweise beim Inspektieren Author und Keywords aus, eine Sanitize‑Entfernungszahl um die 7 und True vom autor‑fokussierten Verifikationsschritt. Die selektive Autor‑Entfernung liefert eine kleinere Zahl (etwa 3), während Titel und Betreff bei einer zweiten Inspektion sichtbar bleiben.

Weitere Ressourcen

Fazit

Die Bereinigung von PDF‑Metadaten in .NET ist nicht nur ein einzelner API‑Aufruf mit einem vagen Namen. Verwenden Sie Sanitize() für ausgehende Komplettlöschungen, RemoveProperties wenn Titel und Betreff erhalten bleiben müssen, und inspizieren sowie verifizieren Sie stets autorbezogene Felder nach Save. Klonen Sie das Beispiel‑Repository, führen Sie es auf dem mitgelieferten Vertrags‑PDF aus und übernehmen Sie dieselben Methoden in Ihren Upload‑Service – inklusive Logging der Löschzahlen.