IFilter – Извлечение текста из файлов разных форматов

Компоненты встроенного в Windows механизма полнотекстового поиска можно использовать не только по их прямому назначению. Мало кто знает, но эта возможность позволяет легко решать задачу получения текста из файлов почти любого формата, который поддерживается системой (а поддерживается очень большое их количество).

Так как для выполнения полнотекстового поиска первичной задачей является выделение чистого текста из исходного файла в Windows такая возможность уже реализована. Встроенный поиск работает замечательно с большинством поддерживаемых форматов. За получение текста из файлов отвечает набор классов, реализующих интерфейс IFilter.

Где же взять эти классы? Как правило нигде их брать не нужно, все устанавливается автоматически с различными приложениями. К примеру, если вы установили в своей системе OpenOffice то нужный фильтр у вас уже есть. Интересно что при установке MS Office Professional появляется возможность выделять текст из TIFF файлов!!! Мы были в шоке когда на это наткнулись в первый раз 🙂

Можно установить фильтры и отдельно от приложений. Несколько бесплатных фильтров, которые могут быть полезны, можно найти на IFilter.org

Для того, чтобы посмотреть список установленных фильтров можно воспользоваться простой утилитой от citeknet.com(ссылка на приложение в конце статьи)

Как же это все можно использовать в реальных программах? Не буду изобретать велосипед — Eyal Post в своей статье на CodeProject поделился с нами исходными текстами “обертки” на C#, позволяющей легко, при помощи всего одного вызова автоматически распознавать формат указанного файла, загружать подходящий объект и выделять из него текст. Кроме того уже решены некоторые проблемы с многопоточностью и возможной утечкой памяти. Мы применяем эту библиотеку в реальном проекте уже более года – каких то проблем в ней не выявлено. Хотя есть у этой реализации и недостаток: Изначально IFilter позволяет использовать не только файлы, хранимые на диске но и массивы данных в оперативной памяти. Обертка, о которой говорилось выше работу с данными в памяти не поддерживает.

Использовать класс очень просто. Вот пример:

  1: TextReader reader=new FilterReader(fileName);
  2: using (reader)
  3: {
  4:   textBox1.Text=reader.ReadToEnd();
  5: }

На вход подается имя файла, на выходе получаем текст. Обратите внимание – тип файла определяется по его расширению. Более сложные примеры применения я описывать не буду, смотрите в статье на CodeProject.

Ниже представлен screenshot окна тестового приложения с CodeProject, которое позволяет продемонстрировать работу класса вживую на вашей системе

Ссылки:
IFilter.org
IFilter Explorer
Статья, в которой описана реализация работы с IFilter
Файлы к статье (для тех, кто не зарегистрирован на CodeProject)

IFilter – Извлечение текста из файлов разных форматов: 6 комментариев

  1. Андрей Шилов

    По поводу выделения текста из TIFF`ов: подскажите, пожалуйста, как свершить сие чудное действие на 64-битной ОС?

  2. dv

    К сожалению, на 64 битной системе я это попробовать в ближайшее время не могу … Вообще, обязательное условие — наличие установленного MS Office версии не ниже Professional. Именно в состав MS Office входит соответствующий IFilter. Подозреваю этим занимается компонент MS Office Imaging.

  3. Алексей

    Добрый день
    т.е. используя эту библиотеку, если у меня установлены соответствующие классы, я могу не париться, что за документ у меня идет на вход?
    Спасибо

  4. Алексей

    Спасибо за ответ, а Вы не могли немного рассказать об установке новых классов и их регистрации в системе. Спасибо.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *