Как получить доступ к информации тегов в офисных файлах через C # - PullRequest
1 голос
/ 13 октября 2011

Я хотел бы написать простой фрагмент кода, который извлекал бы только информацию тега из набора офисных (docx, pptx и т. Д.) Файлов, которые существуют в каталоге, чтобы его можно было легко проиндексировать и найти.

Когда я говорю «тег», я имею в виду информацию о теге, которую вы можете добавить в файл с Vista. Обычно это делается с помощью Explorer. Например, файл pptx на приведенном ниже снимке экрана имеет прикрепленный тег «bubble».

Example

Но поиск по этим тегам уже встроен в Windows, говорите? Да, но мне это нужно только для индексации тегов, и мне нужно раскрывать информацию через интранет, а не внутри Windows.

Я обнаружил, что в пакете офисных файлов фактическая информация хранится в файле /docProps/core.xml в элементе cp: Keywords. И я понимаю, что в коде я могу разархивировать файл, получить доступ к этому файлу и извлечь то, что мне нужно. Однако я надеюсь, что где-то есть заранее подготовленное решение. Я серьезно сомневаюсь, что именно это делает Windows, чтобы проиндексировать ту же информацию (но, по общему признанию, я не могу найти никакой полезной информации по ней).

Я также нашел некоторые обсуждения о IFilters . И все же, это обращается к тексту файла. Я не вижу, где IFilter помогает решить эту конкретную проблему.

Кто-нибудь может указать мне правильное направление на этом?

1 Ответ

1 голос
/ 14 октября 2011

У меня не установлено слово, но я предполагаю, что они доступны из стандартной системы свойств как записи KEYWORD, как и теги на картинке jpg.

Если вы хотите точно знать, как это делается, я поигрался с COM API оболочки и вот полный пример кода в Gist: FileTags.cs . Но это было просто для удовольствия, вы должны использовать Microsoft Windows API Code Pack , так как их реализация намного чище.

Чтобы получить теги (называемые внутренними ключевыми словами), ссылка 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, но без них действительно раздражает ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...