使用 CEFSharp 的 "quick view" 选项处理特殊网站上的 PDF 文件
Handling PDFs files on special websites with a "quick view" option with CEFSharp
对于 CEFsharp,我希望可以选择允许 PDF 插件显示 PDF,或者使用 PC 上安装的默认 PDF 程序下载和显示文件。
为了在默认的 PDF 程序中显示,我使用了 CefCommandLineArgs.Add("disable-pdf-extension", "1")
命令并实现了下载处理程序接口。为了在插件中显示 pdf,我没有设置命令 CefCommandLineArgs.Add("disable-pdf-extension", "1")
,这反过来意味着不会调用下载处理程序。
有一个网站具有某种文件快速查看功能。这意味着它有一个显示文件的面板。问题是 CefCommandLineArgs.Add("disable-pdf-extension", "1")
然后网站面板留空,PDF 是通过下载处理程序下载的。
我早在 OnBeforeBrowse(通过 URL)就可以知道该网站正试图在面板中显示 pdf,当然可以在 OnBeforeResourceLoad 和 OnResourceResponse 中看到 MIME 类型。
我的问题是在这种情况下如何让我的浏览器使用默认插件?
我能想到的唯一解决办法是不设置 CefCommandLineArgs.Add("disable-pdf-extension", "1")
从而使这个特殊的快速查看功能起作用。但是,如果我希望所有其他 PDF 显示在默认 PDF 程序中,我需要拦截 PDF 下载(例如在 OnBeforeBrowse 中)并在其他 .NET 程序集(如 HTTPWebRequest)的帮助下下载它。这种方法的问题是我需要收集和发送 cookie,如果网站发生变化,感觉就像一个不会持续的 hack。
我相信这是一个非常独特的情况,但我会解释我的经历。虽然这也可能更多是网站问题,但它可能会帮助您处理 CefSharp 代码。
- 我没有禁用 pdf 查看器。这意味着所有 PDF 都将在浏览器中呈现 window。
- 如果我选择希望我的 PDF 使用默认 PDF 应用程序自动打开,那么我会在 OnResourceResponse Method 中检查 "application/pdf" 的响应对象 MIMEType。
- 然后我在提供响应的 URL 上调用 StartDownload。
修补 - 我发现的问题
开始下载会带来一系列全新的问题。第一个是在您调用 startdownload 之后发出新的请求和响应,这意味着您可能会陷入不断下载同一文件的循环。在我的例子中,所有 PDF 都是由 PopUp window 创建的,因此在 LifeSpanHandler 中我创建了一个新的 ChromiumBrowser 并且使用这个新创建的浏览器我让 IRequestHandler 等待上面 2 中指示的 MIMEType。然后,我在主浏览器的 IBrowser 上调用了 startDownload。这意味着实际下载将发生在主浏览器和 RequestHandler 的不同实例上。
我还看到很多例子,人们只是在 BeforeBrowse 事件的 URL 中检查“.pdf”,然后下载文件,同时还可以取消浏览。我无法做到这一点,因为该网站在 URL 中甚至没有 PDF。我第一次知道内容是在响应中。我还没有实现的一件事是如何在这个(响应)阶段取消一些东西。 Whosebug 中有一个问题(现在找不到)讨论将 URL 设置为“”(无字符串)或假域。我没有测试过这个,不知道这是否节省时间。
对于 CEFsharp,我希望可以选择允许 PDF 插件显示 PDF,或者使用 PC 上安装的默认 PDF 程序下载和显示文件。
为了在默认的 PDF 程序中显示,我使用了 CefCommandLineArgs.Add("disable-pdf-extension", "1")
命令并实现了下载处理程序接口。为了在插件中显示 pdf,我没有设置命令 CefCommandLineArgs.Add("disable-pdf-extension", "1")
,这反过来意味着不会调用下载处理程序。
有一个网站具有某种文件快速查看功能。这意味着它有一个显示文件的面板。问题是 CefCommandLineArgs.Add("disable-pdf-extension", "1")
然后网站面板留空,PDF 是通过下载处理程序下载的。
我早在 OnBeforeBrowse(通过 URL)就可以知道该网站正试图在面板中显示 pdf,当然可以在 OnBeforeResourceLoad 和 OnResourceResponse 中看到 MIME 类型。
我的问题是在这种情况下如何让我的浏览器使用默认插件?
我能想到的唯一解决办法是不设置 CefCommandLineArgs.Add("disable-pdf-extension", "1")
从而使这个特殊的快速查看功能起作用。但是,如果我希望所有其他 PDF 显示在默认 PDF 程序中,我需要拦截 PDF 下载(例如在 OnBeforeBrowse 中)并在其他 .NET 程序集(如 HTTPWebRequest)的帮助下下载它。这种方法的问题是我需要收集和发送 cookie,如果网站发生变化,感觉就像一个不会持续的 hack。
我相信这是一个非常独特的情况,但我会解释我的经历。虽然这也可能更多是网站问题,但它可能会帮助您处理 CefSharp 代码。
- 我没有禁用 pdf 查看器。这意味着所有 PDF 都将在浏览器中呈现 window。
- 如果我选择希望我的 PDF 使用默认 PDF 应用程序自动打开,那么我会在 OnResourceResponse Method 中检查 "application/pdf" 的响应对象 MIMEType。
- 然后我在提供响应的 URL 上调用 StartDownload。
修补 - 我发现的问题 开始下载会带来一系列全新的问题。第一个是在您调用 startdownload 之后发出新的请求和响应,这意味着您可能会陷入不断下载同一文件的循环。在我的例子中,所有 PDF 都是由 PopUp window 创建的,因此在 LifeSpanHandler 中我创建了一个新的 ChromiumBrowser 并且使用这个新创建的浏览器我让 IRequestHandler 等待上面 2 中指示的 MIMEType。然后,我在主浏览器的 IBrowser 上调用了 startDownload。这意味着实际下载将发生在主浏览器和 RequestHandler 的不同实例上。
我还看到很多例子,人们只是在 BeforeBrowse 事件的 URL 中检查“.pdf”,然后下载文件,同时还可以取消浏览。我无法做到这一点,因为该网站在 URL 中甚至没有 PDF。我第一次知道内容是在响应中。我还没有实现的一件事是如何在这个(响应)阶段取消一些东西。 Whosebug 中有一个问题(现在找不到)讨论将 URL 设置为“”(无字符串)或假域。我没有测试过这个,不知道这是否节省时间。