使用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)的帮助下下载它。这种方法的问题是我需要收集和发送cookie,感觉就像一个黑客,如果网站改变不会持续。
我相信这是一个非常独特的情况,但我将解释我的经验。虽然这可能更像是一个网站问题,但它可能会帮助您使用CefSharp代码。
修补 - 我发现的问题开始下载开启了一系列全新的问题。首先是在调用startdownload后发出新的请求和响应,这意味着你可能会陷入不断下载同一文件的循环中。在我的情况下,所有PDF都是由PopUp窗口创建的,所以在LifeSpanHandler中我创建了一个新的ChromiumBrowser,并且使用这个新创建的浏览器,让我的IRequestHandler等待上面2中所示的MIMEType。然后我在主浏览器的IBrowser上调用了startDownload。这意味着实际下载将在主浏览器和RequestHandler的不同实例上进行。
我还看到很多例子,人们只是在BeforeBrowse事件的URL中检查“.pdf”,然后下载文件,同时也能取消浏览。我不能这样做,因为该网站甚至没有URL中的PDF。我第一次告诉内容是在响应中。我没有实现的一件事是如何在此(响应)阶段取消某些内容。 StackOverflow中有一个问题(现在找不到),它讨论了将URL设置为“”(无字符串)或假域名。我没有测试过,也不知道这是否可以节省时间。