LoadIFilter () завершается с ошибкой во всех PDF-файлах (но MS Filterdump.exe этого не делает). - PullRequest
6 голосов
/ 24 августа 2011

Я пытаюсь написать утилиту для C #, которая имитирует поведение filtdump.exe из Windows Search SDK (поскольку filtdump сама по себе не может распространяться). Я сталкиваюсь с противоречивой комбинацией и/ или несуществующая документация и технические проблемы, которые я не могу отследить.Я надеюсь, что кто-то может помочь устранить одно или другое из этих препятствий ...

Согласно MSDN, filtdump использует ILoadFilter::LoadIFilter для загрузки своего IFilter.Я утверждаю, что MSDN лжет, поскольку он также утверждает, что ILoadFilter::LoadIFilter существует только в Windows 7, но filtdump отлично работает на более ранних ОС.Process Monitor показывает, что он на самом деле вызывает LoadIFilter() из query.dll, поэтому я и делаю:

public static class NativeMethods
{
    // From Windows SDK v7.1, NTQuery.h
    [DllImport("query.dll", CharSet = CharSet.Unicode)]
    public static extern int LoadIFilter(
        string pwcsPath,
        [MarshalAs(UnmanagedType.IUnknown)] 
        ref object pUnkOuter,
        ref IFilter ppIUnk);
}

object iUnknown = null;
IFilter filter = null;
var result = NativeMethods.LoadIFilter(args[0], ref iUnknown, ref filter);
if (result != ResultCodes.S_OK)
{
  Console.WriteLine("Failed to load an IFilter for {0}: {1}", args[0], result);
  return;
}

По большей части это приложение и filtdump дают мне одинаковые результаты -они могут как открывать, так и извлекать текст из текста, документов Word и электронных писем Outlook, и оба сбои в том же наборе других документов, которые не имеют IFilter.Тем не менее, PDF-файлы вызывают у меня проблемы.Filtdump удается открыть и извлечь текст из большинства брошенных мной PDF-файлов, но каждый из PDF-файлов, которые я пробую с помощью своего собственного приложения, дает мне HRESULT 0x80004005, E_FAIL.

Это та же ошибка из этого вопроса , но я получаю его на каждый PDF, а filtdump нет, поэтому я знаю, что IFilter работает хотя бы над некоторыми документами,Кто-нибудь делал подобные вещи раньше с PDF-файлами, которые видят, что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 03 февраля 2014

Возможно, вы захотите посмотреть это сообщение в блоге .Короче говоря, в v10 PDF-фильтра Adobe используется белый список приложений, которым разрешено использовать фильтр, включая диагностические инструменты Microsoft, такие как filtdump.exe, предположительно в качестве «меры безопасности».

1 голос
/ 22 февраля 2012

Загрузка IFilter не удалась, потому что Adove PDF Filter помечен как STA, а наше приложение c по умолчанию является MTA, поэтому оно не может загрузить PDF Filter. Попробуйте сделать свое приложение STA, затем загрузите PDF Filter.

Ajax

0 голосов
/ 26 марта 2013

Я также ожидаю, что filterdump использует старый вызов Win32 LoadIFilter , который был доступен из Windows 2000.

Я видел ту же проблему, что и вы, выполнив вызывающий процесс вработа.https://stackoverflow.com/a/8841476/1111659.

У меня также была похожая проблема с установленным Reader 10.1.5, хотя Win32 LoadIFilter () вернул E_NOTIMPL, а не E_FAIL.

Похоже, Adobe сломал стандартный Win32 LoadIFilter () вызов, удалив возможность загружать содержимое в IFilter через метод Load интерфейса IStorage, но объект по-прежнему возвращает этот интерфейс как доступный через QI.

Для этой проблемы в Windows 7 и более поздних версиях вы можете создать FilterRegistrationобъект, который реализует ILoadFilter и затем вызывает ILoadFilter :: LoadIFilter () для создания COM-объекта фильтра.Затем получите IPersistStream и вызовите Load () для этого с IStream, содержащим содержимое файла.

Для более старых версий вам сначала нужно найти CLSID фильтра в реестре или статически установить Adobe CLSID в качестве значения конфигурацииесли вы хотите сделать его постоянным.

...