.NET Framework4.0 WinForm中WebBrowser用DocumentStream无法显示PDF
问题描述
我有一个基于.NET Framework 4.0的WinForm程序,想要弹出窗口显示PDF文件。
最初我尝试直接将PDF的URL赋值给WebBrowser控件的Url属性,效果很好:
WebBrowser browser = new WebBrowser(); browser.Url = new Uri("http://www.somestuff.com/pdf"); browser.BringToFront(); browser.Show();
但后来我需要访问一个需要Windows身份验证的URL来获取PDF,于是修改了代码:先通过HttpWebRequest获取PDF流,再将流赋值给WebBrowser的DocumentStream属性,代码如下:
WebBrowser browser = new WebBrowser(); HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create("http://www.somestuff.com/pdf"); request.Credentials = new NetworkCredential() { UserName = "user", Password = "pass", Domain = "domain" }; HttpWebResponse response = (HttpWebResponse) request.GetResponse(); browser.DocumentStream = response.GetResponseStream(); browser.BringToFront(); browser.Show();
此时WebBrowser控件显示空白,没有任何内容。但在真实浏览器中输入该URL并提供凭证后,PDF可以正常显示。请问需要做出哪些修改或添加什么内容才能解决这个问题?拥有流的情况下应该可以正常显示才对,不是吗?
解决方法
WebBrowser控件的DocumentStream属性默认按HTML内容处理,直接传入PDF流无法触发PDF阅读器插件解析,所以会显示空白。可通过以下方式解决:
方法一:将PDF流保存为临时文件,再让WebBrowser打开临时路径
WebBrowser browser = new WebBrowser(); HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.somestuff.com/pdf"); request.Credentials = new NetworkCredential() { UserName = "user", Password = "pass", Domain = "domain" }; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using (Stream responseStream = response.GetResponseStream()) { // 创建唯一临时PDF文件 string tempPdfPath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.pdf"); using (FileStream fs = new FileStream(tempPdfPath, FileMode.Create)) { responseStream.CopyTo(fs); } // 让WebBrowser打开临时文件 browser.Url = new Uri(tempPdfPath); } browser.BringToFront(); browser.Show(); // 可选:程序退出时清理临时文件
方法二:通过HTML嵌入PDF流,触发插件解析
给WebBrowser明确指定内容类型为PDF,用HTML的object标签嵌入base64编码的PDF内容:
WebBrowser browser = new WebBrowser(); HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.somestuff.com/pdf"); request.Credentials = new NetworkCredential() { UserName = "user", Password = "pass", Domain = "domain" }; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using (Stream responseStream = response.GetResponseStream()) { // 将流转为字节数组 byte[] pdfBytes; using (MemoryStream ms = new MemoryStream()) { responseStream.CopyTo(ms); pdfBytes = ms.ToArray(); } // 生成嵌入PDF的HTML内容 browser.DocumentText = $@" <html> <body style='margin:0'> <object data='data:application/pdf;base64,{Convert.ToBase64String(pdfBytes)}' type='application/pdf' width='100%' height='100%'> <p>无法显示PDF,请确认已安装PDF阅读器插件。</p> </object> </body> </html>"; } browser.BringToFront(); browser.Show();
方法三:强制WebBrowser使用IE11渲染模式(系统需安装IE11)
旧版WebBrowser默认用IE7模式,对PDF支持有限。可在app.config中添加配置提升兼容性:
<configuration> <appSettings> <add key="WebBrowserControlVersion" value="11001" /> </appSettings> <system.windows.forms> <webBrowser> <control renderMode="Edge" /> </webBrowser> </system.windows.forms> </configuration>
内容的提问来源于stack exchange,提问作者user729400
相关产品推荐
相关产品推荐

