2016-02-15 6 views
1

У меня есть файл .docx с пользовательскими свойствами, указанными только для файлов MS Office. File propertiesКак читать «Расширенные» теги 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?

+0

TY всем для ответов. –

ответ

3

U может использовать теплую лампу .docx формат чтения. Что-то вроде этого:

using System.IO.Packaging; 

var package = Package.Open(ms, FileMode.Open, FileAccess.ReadWrite); 
var corePart = package.GetPart(new Uri("/docProps/core.xml", UriKind.Relative)) 
XDocument settings; 
using (TextReader tr = new StreamReader(settingsPart.GetStream())) 
    settings = XDocument.Load(tr); 

XNamespace cp = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties" 
var tags = settings.Root.Element(cp + "keywords"); 

Не нужно использовать дополнительные библиотеки или sdk. Только System.IO, только хардкор!

+0

Нужно ли даже получить часть (я точно не знаю)? Как насчет var tags = package.PackageProperties.Keywords; –

2

Предлагаю использовать для этого Open Xml Sdk, открытый xml - это «новый» стандарт для офиса. Чтение тегов можно было бы с этим кодом: (обратите внимание, что вам нужно использовать DocumentFormat.OpenXml.Packaging пространство имен для этого)

string tags = ""; 
using(var doc = WordProcessingDocument.Open("filename",false) 
    tags = doc.PackageProperties.KeyWords; 

Использование Open XML не нужно что-либо должность, связанную установлен на машине, поэтому он идеально подходит для использования его на серверов или в вашем примере для чтения/редактирования документов на компьютерах, на которых не установлен офис.

+0

Я проверил ваше решение как можно скорее, TY. –

+0

Спасибо за ваш вопрос. Сначала я был удивлен, что мне нужно добавить WindowsBase.dll (http://stackoverflow.com/questions/10427041/references-needed-to-use-open-xml-from-within-net-web-application), чтобы используйте OpenXML SDK. Кроме того, я получаю 'FileFormatException' (_« Файл содержит поврежденные данные. »_) Для файла, который был правильно открыт с помощью Interop. Я не могу изменить формат файла, потому что это входной поток документов от наших клиентов. Могу ли я использовать Open XML с файлами, созданными в MS Word и сохраненными как .docx-файл? –

+0

Открытый xml предназначен только для файлов docx, единственный способ конвертировать doc в docx (afaik) - это открыть его и сохранить его со словом:/Если вы имеете дело со старыми doc'ами, то ваше единственное решение будет interop, я боюсь , –

1

Корпорация Майкрософт не рекомендует и не поддерживает автоматизацию приложений Microsoft Office из любого необработанного, неинтерактивного клиентского приложения или компонента (включая службы ASP, ASP.NET, DCOM и NT), поскольку Office может проявлять неустойчивое поведение и/или тупик, когда Office запущен в этой среде.

Если вы создаете решение, которое выполняется в контексте на стороне сервера, вы должны попытаться использовать компоненты, которые были безопасны для автоматического выполнения. Или вы должны попытаться найти альтернативы, которые позволяют хотя бы часть кода запускать клиентскую сторону. Если вы используете приложение Office из серверного решения, для успешного выполнения приложения не будет достаточного количества необходимых возможностей. Кроме того, вы рискуете стабильностью своего общего решения. Подробнее об этом читайте в статье Considerations for server-side Automation of Office.

В качестве обходного пути вы можете использовать Open XML SDK, см. Welcome to the Open XML SDK 2.5 for Office для получения дополнительной информации.Или используйте сторонние компоненты, предназначенные для выполнения на стороне сервера. Например, взгляните на Aspose.