C# Loacl PDF未在cefsharp 71中打开

C# Loacl PDF未在cefsharp 71中打开,c#,cefsharp,C#,Cefsharp,我正在尝试在浏览器中打开pdf。但是,当我打开pdf时,没有显示任何内容。我已将日志设置为错误级别,但其中没有错误 以下是我注册该计划的方式: settings.RegisterScheme(new CefCustomScheme { SchemeName = CefSharpSchemeHandlerFactory.SchemeName, SchemeHandlerFactory

我正在尝试在浏览器中打开pdf。但是,当我打开pdf时,没有显示任何内容。我已将日志设置为错误级别,但其中没有错误

以下是我注册该计划的方式:

 settings.RegisterScheme(new CefCustomScheme
                {
                    SchemeName = CefSharpSchemeHandlerFactory.SchemeName,
                    SchemeHandlerFactory = new CefSharpSchemeHandlerFactory(),
                    IsCSPBypassing = true,
                });
这是我的工厂:

public class CefSharpSchemeHandlerFactory : ISchemeHandlerFactory
    {
        public const string SchemeName = "local";
        public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
        {
            if (schemeName == SchemeName && request.Url.EndsWith("CefSharp.Core.xml", System.StringComparison.OrdinalIgnoreCase))
            {
                //Convenient helper method to lookup the mimeType
                var mimeType = ResourceHandler.GetMimeType(".xml");
                //Load a resource handler for CefSharp.Core.xml
                //mimeType is optional and will default to text/html
                return ResourceHandler.FromFilePath("CefSharp.Core.xml", mimeType);
            }
            return new CefSharpSchemeHandler();
        }
    }
这是我的计划管理员:

    internal class CefSharpSchemeHandler : IResourceHandler
    {
        private static readonly IDictionary<string, string> ResourceDictionary;

        private string mimeType;
        private MemoryStream stream;

        static CefSharpSchemeHandler()
        {
        } 

        bool IResourceHandler.ProcessRequest(IRequest request, ICallback callback)
        {
            // The 'host' portion is entirely ignored by this scheme handler.
            var uri = new Uri(request.Url);
            var fileName = uri.AbsolutePath;
            string resource;
            if (ResourceDictionary.TryGetValue(fileName, out resource) && !string.IsNullOrEmpty(resource))
            {
                Task.Run(() =>
                {
                    using (callback)
                    {
                        var bytes = Encoding.UTF8.GetBytes(resource);
                        stream = new MemoryStream(bytes);

                        var fileExtension = Path.GetExtension(fileName);
                        mimeType = ResourceHandler.GetMimeType(fileExtension);

                        callback.Continue();
                    }
                });

                return true;
            }
            else
            {
                callback.Dispose();
            }

            return false;
        }


        void IResourceHandler.GetResponseHeaders(IResponse response, out long responseLength, out string redirectUrl)
        {
            responseLength = stream == null ? 0 : stream.Length;
            redirectUrl = null;

            response.StatusCode = (int)HttpStatusCode.OK;
            response.StatusText = "OK";
            response.MimeType = mimeType;
        }

        bool IResourceHandler.ReadResponse(Stream dataOut, out int bytesRead, ICallback callback)
        {
            callback.Dispose();
            if(stream == null)
            {
                bytesRead = 0;
                return false;
            }
            //Data out represents an underlying buffer (typically 32kb in size).
            var buffer = new byte[dataOut.Length];
            bytesRead = stream.Read(buffer, 0, buffer.Length);

            dataOut.Write(buffer, 0, buffer.Length);

            return bytesRead > 0;
        }

        bool IResourceHandler.CanGetCookie(Cookie cookie)
        {
            return true;
        }

        bool IResourceHandler.CanSetCookie(Cookie cookie)
        {
            return true;
        }

        void IResourceHandler.Cancel()
        {

        }

        void IDisposable.Dispose()
        {

        }
    }

我对CefSharpSchemeHandlerFactory创建方法没有兴趣。

请看一个例子,little old,想法是一样的。另外,如果您只想从磁盘加载文件,项目源代码中还有一个例子。@amaitland谢谢,现在我可以在浏览器中打开本地文件了。我直接给本地路径的文件加载方法的浏览器,它是开放的。我不是在利用谢泼勒。有一件事我需要问一下,当我直接通过将pdf的路径传递到browser.load方法来打开pdf文件时,这个方案有什么用。@amaitland:我无法在浏览器中打开ppt、docx、xlsx类型的文件。正在下载这些类型的文件,而不是在浏览器中渲染。如果有任何方法可以在浏览器内部打开docx?该浏览器不是MS Office viewer,则不支持这些格式。
 string pdfPath = @"D:\Magic\10774.pdf";
 var mimeType = ResourceHandler.GetMimeType(".pdf");
 ResourceHandler.FromFilePath(pdfPath, mimeType);