LoadIFilter () терпит неудачу на всех PDF-файлах (но filtdump MS.exe не делает.)

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

согласно MSDN,filtdump использует ILoadFilter::LoadIFilter для загрузки это IFilter. Я утверждаю, что MSDN лжет, так как он также утверждает ILoadFilter::LoadIFilter существует только в Windows 7, но filtdump отлично работает на ОС earler. 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 ответов


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


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

Ajax


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

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

Я также получил аналогичную проблему с Reader 10.1.5 установлен, хотя Win32 LoadIFilter() возвратил E_NOTIMPL не E_FAIL.

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

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

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