sábado, 9 de julio de 2022

Trabajando en C# con Ficheros Tipo PDF y Office - Limpiar Metadatos del Fichero (Sanitize)

 

Hace unos días me pidieron en el trabajo que realizara una prueba de concepto de un Upload de 

Ficheros, que permitiese limpiar los metadatos, ya que no se quiere que se muestre los metadatos del 

usuario que creo ese fichero.

Nota: Cuando hablamos de metadatos se refiere a las propiedades del fichero que contiene los datos


Estuve investigando un poco y me di cuenta (al menos para mi) de lo difícil que fue encontrar 

exactamente lo que quería,

Y lo que quería era que a partir de un fichero existente a subir se le pudiese limpiar o sanítizar los 

metadatos del fichero y permitir su descarga , obviamente de la forma mas fácil y rápida posible,

pensé que se podría subir el fichero original con metadatos y a partir de este crear un fichero, con el 

mismo contenido pero sin información en los metadatos, no sabes a veces cuantos dolores de cabeza me

trae hacer nuevos desarrollos pero es muy interesante y lo siento como un desafío, solo que hay que 

investigar un poco, la mayor parte de mi tiempo es investigar creo que uno 60% consume de mi 

tiempo, gracias a Dios tenemos Google , jejejeje.


Entonces vi una necesidad de exponer con algunos ejemplos como se debe realizar una limpieza de 

metadatos, ya que me fue muy difícil de encontrar en español y realizarlo y bueno es encontrar las 

librerias adecuadas y las paginas adecuadas donde te expliquen como hacerlo o dar una idea


Hablare primero de lo ultimo que hice y fue trabajar con la limpieza de metadatos en ficheros office 

(docx, xlsx, pptx), para trabajar con este tipo de ficheros, lo primero que encontré y que recomendaban 

era usar la librería DocumentFormat.OpenXML

Esta librería me permite crear ficheros office sin mayor esfuerzo, y tambien permite vaciar aquellas 

propiedades que no quiero que aparezcan con datos, entre otras muchas funcionalidades

Esta librería la puedes descargar de Nuget desde Visual Studio


Lo primero es declarar las librerias a usar:

using DocumentFormat.OpenXml.Packaging;

using DocumentFormat.OpenXml;


Lo siguiente que hice fue esta porción de codigo, vale la pena aclarar que funciona bien, ya que no 

encontré una funcionalidad .Clear() o Sanitize() que limpiara todo automáticamente, en este caso me 

toco ir propiedad a propiedad y eso a las que pude encontrar.


Lo explicare un poco, se crea una instancia del documento y luego que ya esta abierto, con permisos

de modificación, se pueden vaciar las propiedades, al finalizar el using , lo que hará este objeto en el 

documento es que le hará un .Save() automáticamente y de esta forma se podrá tener un fichero limpio 

de metadatos

Ejemplo Documentos Word:

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(rutaAbsoluta, true))

                    {

                        wordDoc.PackageProperties.Creator = ""; // Autor

                        wordDoc.PackageProperties.Created = null; //Fecha de Creación

                        wordDoc.PackageProperties.Description = "";

                        wordDoc.PackageProperties.Version = ""; //Version del fichero

                        wordDoc.PackageProperties.Title = ""; //Titulo del fichero

                        wordDoc.PackageProperties.ContentStatus = "";

                        wordDoc.PackageProperties.ContentType = "";

                        wordDoc.PackageProperties.Category = "";

                        wordDoc.PackageProperties.Identifier = "";

                        wordDoc.PackageProperties.Keywords = "";

                        wordDoc.PackageProperties.Language = "";//Idioma del fichero

                        wordDoc.PackageProperties.LastModifiedBy = "";

                        wordDoc.PackageProperties.LastPrinted = null; //Fecha de ultima impresión

                        wordDoc.PackageProperties.Modified = null;

                        wordDoc.PackageProperties.Subject = "";

                        wordDoc.PackageProperties.Revision = ""; //Numero de Revisión

                    }

Para el caso de Excel y Power Point, las propiedades son las mismas, lo único que cambia es el objeto 

con el que se usa la apertura del fichero existente 

Excel -> SpreadsheetDocument package = SpreadsheetDocument.Open(rutaAbsoluta, true)

Power Point -> PresentationDocument presDoc = PresentationDocument.Open(rutaAbsoluta, true)


NOTA IMPORTANTE: de esta manera podrás vaciar los metadatos mas comunes , como lo 

mostramos en el ejemplo


Tambien encontré otra Librería que podría ser útil, lo único que es una librería de pago, y cuando haces 

el Sanitize del fichero, te lo crea , pero te genera un error, lo que hice fue gestionar ese error, para que 

al menos pudiese funcionar, pero no conozco cuantos ficheros dejará crear o sanitizar

La librería se llama GroupsDocs.Metadata , la encontré en GitHub, les dejo el enlace para que puedan 

ver un poco mas de este proyecto 


Aquí les dejo una porción del codigo:

 using (Metadata metadata = new Metadata(rutaAbsoluta))

                    {

                        var affected = metadata.Sanitize();// esta es la que hace todo el poder (limpia todo)

                        Console.WriteLine("Properties removed: {0}", affected);

                        metadata.Save(rutaAbsoluta2);

                    }


 Si no la encuentras puedes ir a la linea de comandos de Nuget en Visual Studio y ejecutas el siguiente comando: Install-Package GroupDocs.Metadata


Espero este Post haya servido para traer un poco de claridad en cuanto al tema, espero te sirva para tus 

desarrollos y que estas funcionalidades puedan estar en tu biblioteca de codigo fuente


Si te sirvió escribe en los comentarios abajo y cuéntanos tu experiencia, y no se te olvide darle like y 

compartir, estamos en contacto!

Usando Libreria Javascript para generar ficheros Excel

  El año pasado tuve la oportunidad de hacer un desarrollo en la empresa en la que estoy colaborando, que se necesitaba " Generar un fi...