无法使用WPF WebBrowser打开PDF

5

我正试图创建一个应用程序,使用Web浏览器在WPF中打开本地PDF文件。但是,该文件无法正确打开,而是显示一个灰色空白屏幕。当用于打开HTML文件时,该代码运行得非常完美。请帮忙解决!

image

代码: webBrowser1.Navigate(@"file:///C:/Working/sample.pdf");

注意:我在个人电脑上安装了Adobe Reader,如果需要的话,请告诉我。


我已经按照您的设置进行了配置,上述代码完美地运行。如果您仍然遇到此问题,请发布XAML和CS代码,这将更容易确定问题所在。 - Matt Norrie
2个回答

4

WPF默认使用基于IE的WebBrowser。为了能够查看PDF文件,必须安装插件到IE中以显示PDF文件。

除了灰色背景外,如果IE没有安装PDF插件(如Acrobat Reader等),以下是可能发生的情况:

IE WPF PDF without plugin

如果您不想安装插件,则解决此问题的一种选择是使用Windows 10 APIs来绘制PDF文件。

另一个选择是使用第三方库,例如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);
    }
}

现在一切都应该正常工作:

WPF PDF CefSharp

关于使用CefSharp的更多信息:https://www.codeproject.com/Articles/881315/Display-HTML-in-WPF-and-CefSharp-Tutorial-Part


1

如果你遇到了问题,我可能会对@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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接