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 в качестве значения конфигурации, если вы хотите сделать его постоянным.