2016-02-15 64 views
1

我有.docx文件,其中只爲MS Office文件指定了自定義屬性。 File properties如何在沒有Office.Interop的情況下閱讀'Extended'MS Word文件標籤?

如果我試圖打開電腦相同的文件沒有安裝MS辦公室再有就是在文件的詳細信息標籤不標籤屬性。

我需要在我的c#代碼中閱讀Tags

我試過this solution和retieve 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 }); 
    } 
} 

但它並不適用於電腦沒有安裝微軟Office工作。它僅適用於.doc文件,但不適用於.docx。現在我用Inerop基礎的解決方案是不是穩定的,資源密集型的,需要安裝微軟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並不需要與安裝在機器所以它非常適合於使用它的任何辦公室服務器或在您的示例中讀取/編輯沒有安裝Office的計算機上的文檔。

+0

我會盡快測試您的解決方案,TY。 –

+0

謝謝你的問題。首先我很驚訝,我[需要添加WindowsBase.dll](http://stackoverflow.com/questions/10427041/references-needed-to-use-open-xml-from-within-net-web-application)到使用OpenXml SDK。 另外,對於使用Interop正確打開的文件,我得到了'FileFormatException'(_「文件包含損壞的數據。」_)。我無法更改文件格式,因爲它是我們客戶輸入的文檔流。我可以將Open XML與MS Word中創建的文件一起使用並保存爲.docx文件嗎? –

+0

打開xml僅適用於docx文件,將doc轉換爲docx(afaik)的唯一方法是打開它並用word保存它:/如果您正在處理舊文檔,那麼您唯一的解決方案將是互操作性,我很害怕。 –

1

由於Office可能不支持Microsoft Office應用程序從任何無人值守的非交互式客戶端應用程序或組件(包括ASP,ASP.NET,DCOM和NT服務),因此Microsoft現在不推薦並不支持Microsoft Office應用程序的自動化。當Office在此環境中運行時表現出不穩定的行爲和/或死鎖。

如果您正在構建一個在服務器端上下文中運行的解決方案,那麼您應該嘗試使用對於無人執行安全的組件。或者,您應該嘗試找到允許至少部分代碼運行客戶端的替代方案。如果您從服務器端解決方案使用Office應用程序,則該應用程序將缺少成功運行所需的許多必要功能。此外,您將面臨整體解決方案穩定性的風險。請閱讀Considerations for server-side Automation of Office文章中的更多內容。

作爲解決方法,您可以使用Open XML SDK進行condider,有關更多信息,請參閱Welcome to the Open XML SDK 2.5 for Office。或者使用爲服務器端執行而設計的任何第三方組件。例如,看看Aspose。

相關問題