无法使用 wpf webbrowser 打开 pdf
can't open pdf with wpf webbrowser
我正在尝试创建一个应用程序以在 WPF 中使用 Web 浏览器打开本地 PDF 文件。但是文件无法正常打开,而是显示 灰色空白屏幕 。当用于打开 HTML 文件时,该代码工作得很好。请帮忙!
代码:webBrowser1.Navigate(@"file:///C:/Working/sample.pdf");
注意:如果需要的话,我的 PC 上安装了 adobe reader。是吗?
WPF 默认使用基于 IE 的 WebBrowser。为了能够查看 PDF 文件,您必须在 IE 中安装一个可以显示 PDF 文件的插件。
除了灰色背景之外,如果 PC 的 IE 没有安装 PDF 插件(Acrobat Reader 等),也会出现这种情况:
如果您不想安装插件,解决此问题的一种方法是使用 Windows 10 APIs 绘制 PDF。
其他选项是第 3 方库,例如 CefSharp。以下是使用 CefSharp 的步骤:
首先安装Nuget CefSharp.WPF
其次,将 XAML 从默认的 WebBrowser 更改为:
<wpf:ChromiumWebBrowser Loaded="ChromiumWebBrowser_Loaded" x:Name="Browser"></wpf:ChromiumWebBrowser>
然后为 CefSharp 创建自定义解析器:
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();
}
}
几乎最后,在App.xaml.cs中注册解析器:
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();
}
}
我正在尝试创建一个应用程序以在 WPF 中使用 Web 浏览器打开本地 PDF 文件。但是文件无法正常打开,而是显示 灰色空白屏幕 。当用于打开 HTML 文件时,该代码工作得很好。请帮忙!
代码:webBrowser1.Navigate(@"file:///C:/Working/sample.pdf");
注意:如果需要的话,我的 PC 上安装了 adobe reader。是吗?
WPF 默认使用基于 IE 的 WebBrowser。为了能够查看 PDF 文件,您必须在 IE 中安装一个可以显示 PDF 文件的插件。
除了灰色背景之外,如果 PC 的 IE 没有安装 PDF 插件(Acrobat Reader 等),也会出现这种情况:
如果您不想安装插件,解决此问题的一种方法是使用 Windows 10 APIs 绘制 PDF。
其他选项是第 3 方库,例如 CefSharp。以下是使用 CefSharp 的步骤:
首先安装Nuget CefSharp.WPF
其次,将 XAML 从默认的 WebBrowser 更改为:
<wpf:ChromiumWebBrowser Loaded="ChromiumWebBrowser_Loaded" x:Name="Browser"></wpf:ChromiumWebBrowser>
然后为 CefSharp 创建自定义解析器:
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();
}
}
几乎最后,在App.xaml.cs中注册解析器:
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();
}
}