无法从 WebBrowser 打印并且 browser.Document 为空
Unable to print from WebBrowser and browser.Document is null
我有 System.Windows.Forms.WebBrowser
用于显示临时 pdf 文档。该文档由程序构建,在普通浏览器中工作正常。
通过调用browser.Navigate()
加载文件,pdf在实际应用中显示正常window,但调用browser.Print()
时触发错误:
我还注意到 browser.Document
仍然为空,即使在文档完成的回调期间也是如此:
browser.DocumentCompleted += documentCompletedHandler;
...
private void documentCompletedHandler(object sender, WebBrowserDocumentCompletedEventArgs e) {
WebBrowser b = sender as WebBrowser;
Console.WriteLine("Loaded: " + b.Url.AbsoluteUri); // Correct path.
// b.Document == null here and everywhere else.
}
XAML:
...
<WindowsFormsHost>
<wf:WebBrowser x:Name="browser" />
</WindowsFormsHost>
...
要在 WPF 应用程序中显示 PDF 文件,您正在使用 WinForms WebBrowser 控件,该控件使用 WPF 的 WindowsFormsHost 组件托管,因此您可以使用 Adobe PDF Reader DirectX 控件WPF 应用程序中的 Internet Explorer。
层次太多了,你不觉得吗?这很容易出错,所以让我们尝试简化系统:
首先,WPF 带有一个原生的 WebBrowser 控件(在 .NET 3.5 SP1 之后),因此您可以直接使用该控件,完全避免 WindowsFormsHost。
<WebBrowser Source="C:\SomeFile.pdf" />
http://www.c-sharpcorner.com/uploadfile/dhananjaycoder/web-browser-control-in-wpf/
http://www.wpf-tutorial.com/misc-controls/the-webbrowser-control/
这可能已经解决了您的问题,但是使用将使用 Adobe Reader Active X 的嵌入式浏览器可能不是最佳解决方案,因为它需要用户拥有 Adobe PDF Reader并且安装了 Adobe PDF ActiveX Reader 以及 IE 的工作版本。
一个解决方案是像您已经使用的那样使用 WindowsFormsHost,但不是使用 WebBrowser,而是使用 Adobe PDF Reader Active X for Windows Forms:
https://wpfpdfviewer.codeplex.com/
https://www.codeproject.com/Articles/380019/Using-Adobe-Reader-in-a-WPF-app
这会很好地工作,你不会有打印问题,但再次为了工作,用户需要在他们的系统中安装 Adobe PDF Reader。
最好的解决方案是使用没有任何外部依赖项的控件,为此,有许多高质量的商业组件(搜索 DevExpress 或 Telerik PDF 查看器控件)。
如果你想尝试一些开源的东西,我发现了这个但我自己从未使用过它:
我有 System.Windows.Forms.WebBrowser
用于显示临时 pdf 文档。该文档由程序构建,在普通浏览器中工作正常。
通过调用browser.Navigate()
加载文件,pdf在实际应用中显示正常window,但调用browser.Print()
时触发错误:
我还注意到 browser.Document
仍然为空,即使在文档完成的回调期间也是如此:
browser.DocumentCompleted += documentCompletedHandler;
...
private void documentCompletedHandler(object sender, WebBrowserDocumentCompletedEventArgs e) {
WebBrowser b = sender as WebBrowser;
Console.WriteLine("Loaded: " + b.Url.AbsoluteUri); // Correct path.
// b.Document == null here and everywhere else.
}
XAML:
...
<WindowsFormsHost>
<wf:WebBrowser x:Name="browser" />
</WindowsFormsHost>
...
要在 WPF 应用程序中显示 PDF 文件,您正在使用 WinForms WebBrowser 控件,该控件使用 WPF 的 WindowsFormsHost 组件托管,因此您可以使用 Adobe PDF Reader DirectX 控件WPF 应用程序中的 Internet Explorer。
层次太多了,你不觉得吗?这很容易出错,所以让我们尝试简化系统:
首先,WPF 带有一个原生的 WebBrowser 控件(在 .NET 3.5 SP1 之后),因此您可以直接使用该控件,完全避免 WindowsFormsHost。
<WebBrowser Source="C:\SomeFile.pdf" />
http://www.c-sharpcorner.com/uploadfile/dhananjaycoder/web-browser-control-in-wpf/
http://www.wpf-tutorial.com/misc-controls/the-webbrowser-control/
这可能已经解决了您的问题,但是使用将使用 Adobe Reader Active X 的嵌入式浏览器可能不是最佳解决方案,因为它需要用户拥有 Adobe PDF Reader并且安装了 Adobe PDF ActiveX Reader 以及 IE 的工作版本。
一个解决方案是像您已经使用的那样使用 WindowsFormsHost,但不是使用 WebBrowser,而是使用 Adobe PDF Reader Active X for Windows Forms:
https://wpfpdfviewer.codeplex.com/ https://www.codeproject.com/Articles/380019/Using-Adobe-Reader-in-a-WPF-app
这会很好地工作,你不会有打印问题,但再次为了工作,用户需要在他们的系统中安装 Adobe PDF Reader。
最好的解决方案是使用没有任何外部依赖项的控件,为此,有许多高质量的商业组件(搜索 DevExpress 或 Telerik PDF 查看器控件)。
如果你想尝试一些开源的东西,我发现了这个但我自己从未使用过它: