Exemple complet fonctionnel disponible sur GitHub :
strip-pdf-metadata-dotnet

Introduction

Le nettoyage des métadonnées PDF est un flux de travail GroupDocs.Metadata pour .NET qui supprime le dictionnaire Info du PDF et les champs d’identité XMP depuis les services C#. Lorsqu’un PDF de contrat quitte un lecteur interne, les champs Auteur, Créateur, Producteur, Mots‑clé et les paquets XMP restent souvent présents. Les nettoyeurs de navigateur et un passage rapide dans Acrobat peuvent sembler efficaces alors que le XMP indique toujours l’auteur original. J’ai constaté ce problème lorsqu’un brouillon « nettoyé » affichait encore Alice Example sous Auteur après qu’un partenaire ait ouvert le fichier dans un autre visualiseur.

GroupDocs.Metadata pour .NET offre aux services C# deux niveaux clairs de nettoyage sur le même objet Metadata : Sanitize() pour une suppression complète des paquets détectés, et RemoveProperties lorsque le Titre et le Sujet doivent être conservés mais que l’identité de la personne ne doit pas l’être. Cet article compare les deux approches avec les étapes d’inspection et de vérification qui rendent le résultat auditable.

Vous disposerez d’exemples fonctionnels .NET 8, d’une règle de décision pour le nettoyage sortant versus celui adapté aux archives, et d’un prédicat de vérification qui contrôle Auteur / Person.Creator au lieu de s’alarmer des empreintes Creator/Producer du moteur PDF après Save.

Pourquoi le nettoyage des métadonnées PDF est important

Les partages de fichiers sortants, les téléchargements multi‑locataires et les archives réglementées nécessitent tous une API de suppression de métadonnées reproductible plutôt qu’un clic sur le bureau. Cette approche est particulièrement utile pour :

  • Portails partenaires : suppression totale avant qu’un PDF ne franchisse une frontière de confiance
  • Recherche d’archives : conserver le Titre/Sujet tout en supprimant les champs de type Auteur
  • Réponse à un incident : prouver que l’Auteur a disparu après un partage erroné
  • Portes CI : faire échouer une construction lorsque la vérification renvoie false

Une politique d’une ligne (« supprimer les métadonnées ») masque le choix entre Sanitize et la sélection. Nommer l’intensité lors de la revue de code empêche la suppression silencieuse de mots‑clé dont votre archive a encore besoin.

Prérequis

Avant de commencer, assurez‑vous de disposer de :

  • SDK .NET 8
  • GroupDocs.Metadata 26.8.0 (licence temporaire)
  • Un PDF contenant encore les champs Info et/ou d’identité XMP
  • Visual Studio 2022 ou VS Code (facultatif)

Installation

Installez GroupDocs.Metadata via NuGet :

dotnet add package GroupDocs.Metadata --version 26.8.0

Ou restaurez depuis le fichier .csproj du projet d’exemple. Pour un Save sans restriction, définissez la variable d’environnement LIC_METADATA_VALID vers le dossier contenant GroupDocs.Metadata.Product.Family.lic.

Méthode 1 - Inspecter avant de nettoyer

Commencez par une liste en lecture seule afin de connaître les champs réellement présents dans le PDF. Les outils de navigateur manquent souvent le XMP ; cette liste constitue la référence pour une comparaison avant/après.

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}");
}

Points clés :

  • Étiquettes plus noms : combinez les vérifications d’étiquettes avec les égalités Author / Keywords pour les producteurs qui étiquettent les champs différemment
  • Pas de mutation : sûr pour les modes simulation et les tickets de support
  • Filtres partagés : réutilisez les mêmes idées dans les prédicats de suppression ultérieurement

Méthode 2 - Nettoyer toutes les métadonnées détectées

Utilisez Sanitize() lorsque le PDF doit quitter le système sans aucune trace d’auteur. L’appel supprime les paquets reconnus, y compris les champs du dictionnaire Info et le XMP lorsque l’API les détecte, puis vous enregistrez un nouveau fichier.

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

Points clés :

  • Un seul appel : petite surface pour les flux sortants
  • Enregistrez le nombre : les opérateurs peuvent repérer les entrées déjà nettoyées versus les grandes suppressions
  • Attendez les empreintes d’outil : après Save, Creator/Producer peuvent afficher les valeurs Tool.Software du moteur PDF

