使用CefSharp显示本地PDF文件

问题描述 投票:2回答:2

我正在尝试使用自定义LocalSchemeHandler显示本地pdf文件,该文件从文件中读取内存流。

该文件存在,正在正确读取内存流。但是浏览器窗口中没有显示任何内容。通过文件方案显示相同的文件。

ResourceHandler:

public class LocalSchemeHandler : ResourceHandler
{
    public override bool ProcessRequestAsync(IRequest request, ICallback callback)
    {
        var uri = new Uri(request.Url);
        var file = uri.AbsolutePath;

        Task.Run(() =>
        {
            using (callback)
            {
                if (!File.Exists(file))
                {
                    callback.Cancel();
                    return;
                }

                byte[] bytes = File.ReadAllBytes(file);

                var stream = new MemoryStream(bytes);
                if (stream == null)
                {
                    callback.Cancel();
                }
                else
                {
                    stream.Position = 0;
                    ResponseLength = stream.Length;

                    var fileExtension = Path.GetExtension(file);
                    MimeType = GetMimeType(fileExtension);
                    StatusCode = (int)HttpStatusCode.OK;
                    Stream = stream;

                    callback.Continue();
                }
            }
        });

        return true;
    }
}

ISchemeHandlerFactory:

public class CustomProtocolSchemeHandlerFactory : ISchemeHandlerFactory
{
    public const string SchemeName = "local";

    public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
    {
        return new LocalSchemeHandler();
    }
}

设置:

var settings = new CefSettings();
settings.RegisterScheme(new CefCustomScheme
{
    SchemeName = CustomProtocolSchemeHandlerFactory.SchemeName,
    SchemeHandlerFactory = new CustomProtocolSchemeHandlerFactory()
});
// Increase the log severity so CEF outputs detailed information, useful for debugging
settings.LogSeverity = LogSeverity.Default;
Cef.Initialize(settings);

编辑尝试通过ResourceHandler.FromFilePath显示PDF文件也不起作用(不显示任何内容)。

public class CustomProtocolSchemeHandlerFactory : ISchemeHandlerFactory
{
    public const string SchemeName = "local";

    public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
    {
        var uri = new Uri(request.Url);
        var file = uri.AbsolutePath;

        var fileExtension = Path.GetExtension(file);
        var mimeType = ResourceHandler.GetMimeType(fileExtension);
        return ResourceHandler.FromFilePath(file, mimeType);
    }
}

Aaditi

将LogSeverity设置为Default后,日志显示:[0524/150955.108:INFO:CONSOLE(20)] "Refused to load plugin data from 'local://c/Users/abidh/Desktop/pdf.pdf' because it violates the following Content Security Policy directive: "object-src * blob: externalfile: file: filesystem: data:".

c# wpf cefsharp
2个回答
3
投票

没有找到使用谷歌的解决方案。感谢amaitland,使用IsCSPBypassing属性解决了问题:

var settings = new CefSettings();
settings.RegisterScheme(new CefCustomScheme
{
    SchemeName = CustomProtocolSchemeHandlerFactory.SchemeName,
    SchemeHandlerFactory = new CustomProtocolSchemeHandlerFactory(),
    IsCSPBypassing = true
});
settings.LogSeverity = LogSeverity.Error;
Cef.Initialize(settings);

-1
投票

将PDF文件路径设置为ChromiumWebBrowser.Address,格式如file:/// C:/Users/xxx/yyy.pdf,CEFSharp将像Chrome浏览器一样呈现PDF。

© www.soinside.com 2019 - 2024. All rights reserved.