Ejemplo completo en funcionamiento disponible en GitHub:
strip-pdf-metadata-dotnet
Introducción
La sanitización de metadatos PDF es un flujo de trabajo de GroupDocs.Metadata para .NET que elimina el diccionario de información PDF y los campos de identidad XMP de los servicios C#. Cuando un PDF de contrato abandona una unidad interna, el Autor, Creador, Productor, Palabras clave y los paquetes XMP a menudo lo acompañan. Los limpiadores de navegadores y una rápida pasada por Acrobat pueden parecer exitosos mientras que XMP sigue nombrando al autor original. Encontré esa brecha cuando un borrador “limpio” todavía mostraba Alice Example bajo Autor después de que un socio abrió el archivo en otro visor.
GroupDocs.Metadata para .NET ofrece a los servicios C# dos intensidades claras de limpieza sobre el mismo objeto Metadata: Sanitize() para una eliminación completa de los paquetes detectados, y RemoveProperties cuando el Título y el Asunto deben permanecer pero la identidad de la persona no. Este artículo compara ambos enfoques con los pasos de inspección y verificación que hacen que el resultado sea auditable.
Al final tendrás ejemplos funcionales para .NET 8, una regla de decisión para limpieza orientada a salida versus archivado, y un predicado de verificación que comprueba Autor / Person.Creator en lugar de entrar en pánico por las huellas de Creador/Productor del motor PDF después de Save.
Por qué importa la limpieza de metadatos PDF
Los intercambios de archivos salientes, descargas multi‑inquilino y archivos regulados necesitan una API de eliminación de metadatos repetible en lugar de un clic de escritorio. Este enfoque es particularmente valioso para:
- Portales de socios: Eliminación total antes de que un PDF cruce un límite de confianza
- Búsqueda de registros: Mantener Título/Asunto mientras se descartan los campos de tipo Autor
- Respuesta a incidentes: Demostrar que el Autor ha desaparecido tras una compartición errónea
- Puertas CI: Fallar una compilación cuando la verificación devuelve false
Una política de una sola línea (“eliminar metadatos”) oculta la diferencia entre Sanitize y la selección. Nombrar la intensidad en la revisión de código evita la eliminación silenciosa de Palabras clave que tu archivo necesita.
Requisitos previos
Antes de comenzar, asegúrate de tener:
- SDK de .NET 8
- GroupDocs.Metadata 26.8.0 (licencia temporal)
- Un PDF que aún contenga campos de Info y/o identidad XMP
- Visual Studio 2022 o VS Code (opcional)
Instalación
Instala GroupDocs.Metadata vía NuGet:
dotnet add package GroupDocs.Metadata --version 26.8.0
O restaura desde el archivo .csproj del proyecto de ejemplo. Para permitir Save sin restricciones, establece la variable de entorno LIC_METADATA_VALID al directorio que contiene GroupDocs.Metadata.Product.Family.lic.
Método 1 – Inspeccionar antes de limpiar
Comienza con una lista de solo lectura para saber qué campos lleva realmente el PDF. Las herramientas del navegador a menudo omiten XMP; esta lista es la línea base para una comprobación antes/despué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}");
}
Puntos clave:
- Etiquetas más nombres: combina la comprobación de etiquetas con comparaciones de
Author/Keywordspara productores que etiquetan los campos de forma distinta - Sin mutación: seguro para modos de ejecución en seco y tickets de soporte
- Filtros compartidos: reutiliza las mismas ideas en los predicados de eliminación más adelante
Método 2 – Sanitize todos los metadatos detectados
Usa Sanitize() cuando el PDF debe salir sin rastro de autoría. La llamada elimina los paquetes reconocidos, incluidos los campos del diccionario Info y XMP cuando la API los detecta, y luego guardas un nuevo archivo.
using var metadata = new Metadata(inputPath);
int removed = metadata.Sanitize();
Console.WriteLine(removed);
metadata.Save(outputPath);
Puntos clave:
- Una sola llamada: superficie mínima para rutas salientes
- Registrar el recuento: los operadores pueden distinguir entradas ya limpias de limpiezas masivas
- Esperar sellos de herramienta: después de
Save, Creador/Productor pueden mostrar valores deTool.Softwaredel motor PDF
Mejor cuando: descargas de socios, enlaces públicos, intercambio entre inquilinos.
Método 3 – Eliminar solo propiedades de tipo autor
Cuando Título, Asunto y Palabras clave siguen alimentando la búsqueda, elimina la identidad de la persona con RemoveProperties en lugar de borrar todo el paquete.
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);
Puntos clave:
- El predicado es revisable: la revisión de código puede ver exactamente qué campos de identidad se eliminan
- Los campos descriptivos permanecen: Título/Asunto/Palabras clave siguen presentes con este filtro de ejemplo
- Mismo SDK: no se necesita una segunda biblioteca para la ruta selectiva
Mejor cuando: archivos de archivo internos, borradores circulantes, políticas que prohíben Autor pero permiten palabras clave.
¿Cómo demostrar la eliminación del Autor después de Save?
Vuelve a abrir el PDF limpiado y busca solo Autor / Person.Creator / Person.Editor. Imprime True cuando no quede ninguno. No trates las huellas residuales de Creador/Productor (Tool.Software) como un fallo de limpieza – Save puede reescribir esos campos con el nombre del motor PDF. Esa distinción es lo que mantiene honestas las comprobaciones de cumplimiento en CI y evita falsas alarmas cuando el motor firma sus propios campos.
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());
Puntos clave:
- Hacer la pregunta correcta: “¿Se ha ido el Autor?” y no “¿Está vacío Creador?”
- Segunda apertura: verifica después de
Save, no solo en memoria - Amigable para CI: un booleano para pruebas y registros
Elegir entre Sanitize y RemoveProperties
| Pregunta | Preferir Sanitize | Preferir RemoveProperties |
|---|---|---|
| ¿El archivo sale de la empresa? | Sí | Solo si los campos descriptivos deben sobrevivir |
| ¿La búsqueda de archivo necesita Título? | No | Sí |
| ¿La política dice “no hay personas en los metadatos”? | Cualquiera, luego verificar | Sí, con predicado centrado en personas |
| ¿El operador quiere un solo botón? | Sí | Envolver detrás de una ruta con nombre |
strip-pdf-metadata-dotnet es una demo ejecutable en .NET que conecta los cuatro pasos contra Resources/contract-with-metadata.pdf para que puedas ver inspección, sanitización, eliminación selectiva y verificación en una única ejecución de consola.
Errores comunes
- Confiar solo en un limpiador de navegador: XMP suele sobrevivir.
- Verificar nombres de Creador/Productor: las huellas del motor después de
Saveprovocan fallos falsos. - Usar siempre el mismo predicado: revisa los nombres de campos de identidad cuando aparezcan nuevos productores.
- Omitir la configuración de licencia para Save: el modo de evaluación puede bloquear escrituras sin restricciones; establece
LIC_METADATA_VALIDpara pruebas de canal completo. - Omitir la inspección: sin una lista previa no puedes saber si Sanitize eliminó 7 campos o 0 porque el archivo ya estaba limpio.
En el archivo de muestra contract-with-metadata.pdf, una ejecución con licencia suele imprimir Autor y Palabras clave en la inspección, un recuento de eliminación de Sanitize alrededor de 7, y True en la verificación centrada en Autor. La eliminación selectiva de autor muestra un recuento menor (alrededor de 3) mientras que Título y Asunto siguen visibles en una segunda inspección.
Recursos adicionales
- Caso de uso: Sanitize vs eliminación de autor para metadatos PDF (.NET)
- Documentación: eliminar todos los paquetes de metadatos detectados
- Documentación: eliminar propiedades de metadatos específicas
- GitHub: strip-pdf-metadata-dotnet
- Referencia de API
Conclusión
La limpieza de metadatos PDF en .NET no es una única llamada API con un nombre vago. Elige Sanitize() para borrados externos, RemoveProperties cuando Título y Asunto deben permanecer, y siempre inspecciona y verifica los campos de tipo Autor después de Save. Clona el repositorio de ejemplo, ejecútalo sobre el PDF de contrato incluido, y luego copia los mismos métodos en tu servicio de carga con registro alrededor de los recuentos de eliminación.