从互联网上显示的PDF文件中Xamarin.Forms UWP(Displaying pdf fil

2019-10-29 11:43发布

我有一个Xamarin.Forms应用程序仅支持UWP。 我需要能够从网络载入PDF文件,并显示在我的应用程序的内容。 我无法找到一个解决方案,将与UWP工作和处理不属于项目的一部分PDF文件。

Answer 1:

为了您的要求,您可以参考此代码示例 ,风俗具有的WebView和加载PDF文件pdf.js主机的Web应用程序。

[assembly: ExportRenderer(typeof(CustomWebView), typeof(CustomWebViewRenderer))]
namespace DisplayPDF.WinPhone81
{
    public class CustomWebViewRenderer : WebViewRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                var customWebView = Element as CustomWebView;
                Control.Source = new Uri(string.Format("ms-appx-web:///Assets/pdfjs/web/viewer.html?file={0}", string.Format ("ms-appx-web:///Assets/Content/{0}", WebUtility.UrlEncode(customWebView.Uri))));
            }
        }
    }
}

更新

这样,它的工作原理。 但是,PDF应该是项目的一部分。 这是否意味着没有办法来显示随机文件,例如从网上下载?

我记得我在过去的几个月里回答的情况。 为了显示随机文件,你可以PDF文件转换成Base64String然后通过调用打开它openPdfAsBase64在viewer.js JS功能。 更多详情请浏览这种情况下的答复 。

为了更好的理解,我有创建代码示例 ,你可以参考。 使用它之前,你需要的地方hello.pdf在文件LocalState文件夹。 因为,默认的文件加载路径是LocalState文件夹,但它是空的拳头开始。

PDFViewRenderer.cs

public class PDFViewRenderer :WebViewRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
    {
        base.OnElementChanged(e);
        if (e.NewElement != null)
        {
            Control.Source = new Uri("ms-appx-web:///Assets/pdfjs/web/viewer.html");
            Control.LoadCompleted += Control_LoadCompleted;
        }
    }
    private async void Control_LoadCompleted(object sender, Windows.UI.Xaml.Navigation.NavigationEventArgs e)
    {
        PDFView pdfView = Element as PDFView;
        if (string.IsNullOrEmpty(pdfView?.FileName)) return;
        try
        {
            var Base64Data = await OpenAndConvert(pdfView?.FileName);
            var obj = await Control.InvokeScriptAsync("openPdfAsBase64", new[] { Base64Data });
        }
        catch (Exception ex)
        {
            throw ex;
        }

    }
    private async Task<string> OpenAndConvert(string FileName)
    {
        var folder = ApplicationData.Current.LocalFolder;
        var file = await folder.GetFileAsync(FileName);
        var filebuffer = await file.OpenAsync(FileAccessMode.Read);
        var reader = new DataReader(filebuffer.GetInputStreamAt(0));
        var bytes = new byte[filebuffer.Size];
        await reader.LoadAsync((uint)filebuffer.Size);
        reader.ReadBytes(bytes);
        return Convert.ToBase64String(bytes);
    }
}

PDFView.cs

public class PDFView : WebView
{
    public PDFView()
    {

    }
    public static readonly BindableProperty FileNameProperty = BindableProperty.Create(
    propertyName: "FileName",
    returnType: typeof(string),
    declaringType: typeof(PDFView),
    defaultValue: default(string));

    public string FileName
    {
        get { return (string)GetValue(FileNameProperty); }
        set { SetValue(FileNameProperty, value); }
    }
}

用法

<Grid>
    <local:PDFView FileName="hello.pdf"/>
</Grid>

请注意,您需要使用此viewer.js已添加openPdfAsBase64方法。



文章来源: Displaying pdf files from internet in Xamarin.Forms UWP