У меня есть файл .docx
с пользовательскими свойствами, указанными только для файлов MS Office. Как читать «Расширенные» теги MS Word без Office.Interop?
Если я попытался открыть тот же файл на компьютере без установленного MS-офиса, то на вкладке сведений о файле нет свойства Tags.
Мне нужно читать Tags
в моем коде C#.
Я пробовал this solution и убирал Tags
как 18
. Затем я использовал следующий код:
public class TagsReader : ITagsReader
{
private const int keywordsIndex = 18;
public string Read(string filePath)
{
var fullPath = Path.GetFullPath(filePath);
var directoryName = Path.GetDirectoryName(fullPath);
Folder dir = GetShell32Folder(directoryName);
var fileName = Path.GetFileName(fullPath);
FolderItem item = dir.ParseName(fileName);
return dir.GetDetailsOf(item, keywordsIndex);
}
private Folder GetShell32Folder(string folderPath)
{
var shellAppType = Type.GetTypeFromProgID("Shell.Application");
var shell = Activator.CreateInstance(shellAppType);
return (Folder)shellAppType.InvokeMember("NameSpace",
BindingFlags.InvokeMethod, null, shell, new object[] { folderPath });
}
}
Но он не работает на компьютерах без установленной MS Office. Он работает только для файлов .doc
, но не для .docx
. Сейчас я Inerop
на основе решения, которое не является стабильным, ресурсоемким и требует установки MS Office на сервере:
public class WordTagsReader : ITagsReader
{
private readonly string[] availableFileExtensions = { ".docx" };
public string Read(string filePath)
{
var fileExtension = Path.GetExtension(filePath);
if (!availableFileExtensions.Contains(fileExtension))
return null;
dynamic application = null;
dynamic document = null;
var tags = string.Empty;
try
{
var typeWord = Type.GetTypeFromProgID("Word.Application");
application = Activator.CreateInstance(typeWord);
application.Visible = false;
application.DisplayAlerts = false;
var fullFilePath = Path.GetFullPath(filePath);
document = application.Documents.Open(fullFilePath);
tags = document.BuiltInDocumentProperties["Keywords"].Value;
}
finally
{
if (document != null)
{
document.Close();
document = null;
}
if (application != null)
{
application.Quit();
application = null;
}
}
return tags;
}
}
Этот код может сбои время от времени и оставил запущенных экземпляров MS Word, который берет ресурсы и блокирует файл. Я много обработчиков работал в одно и то же время, а затем я не могу отделить «левые» экземпляры от правильно обработанных и чистых ресурсов.
По этой причине поиск альтернативного решения. Есть ли способ читать конкретные (пользовательские) свойства, такие как Tags
без использования Office.Interop
?
TY всем для ответов. –