使用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通过下载处理程序下载。
我最早可以在OnBeforeBrows(通过URL)中告诉该网站正在尝试在面板中显示pdf,当然还可以在OnBeforeResourceLoad和OnResourceResponse中看到MIME类型。
我的问题是在这种情况下如何让我的浏览器使用默认插件?
我能想到的唯一解决方案是不设置CefCommandLineArgs.Add("disable-pdf-extension", "1")
从而允许这个特殊的概览功能工作。 但是,如果我希望所有其他PDF显示在默认PDF程序中,我需要拦截PDF下载(例如在OnBeforeBrowse中),并在其他.NET程序集(如HTTPWebRequest)的帮助下下载它。 这种方法的问题是我需要收集和发送cookie,感觉就像一个黑客,如果网站发生变化,它不会持续下去。
我相信这是一个非常独特的情况,但我会解释我的经历。虽然这可能也是一个网站问题,但它可能会帮助您处理 CefSharp 代码。
- 我没有禁用 pdf 查看器。这意味着所有 PDF 都将在浏览器窗口中呈现。
- 如果我选择希望我的PDF自动使用默认PDF应用程序打开,那么我会在OnResourceResponse方法中检查"application/pdf"的响应对象MIMEType。
- 然后,我在提供响应的 URL 上调用 StartDownload。
修补 - 我发现的问题开始下载打开了一组全新的问题。首先是调用startdownload后会发出新的请求和响应,这意味着您可能会陷入不断下载相同文件的循环中。在我的情况下,所有PDF都是由弹出窗口创建的,因此在LifeSpanHandler中,我创建了一个新的ChromiumBrowser,并且使用这个新创建的浏览器,我让我的IRequestHandler等待MIMEType,如上面的2所示。然后,我在主浏览器的IBrowser上调用了startDownload。 这意味着实际下载将在主浏览器和请求处理程序的不同实例上进行。
我还看到许多示例,其中人们只需在 BeforeBrowse 事件中检查 URL 中的".pdf",然后下载文件,同时还可以取消浏览。我无法这样做,因为该网站的URL中甚至没有PDF。我第一次能说出内容是在响应中。我没有实现的一件事是如何在这个(响应)阶段取消某些东西。在StackOverflow中有一个问题(现在找不到它),它讨论了将URL设置为"(无字符串)或假域。我还没有测试过这个,也不知道这是否能节省时间。