无法从 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 组件托管,因此您可以使用 Adob​​e 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/

这可能已经解决了您的问题,但是使用将使用 Adob​​e Reader Active X 的嵌入式浏览器可能不是最佳解决方案,因为它需要用户拥有 Adob​​e PDF Reader并且安装了 Adob​​e PDF ActiveX Reader 以及 IE 的工作版本。

一个解决方案是像您已经使用的那样使用 WindowsFormsHost,但不是使用 WebBrowser,而是使用 Adob​​e PDF Reader Active X for Windows Forms:

https://wpfpdfviewer.codeplex.com/ https://www.codeproject.com/Articles/380019/Using-Adobe-Reader-in-a-WPF-app

这会很好地工作,你不会有打印问题,但再次为了工作,用户需要在他们的系统中安装 Adob​​e PDF Reader。

最好的解决方案是使用没有任何外部依赖项的控件,为此,有许多高质量的商业组件(搜索 DevExpress 或 Telerik PDF 查看器控件)。

如果你想尝试一些开源的东西,我发现了这个但我自己从未使用过它:

https://github.com/reliak/moonpdf