我正试图创建一个应用程序,使用Web浏览器在WPF中打开本地PDF文件。但是,该文件无法正确打开,而是显示一个灰色空白屏幕。当用于打开HTML文件时,该代码运行得非常完美。请帮忙解决!
代码: webBrowser1.Navigate(@"file:///C:/Working/sample.pdf");
注意:我在个人电脑上安装了Adobe Reader,如果需要的话,请告诉我。
我正试图创建一个应用程序,使用Web浏览器在WPF中打开本地PDF文件。但是,该文件无法正确打开,而是显示一个灰色空白屏幕。当用于打开HTML文件时,该代码运行得非常完美。请帮忙解决!
代码: webBrowser1.Navigate(@"file:///C:/Working/sample.pdf");
注意:我在个人电脑上安装了Adobe Reader,如果需要的话,请告诉我。
WPF默认使用基于IE的WebBrowser。为了能够查看PDF文件,必须安装插件到IE中以显示PDF文件。
除了灰色背景外,如果IE没有安装PDF插件(如Acrobat Reader等),以下是可能发生的情况:
如果您不想安装插件,则解决此问题的一种选择是使用Windows 10 APIs来绘制PDF文件。
另一个选择是使用第三方库,例如CefSharp。以下是使用CefSharp的步骤:
首先安装Nuget CefSharp.WPF
其次,将XAML从默认的WebBrowser更改为:
<wpf:ChromiumWebBrowser Loaded="ChromiumWebBrowser_Loaded" x:Name="Browser"></wpf:ChromiumWebBrowser>
public class CustomProtocolSchemeHandler : ResourceHandler
{
public CustomProtocolSchemeHandler()
{
}
public override bool ProcessRequestAsync(IRequest request, ICallback callback)
{
return true;
}
}
public class CustomProtocolSchemeHandlerFactory : ISchemeHandlerFactory
{
public const string SchemeName = "customFileProtocol";
public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
{
return new CustomProtocolSchemeHandler();
}
}
public partial class App : Application
{
protected override void OnLoadCompleted(NavigationEventArgs e)
{
var settings = new CefSettings();
settings.RegisterScheme(new CefCustomScheme
{
SchemeName = CustomProtocolSchemeHandlerFactory.SchemeName,
SchemeHandlerFactory = new CustomProtocolSchemeHandlerFactory(),
IsCSPBypassing = true
});
settings.LogSeverity = LogSeverity.Error;
Cef.Initialize(settings);
}
}
现在一切都应该正常工作:
关于使用CefSharp的更多信息:https://www.codeproject.com/Articles/881315/Display-HTML-in-WPF-and-CefSharp-Tutorial-Part
如果你遇到了问题,我可能会对@Mikael的代码进行一些修改。
public class CustomProtocolSchemeHandler : ResourceHandler
{
public CustomProtocolSchemeHandler()
{
}
public override CefSharp.CefReturnValue ProcessRequestAsync(IRequest request, ICallback callback)
{
return CefSharp.CefReturnValue.Continue;
}
}
public class CustomProtocolSchemeHandlerFactory : ISchemeHandlerFactory
{
public const string SchemeName = "customFileProtocol";
public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
{
return new CustomProtocolSchemeHandler();
}
}