如何通过C#访问office文件的标签信息

我想编写一段简单的代码,它只从目录中存在的一组office(docx,pptx等)文件中提取标记信息,以便可以轻松地对其进行索引和搜索。

当我说“标签”时,我指的是自Vista以来你可以添加到文件中的标签信息。 它通常使用Explorer完成。 例如,下面屏幕截图中的pptx文件附有标签“bubble”。

例

但是,搜索这些标签已经内置到Windows中,你说呢? 为什么,是的,但我需要这个只对索引进行索引,我需要通过Intranet而不是在Windows内部公开信息。

我发现在office文件包中,实际信息存储在cp:keywords元素的/docProps/core.xml文件中。 我确实意识到,在代码中,我可以解压缩文件,访问该文件,并提取我需要的内容。 不过,我希望那里有一个预先抽象的解决方案。 我严重怀疑Windows正在做什么来索引相同的信息(但诚然,我真的找不到任何好的信息)。

我也发现了一些关于IFilters的讨论。 然而,这会访问文件的文本。 我没有看到IFilter在哪里帮助解决这个特殊问题。

谁能指出我在这个方向上的正确方向?

我没有安装单词,但我猜他们可以从标准属性系统访问它们作为KEYWORD条目和jpg图片上的标签。

如果你想知道它是如何完成的,我使用shell COM API,这里是Gist: FileTags.cs中的完整示例代码。 但这只是为了好玩,你应该使用Microsoft Windows API代码包,因为它们的实现更加清晰。

要获取标记(在内部称为关键字),请引用Microsoft.WindowsAPICodePack.Shell.dll

 using System; using Microsoft.WindowsAPICodePack.Shell; class Program { static void Main() { var shellFile = ShellFile.FromFilePath(@"C:\path\to\some\file.jpg"); var tags = (string[])shellFile.Properties.System.Keywords.ValueAsObject; tags = tags ?? new string[0]; Console.WriteLine("Tags: {0}", String.Join("; ", tags)); Console.ReadLine(); } } 

如果他们没有搞砸它应该从Windows XP SP2开始工作( 我应该从SP1工作,因为我避开了PropVariantGetStringElem,但没有它们真的很烦人 )。