簡體   English   中英

通過網址在移動應用中顯示PDF文件

[英]Display PDF File in mobile app from an url

我有一個示例pdf URL“ http://www.africau.edu/images/default/sample.pdf ”。 我想顯示此pdf文件,並使用Xamarin.Forms在我的移動應用程序中顯示。 我嘗試使用網絡視圖和一些自定義渲染器,但沒有用。

public class PdfViewRenderer : WebViewRenderer
    {
        internal class PdfWebChromeClient : WebChromeClient
        {
            public override bool OnJsAlert(Android.Webkit.WebView view, string url, string message, JsResult result)
            {
                if (message != "PdfViewer_app_scheme:print")
                {
                    return base.OnJsAlert(view, url, message, result);
                }
                using (var printManager = Forms.Context.GetSystemService(Android.Content.Context.PrintService) as PrintManager)
                {
                    printManager?.Print(FileName, new FilePrintDocumentAdapter(FileName, Uri), null);
                }
                return true;
            }
            public string Uri { private get; set; }
            public string FileName { private get; set; }
        }
        protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
        {
            base.OnElementChanged(e);
            if (e.NewElement == null)
            {
                return;
            }
            var pdfView = Element as PdfView;
            if (pdfView == null)
            {
                return;
            }
            if (string.IsNullOrWhiteSpace(pdfView.Uri) == false)


        {
            Control.SetWebChromeClient(new PdfWebChromeClient
            {
                Uri = pdfView.Uri,
                //FileName = GetFileNameFromUri(pdfView.Uri)
            });
        }
        Control.Settings.AllowFileAccess = true;
        Control.Settings.AllowUniversalAccessFromFileURLs = true;
        LoadFile(pdfView.Uri);
    }
    private static string GetFileNameFromUri(string uri)
    {
        var lastIndexOf = uri?.LastIndexOf("/", StringComparison.InvariantCultureIgnoreCase);
        return lastIndexOf > 0 ? uri.Substring(lastIndexOf.Value, uri.Length - lastIndexOf.Value) : string.Empty;
    }
    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        if (e.PropertyName != PdfView.UriProperty.PropertyName)
        {
            return;
        }
        var pdfView = Element as PdfView;
        if (pdfView == null)
        {
            return;
        }
        if (string.IsNullOrWhiteSpace(pdfView.Uri) == false)
        {
            Control.SetWebChromeClient(new PdfWebChromeClient
            {
                Uri = pdfView.Uri,
               // FileName = GetFileNameFromUri(pdfView.Uri)
            });
        }
        LoadFile(pdfView.Uri);
    }
    private void LoadFile(string uri)
    {
        if (string.IsNullOrWhiteSpace(uri))
        {
            return;
        }
        //Control.Resources = new Uri(string.Format("ms-appx-web:///Assets/pdfjs/web/viewer.html?file={0}", string.Format("ms-appx-web:///Assets/Content/{0}", WebUtility.UrlEncode(PdfView.Uri))));
        Control.LoadUrl($"file:///android_asset/pdfjs/web/viewer.html?file=file://{uri}");
        //Control.LoadUrl(uri);
        Control.LoadUrl(string.Format("ms-appx-web:///Assets/pdfjs/web/viewer.html?file={0}", string.Format("ms-appx-web:///Assets/Content/{0}", WebUtility.UrlEncode(uri))));
    }
}

您的XAML

<WebView x:Name="Webview"  
             HeightRequest="1000"  
             WidthRequest="1000"              
             VerticalOptions="FillAndExpand"/>

這樣放置您的Webview源

 Webview.Source = "https://docs.google.com/gview?
    embedded=true&url="+"http://www.africau.edu/images/default/sample.pdf";

在此處輸入圖片說明

在Android中

[assembly: ExportRenderer(typeof(CustomWebView), typeof(CustomWebViewRenderer))]
namespace DipsDemoXaml.Droid.Renderer

public class CustomWebViewRenderer : WebViewRenderer
{
    public CustomWebViewRenderer(Context context) : base(context)
    { 
    }

    protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        {              
            Control.Settings.AllowUniversalAccessFromFileURLs = true;
            Control.Settings.BuiltInZoomControls = true;
            Control.Settings.DisplayZoomControls = true;

        }
        this.Control.SetBackgroundColor(Android.Graphics.Color.Transparent);
    }
    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName != "Uri") return;
        var customWebView = Element as CustomWebView;
        if (customWebView != null)
        {
            Control.LoadUrl(string.Format("file:///android_asset/pdfjs/web/viewer.html?file={0}", string.Format("file:///android_asset/Content/{0}", WebUtility.UrlEncode(customWebView.Uri))));        
        }
    }

}

}

適用於iOS

  [assembly: ExportRenderer(typeof(CustomWebView), typeof(CustomWebViewRenderer))]
 namespace DipsDemoXaml.iOS.Renderes
  {
  public class CustomWebViewRenderer : ViewRenderer<CustomWebView, UIWebView>
 {
    protected override void OnElementChanged(ElementChangedEventArgs<CustomWebView> 
       e)
      {
          base.OnElementChanged(e);

        if (Control == null)
        {
            SetNativeControl(new UIWebView());
        }
        if (e.OldElement != null)
        {
            // Cleanup
        }
        if (e.NewElement != null)
        {
            var customWebView = Element as CustomWebView;
            string fileName = Path.Combine(NSBundle.MainBundle.BundlePath, string.Format("Content/{0}", WebUtility.UrlEncode(customWebView.Uri)));
            Control.LoadRequest(new NSUrlRequest(new NSUrl(fileName, false)));
            Control.ScalesPageToFit = true;
        }

        this.Opaque = false;
        this.BackgroundColor = Color.Transparent.ToUIColor();
    }
}

}

在共享中

   namespace DipsDemoXaml.Custom.Renderer
{
   public class CustomWebView : WebView
   {
    public static readonly BindableProperty UriProperty =



   BindableProperty.Create(nameof(Uri),typeof(string),
    typeof(CustomWebView),default(string)) 
   ;

    public string Uri
    {
        get => (string) GetValue(UriProperty);
        set => SetValue(UriProperty, value);
    }
}

}

在XAML中,您可以像這樣調用

             <renderer:CustomWebView Uri="{Binding SelectedJournal.Uri}"  />

我認為您的自定義呈現中存在問題,您可以在字符串中創建一個新屬性,例如URI,然后可以調用URI,這是您需要訪問Android和iOS Webview的方式,因為您可以為android和ios調用android asset pdf查看器傳遞一個新的NSUrl以將pdf加載到您的應用程序中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM