首页 > 解决方案 > 使用 CEFSharp 的“快速查看”选项处理特殊网站上的 PDF 文件

问题描述

使用 CEFsharp,我希望可以选择允许 PDF 插件显示 PDF,或者下载文件并使用安装在 PC 上的默认 PDF 程序显示。

为了在默认的 PDF 程序中显示,我正在使用CefCommandLineArgs.Add("disable-pdf-extension", "1")命令并实现 downloadhandler 接口。为了在插件中显示 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)的帮助下下载它。这种方法的问题是我需要收集和发送cookies,感觉就像一个黑客,如果网站发生变化,它就不会持续下去。

标签: cefsharpchromium-embedded

解决方案


我相信这是一个非常独特的情况,但是我将解释我的经验。虽然这也可能更多是网站问题,但它可以帮助您处理 CefSharp 代码。

  1. 我没有禁用 pdf 查看器。这意味着所有 PDF 都将在浏览器窗口中呈现。
  2. 如果我选择希望我的 PDF 使用默认 PDF 应用程序自动打开,那么我在OnResourceResponse Method中检查“application/pdf”的响应对象 MIMEType 。
  3. 然后我在提供响应的 URL 上调用StartDownload

修补 - 我发现的问题 开始下载会引发一系列全新的问题。首先是在您调用 startdownload 后会发出新的请求和响应,这意味着您可能会陷入不断下载同一文件的循环中。在我的情况下,所有 PDF 都是由 PopUp 窗口创建的,因此在 LifeSpanHandler 中我创建了一个新的 ChromiumBrowser,并使用这个新创建的浏览器让我的 IRequestHandler 等待 MIMEType,如上面 2 所示。然后我在主浏览器的 IBrowser 上调用了 startDownload。这意味着实际下载将发生在主浏览器和 RequestHandler 的不同实例上。

我还看到很多例子,人们只是在 BeforeBrowse 事件的 URL 中检查“.pdf”,然后下载文件,同时还可以取消浏览。我不能这样做,因为该网站的 URL 中甚至没有 PDF。我第一次知道内容是在响应中。我没有实现的一件事是如何在这个(响应)阶段取消某些东西。StackOverflow 中有一个问题(现在找不到),它讨论了将 URL 设置为“”(无字符串)或假域。我没有对此进行测试,也不知道这是否可以节省时间。


推荐阅读