IE11下C# WebBrowser控件打印MHT文件耗时过长求助
我之前也碰到过一模一样的问题——用C#的WebBrowser控件打印带大量外部联网链接的MHT时,IE一直在后台尝试加载那些网络资源,直接导致打印卡到离谱。结合你的情况,给你几个亲测有效的解决思路:
1. 给WebBrowser强制开启脱机模式(模拟旧IE的Work Offline)
虽然IE11的UI里砍掉了脱机工作选项,但WebBrowser的底层API还是支持强制脱机的。你可以在控件初始化时修改系统设置,让它彻底放弃加载外部网络资源:
using Microsoft.Win32; using System.Windows.Forms; public void EnableWebBrowserOfflineMode(WebBrowser browser) { // 修改当前用户的IE注册表设置,开启脱机模式 var regPath = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings"; using (var regKey = Registry.CurrentUser.OpenSubKey(regPath, true)) { regKey?.SetValue("GlobalUserOffline", 1, RegistryValueKind.DWord); } // 刷新控件让设置生效 browser.Refresh(WebBrowserRefreshOption.Completely); }
调用这个方法后,WebBrowser就会像旧IE脱机状态一样,只加载MHT包里的本地内容,不会再去请求外部链接。记得打印完成后可以把GlobalUserOffline改回0,避免影响其他依赖网络的功能。
2. 预处理MHT文件,移除外部资源链接
如果不想动系统注册表,你可以先解析MHT文件,把里面指向外部网络的资源链接替换或注释掉。MHT本质是MIME格式的文本文件,用简单的文本处理就能搞定:
using System.IO; using System.Text.RegularExpressions; public string ProcessMhtToRemoveExternalLinks(string mhtFilePath) { var mhtContent = File.ReadAllText(mhtFilePath); // 匹配img、script、link等标签里的http/https链接,替换为空或占位符 var processedContent = Regex.Replace( mhtContent, @"(src|href)=""http(s)?://.*?""", @"$1=""#""", RegexOptions.IgnoreCase ); return processedContent; }
处理后的内容可以直接加载到WebBrowser里,打印时就不会有多余的联网请求了。如果需要更精准的解析,也可以用专门的MHT解析库来处理。
3. 转成PDF后再打印(彻底绕开IE渲染的坑)
另一种更彻底的思路是先把MHT转换成PDF,再打印PDF文件。这样不仅能避免联网加载的问题,打印速度也会快很多。Windows 10及以上自带「Microsoft Print to PDF」打印机,你可以用WebBrowser配合它实现自动化转换:
using System.Windows.Forms; public void PrintMhtAsPdf(string mhtFilePath) { using (var browser = new WebBrowser()) { browser.ScrollBarsEnabled = false; browser.Navigate(mhtFilePath); // 等待页面完全加载 while (browser.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } // 调用打印对话框,选择Microsoft Print to PDF browser.ShowPrintDialog(); } }
如果需要完全自动化打印(不需要用户选择打印机),可以调用Windows API来指定PDF打印机,实现无交互打印。
这几个方案我都实际用过,前两个针对WebBrowser本身的问题,第三个更适合长期解决这类IE渲染相关的麻烦,你可以根据自己的场景选最顺手的。
内容的提问来源于stack exchange,提问作者Viral

