C# LoadIFilter()在所有PDF上都失败(但MS';s filtdump.exe不失败)

C# LoadIFilter()在所有PDF上都失败(但MS';s filtdump.exe不失败),c#,interop,ifilter,C#,Interop,Ifilter,我正试图编写一个C#实用程序,模仿Windows Search SDK中的filtdump.exe的行为(因为filtdump本身似乎不可再发行)。我遇到了一些矛盾和/或不存在的文档和技术问题,我似乎无法找到它们。我希望有人能帮助消除其中的一个障碍 根据MSDN,filtdump用于加载其IFilter。我认为MSDN是在撒谎,因为它还声称ILoadFilter::LoadIFilter只存在于Windows 7上,但filtedump在earler操作系统上运行良好。Process Monit

我正试图编写一个C#实用程序,模仿Windows Search SDK中的
filtdump.exe
的行为(因为
filtdump
本身似乎不可再发行)。我遇到了一些矛盾和/或不存在的文档和技术问题,我似乎无法找到它们。我希望有人能帮助消除其中的一个障碍

根据MSDN,
filtdump
用于加载其IFilter。我认为MSDN是在撒谎,因为它还声称
ILoadFilter::LoadIFilter
只存在于Windows 7上,但
filtedump
在earler操作系统上运行良好。Process Monitor指示它实际上正在从
query.dll
调用
LoadIFilter()
,所以我就是这么做的:

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做过这样的事情,可以看到我做错了什么?

加载IFilter失败,因为Adove PDF Filter标记为STA,而我们的c sharp应用程序默认为MTA,所以它无法加载PDF Filter。尝试使您的应用程序稳定,然后加载PDF筛选器


Ajax

我还希望filtdump使用的是旧的Win32,它可以从windows2000获得

我看到的问题与您通过在作业中运行调用过程解决的问题相同

虽然Win32 LoadIFilter()返回E_NOTIMPL note E_FAIL,但我在安装了Reader 10.1.5时也遇到了类似的问题

Adobe似乎打破了标准的Win32 LoadIFilter()调用,取消了通过IStorage接口的load方法将内容加载到IFilter中的功能,但对象仍然会通过QI返回可用的接口

对于Windows 7及更高版本上的该问题,您可以创建实现ILoadFilter的FilterRegistration对象,然后调用ILoadFilter::LoadIFilter()来创建filter COM对象。然后获取IPersistStream并使用包含文件内容的IStream对其调用Load()


对于较旧的版本,您需要首先在注册表中搜索筛选器CLSID,或者静态地将Adobe CLSID设置为配置值(如果要使其保持不变)。

您可能需要查看。简而言之,Adobe PDF filter的v10使用了一个允许使用该筛选器的应用程序白名单,包括Microsoft的诊断工具,如
filtdump.exe
,据说是一种“安全措施”。

我发现,除非安装了Acrobat Reader,否则无法从PDF中提取文本。IFilter GUID为e8978da6-047f-4e3d-9c78-cdbe46041603,实际的IFilter文件为C:\Program Files(x86)\Adobe\Reader 10.0\Reader\AcroRdIF.dll。希望你能从中找到一些有用的东西。这很有效。真不敢相信。我通过测试工具将其重命名为
filtdump.exe
,它开始工作。