Idéal lorsque : téléchargements partenaires, liens publics, échanges inter‑locataires.

Méthode 3 - Supprimer uniquement les propriétés de type auteur

Lorsque le Titre, le Sujet et les Mots‑clé alimentent toujours la recherche, supprimez l’identité de la personne avec RemoveProperties au lieu d’effacer chaque paquet.

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);

Points clés :

  • Le prédicat est révisable : la revue de code peut voir exactement quels champs d’identité sont supprimés
  • Les champs descriptifs restent : Titre/Sujet/Mots‑clé demeurent avec ce filtre d’exemple
  • Même SDK : aucune seconde bibliothèque n’est nécessaire pour le chemin sélectif

Idéal lorsque : archives internes, brouillons circulants, politiques qui interdisent l’Auteur mais autorisent les mots‑clé.

Comment prouver la suppression de l’auteur après l’enregistrement ?

Rouvrez le PDF nettoyé et recherchez uniquement Auteur / Person.Creator / Person.Editor. Affichez True lorsqu’aucun n’est présent. Ne considérez pas les empreintes résiduelles Creator/Producer Tool.Software comme un échec de suppression — Save peut les réécrire avec le nom du moteur PDF. Cette distinction garantit l’intégrité des contrôles de conformité en CI et évite les fausses alertes lorsque le moteur appose ses propres champs d’outil.

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());

Points clés :

  • Poser la bonne question : « L’Auteur a‑t‑il disparu ? » et non « Le Creator est‑il vide ? »
  • Deuxième ouverture : vérifiez après Save, pas seulement en mémoire
  • Adapté CI : un booléen pour les tests et les journaux

Choisir entre Sanitize et RemoveProperties

Question Préférer Sanitize Préférer RemoveProperties
Le fichier quitte l’entreprise ? Oui Seulement si les champs descriptifs doivent survivre
La recherche d’archive a besoin du Titre ? Non Oui
La politique indique “pas de personnes dans les métadonnées” ? L’un ou l’autre, puis vérifier Oui, avec un prédicat centré sur les personnes
L’opérateur veut un seul bouton ? Oui Envelopper derrière une route nommée

strip-pdf-metadata-dotnet est une démo .NET exécutable qui enchaîne les quatre étapes sur Resources/contract-with-metadata.pdf afin que vous puissiez voir l’inspection, le nettoyage, la suppression sélective et la vérification en une seule exécution console.

Erreurs courantes

  • Faire confiance uniquement à un nettoyeur de navigateur : le XMP survit souvent.
  • Vérifier les noms Creator/Producer : les empreintes du moteur après Save entraînent des échecs faux positifs.
  • Utiliser un seul prédicat indéfiniment : revisitez les noms de champs d’identité lorsque de nouveaux producteurs apparaissent.
  • Ignorer la configuration de licence pour Save : le mode évaluation peut bloquer les écritures sans restriction ; définissez LIC_METADATA_VALID pour les tests de pipeline complet.
  • Sauter l’inspection : sans liste préalable, vous ne pouvez pas savoir si Sanitize a supprimé 7 champs ou 0 parce que le fichier était déjà propre.

Sur l’exemple fourni contract-with-metadata.pdf, une exécution sous licence affiche généralement Auteur et Mots‑clé lors de l’inspection, un nombre de suppressions Sanitize d’environ 7, et True lors de la vérification centrée sur l’Auteur. La suppression sélective d’auteur indique un nombre plus petit (environ 3) tandis que le Titre et le Sujet restent visibles lors d’une seconde inspection.

Ressources supplémentaires

Conclusion

Le nettoyage des métadonnées PDF sous .NET n’est pas une simple appel d’API au nom vague. Choisissez Sanitize() pour les suppressions sortantes, RemoveProperties lorsque le Titre et le Sujet doivent rester, et effectuez toujours une inspection puis une vérification des champs de type Auteur après Save. Clonez le dépôt d’exemple, exécutez‑le sur le PDF de contrat fourni, puis copiez les mêmes méthodes dans votre service de téléchargement avec des journaux autour des comptes de suppression.