c#

c# - ¿Cómo establecer propiedades de archivos extendidos?



(5)

Necesito establecer el valor de campo de la compañía para algunos documentos de Word / PDF. Estoy hablando de las propiedades de archivo extendidas (resumen / autor / título, etc.) que ve en Propiedades de archivo.

Sé cómo obtenerlos (utilizando la biblioteca de clases shell32.dll ). Supuse que también podría configurarlos con la misma biblioteca de clases, pero parece que escribir propiedades extendidas es un poco más difícil y shell32.dll no permite eso.

Encontré algo sobre taglib-sharp , que parece tener una opción para establecer propiedades extendidas, pero realmente no entiendo cómo funciona.


Solución 2016

Agregue los siguientes paquetes NuGet a su proyecto:

  • Microsoft.WindowsAPICodePack-Shell de Microsoft
  • Microsoft.WindowsAPICodePack-Core de Microsoft

Propiedades de lectura y escritura

using Microsoft.WindowsAPICodePack.Shell; using Microsoft.WindowsAPICodePack.Shell.PropertySystem; string filePath = @"C:/temp/example.docx"; var file = ShellFile.FromFilePath(filePath); // Read and Write: string[] oldAuthors = file.Properties.System.Author.Value; string oldTitle = file.Properties.System.Title.Value; file.Properties.System.Author.Value = new string[] { "Author #1", "Author #2" }; file.Properties.System.Title.Value = "Example Title"; // Alternate way to Write: ShellPropertyWriter propertyWriter = file.Properties.GetPropertyWriter(); propertyWriter.WriteProperty(SystemProperties.System.Author, new string[] { "Author" }); propertyWriter.Close();

Importante:

El archivo debe ser válido, creado por el software específico asignado. Cada tipo de archivo tiene propiedades específicas de archivos extendidos y no todos son modificables.

Si hace clic con el botón derecho en un archivo en el escritorio y no puede editar una propiedad, tampoco podrá editarlo en código.

Ejemplo:

  • Cree un archivo txt en el escritorio, cambie el nombre de su extensión a docx. No puede editar su propiedad de Author o Title .
  • Ábralo con Word, edítelo y guárdelo. Ahora usted puede.

Así que solo asegúrate de usar algunos try catch

Tema adicional: MSDN: Implementación de manejadores de propiedades


Bien, aquí está la respuesta a mi propia pregunta, ya que no pude encontrar mi respuesta en este foro, podría ser útil para otros. La solución es usar dsofile.dll y OleDocumentPropertiesClass. Aquí está el artículo de MS sobre dsofile.dll - Link En este enlace, puede descargar dsofile.dll con algunos otros archivos. Pero probablemente, al igual que yo, enfrentarás algunos problemas extraños para los que es difícil encontrar una solución.

1) Después de intalar dsofile.dll, deberá registrar la clase: oped cmd y navegar a c: / dsofile of al directorio, donde ha extraído su dsofile.dll descargado. Después de eso, escriba line regsvr32 dsofile.dll . Debería obtener un mensaje que diga que la registración fue exitosa. De lo contrario, lo más probable es que no tenga derechos de administrador. Necesitará derechos de administrador en caso de que quiera que esto funcione.

2) Después de intentar usar esta clase en su programa, si está utilizando .NET 4.0 es posible, verá un error que diga algo así como "la clase no puede ser incorporada ..." Bueno, para eso, haga clic derecho en dsofile en lista de referencias, propiedades -> incrustar archivos de interoperabilidad -> establecer en FALSO.

3) Cómo usar:

//creates new class of oledocumentproperties var doc = new OleDocumentPropertiesClass(); //open your selected file doc.Open(pathToFile, false, dsoFileOpenOptions.dsoOptionDefault); //you can set properties with summaryproperties.nameOfProperty = value; for example doc.SummaryProperties.Company = "lol"; doc.SummaryProperties.Author = "me"; //after making changes, you need to use this line to save them doc.Save();


El Explorador de Windows (que usa shell32.dll ) puede mostrar las propiedades extendidas porque comprende una gran cantidad de formatos de archivo diferentes y puede analizarlos. Sin embargo, para establecer una propiedad extendida probablemente necesite una biblioteca específica de formato de archivo. Por ejemplo, configurar el autor de un archivo de archivo MP3 es muy diferente en comparación con la configuración del autor de un documento de Office. (En realidad, Windows Explorer le permite configurar algunas propiedades extendidas en documentos de Office).

El taglib-sharp solo funciona con archivos multimedia y es muy probable que no pueda establecer propiedades extendidas de ningún otro tipo de archivo.

Lo que necesita es una biblioteca o una herramienta que pueda automatizar para modificar archivos PDF. Puede intentar google pdf sdk . Si también necesita trabajar con archivos de Word, puede usar la automatización COM para automatizar Word. Dependiendo del formato de archivo de Word utilizado, también es posible que pueda trabajar directamente con el archivo sin tener instalado Word (XML es mucho más fácil que el viejo formato binario de "secuencias").


Gracias @andree, he buscado muchas respuestas ... (Para mí solo funcionaba con archivos .doc). Adicional

if (!doc.IsOleFile) Console.ReadLine();

Solo para verificar si el archivo Ole ...

Y Visual Studio como administrador


Para establecer propiedades, puede utilizar el sistema de propiedades de Windows. Proporciona una interfaz para acceder al "Property Store Cache" (IPropertyStore) donde puede leer / establecer las propiedades de cualquier archivo (independientemente del formato) y agregar sus propias propiedades personalizadas (la biblioteca c propkey.h tiene una lista completa de todas propiedades disponibles; también puede encontrarlas usando prop.exe ). Esto básicamente crea un Property Handler que luego debe registrarse en su extensión de archivo. No está oficialmente admitido en el código administrado, por lo que es posible que desee escribir su propio contenedor o usar c ++ (ya que esta es una pregunta etiquetada con ac #).

Si específicamente está solicitando propiedades de medios, consulte los manejadores de metadatos, que son esencialmente códecs que extraen sus propiedades del archivo y también son llamados por el explorador de forma predeterminada si los registra correctamente.