c# - LoadIFilter() 在所有 PDF 上都失败(但 MS 的 filtdump.exe 没有。)

标签 c# interop ifilter

我正在尝试编写一个 C# 实用程序来模仿 Windows Search SDK 中 filtdump.exe 的行为(因为 filtdump 本身似乎不可再分发.) 我遇到了相互矛盾和/或不存在的文档以及我似乎无法追踪的技术问题的组合。我希望有人可以帮助消除这些障碍中的一个或另一个...

根据 MSDN,filtdump 使用 ILoadFilter::LoadIFilter加载它的 IFilter。我认为 MSDN 在撒谎,因为它还声称 ILoadFilter::LoadIFilter 仅存在于 Windows 7 上,但 filtdump 在较早的操作系统上运行良好。 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 都给我一个 0x80004005 的 HRESULT,E_FAIL。

这与 this question 中的错误相同但我在每个 PDF 上都得到它,而filtdump 不是,所以我知道IFilter 至少在处理一些文档。以前有没有人用 PDF 做过这种事情,可以看到我做错了什么?

最佳答案

你可能想看看 this blog post .简而言之,Adobe 的 PDF 过滤器 v10 使用允许使用过滤器的应用程序白名单,包括 Microsoft 的诊断工具,如 filtdump.exe,据称是一种“安全措施”。

关于c# - LoadIFilter() 在所有 PDF 上都失败(但 MS 的 filtdump.exe 没有。),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7177953/

相关文章:

c# - 在 .NET 中使用恢复/重试支持从 HTTP 下载大文件?

C# IFilterSample,任何人都可以让它工作吗?

windows - 如何在 WiX 片段中获得编辑注册表 CLSID 的提升权限

c# - 域名无效 Azure Active Directory 问题和迁移到 Microsoft Graph C# 应用程序

c# - Kinect SDK 需要 Visual Studio?

c# - 将 c 字符数组 [128] 编码到 c#

c++ - 在 Visual Studio 中调试由非托管 C++ 二进制文件加载的 .NET COM DLL

c# - 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

c# - A-Star (A*) 和通用查找方法

.net - 如何使用 COM 在 .NET 和 C++ 之间传递结构?