Skip to main content
 首页 » 编程设计

c#之Xamarin.forms 在 webview 中显示 PDF 不起作用

2024年02月27日30daizhj

我从我的服务器下载一个 pdf 流。在我的应用程序中,我将 bytearray 以 pdf 格式保存到本地文件夹。但是当我在 webview 中打开它时,它只显示一个白色页面。

我按照这个例子:https://developer.xamarin.com/recipes/cross-platform/xamarin-forms/controls/display-pdf .

这是我的 xaml 中的 customwebview:

<local:CustomWebView x:Name="customView" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" /> 

这是我的自定义 View 代码:

 public class CustomWebView : WebView 
    {         
        public static readonly BindableProperty UriProperty = BindableProperty.Create(propertyName: "Uri", 
       returnType: typeof(string), 
       declaringType: typeof(CustomWebView), 
       defaultValue: default(string)); 
 
        public string Uri 
            { 
                get { return (string)GetValue(UriProperty); } 
                set { SetValue(UriProperty, value); } 
            } 
    } 

这是我检索 pdf 字节数组并将其存储在本地的方法:

 private async void ReadPDF() 
        { 
            var response = CommonLibrary.Helpers.HTTPClientHelper.DownloadPDF(AccountBL.AccessToken, APISettings.APIURI("api/booking/pdf")); 
            var streamContent = response.Content as System.Net.Http.StreamContent; 
            var bytes = CommonLibrary.Helpers.FileHelper.ReadBytes(await streamContent.ReadAsStreamAsync()); 
            var dir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
            var fileName = "test.pdf"; 
            CommonLibrary.Helpers.FileHelper.WriteFileFromByteArray(bytes, dir, fileName); 
 
           customView.Uri = System.IO.Path.Combine(dir, fileName);             
        } 

我错过了什么吗?

请您参考如下方法:

如果我没记错的话,您可以在 iOS 的 WebView 中显示“远程”PDF。 Android 有一些问题。我建议看看这个 repo OpenPDF .我使用 CustomRenderer 和谷歌工具来显示 PDF。我在某些 Android 版本上遇到了一些问题......但你可以看一看。(这里是 blog )

否则@AdamPedley 建议使用 PDF JS 查看器 Adam Pedley 密码是here .

这是 Android 的 CustomRenderer

[assembly: ExportRenderer (typeof(CustomWebView), typeof(CustomWebViewRenderer))] 
namespace DisplayPDF.Droid 
{ 
    public class CustomWebViewRenderer : WebViewRenderer 
    { 
        protected override void OnElementChanged (ElementChangedEventArgs<WebView> e) 
        { 
            base.OnElementChanged (e); 
 
            if (e.NewElement != null) { 
                var customWebView = Element as CustomWebView; 
                Control.Settings.AllowUniversalAccessFromFileURLs = true; 
                Control.LoadUrl (string.Format ("file:///android_asset/pdfjs/web/viewer.html?file={0}", string.Format ("file:///android_asset/Content/{0}", WebUtility.UrlEncode (customWebView.Uri)))); 
            } 
        } 
    } 
}