如何在Xamarin Forms中加载PDF

时间:2014-08-15 14:22:33

标签: xamarin xamarin.forms

我有一个Xamarin Forms应用程序,我想打开本地存储的PDF。我不需要在应用内加载它们,我很好地炮轰了设备的PDF默认文档查看器。我怎么能这样做?

我尝试向PDF发送WebView,但这不起作用,我只是得到一个空白页。

3 个答案:

答案 0 :(得分:8)

我最近在自己的项目中使用自定义渲染器完成了此操作。首先实现一个空的Xamarin表单视图,例如(我已经包含了一个可绑定的FilePath属性):

    public class PdfViewer : View
{
    public static readonly BindableProperty FilePathProperty =
        BindableProperty.Create<DocumentViewer, string>(p => p.FilePath, null);

    public string FilePath
    {
        get
        {
            return (string)this.GetValue(FilePathProperty);
        }

        set
        {
            this.SetValue(FilePathProperty, value);
        }
    }
}

然后创建一个将为此控件注册的iOS渲染器。此渲染器可以在iOS项目中使用Quick Look Preview Controller委托内置的iOS pdf查看器:

[assembly: ExportRenderer(typeof(PdfViewer), typeof(DocumentViewRenderer))]

public class DocumentViewRenderer 
        : ViewRenderer<PdfViewer, UIView>
{
    private QLPreviewController controller;

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

        this.controller = new QLPreviewController();
        this.controller.DataSource = new DocumentQLPreviewControllerDataSource(e.NewElement.FilePath);

        SetNativeControl(this.controller.View);
    }

    private class DocumentQLPreviewControllerDataSource : QLPreviewControllerDataSource 
    {
        private string fileName;
        public DocumentQLPreviewControllerDataSource(string fileName)
        {
            this.fileName = fileName;
        }

        public override int PreviewItemCount(QLPreviewController controller) 
        {
            return 1;
        }

        public override QLPreviewItem GetPreviewItem(QLPreviewController controller, int index)
        {
            var documents = NSBundle.MainBundle.BundlePath;
            var library = Path.Combine(documents, this.fileName);
            NSUrl url = NSUrl.FromFilename(library);

            return new QlItem(string.Empty, url);
        }

        private class QlItem : QLPreviewItem 
        { 
            public QlItem(string title, NSUrl uri) 
            { 
                this.ItemTitle = title; 
                this.ItemUrl = uri; 
            } 

            public override string ItemTitle { get; private set; }

            public override NSUrl ItemUrl { get; private set; }
        }
    }
}

我还没有编译并运行它,因为我已从我的大项目中提取它,但总的来说这应该有效。

答案 1 :(得分:6)

我必须做一些事情并使用DependencyService解决它。您可以使用它来打开pdf,具体取决于每个平台

我向您展示了如何在Android上解决它的示例:

<强> IPdfCreator.cs

public interface IPdfCreator
    {
        void ShowPdfFile();
    }

<强> MainPage.cs:

private void Button_OnClicked(object sender, EventArgs e)
{
    DependencyService.Get<IPdfCreator>().ShowPdfFile();
}

<强> PdfCreatorAndroid.cs

[assembly: Dependency(typeof(PdfCreatorAndroid))]
namespace Example.Droid.DependecyServices
{
    public class PdfCreatorAndroid : IPdfCreator
    {

        public void ShowPdfFile()
        {
            var fileLocation = "/sdcard/Template.pdf";
            var file = new File(fileLocation);

            if (!file.Exists())
                return;

            var intent = DisplayPdf(file);
            Forms.Context.StartActivity(intent);
        }

        public Intent DisplayPdf(File file)
        {
            var intent = new Intent(Intent.ActionView);
            var filepath = Uri.FromFile(file);
            intent.SetDataAndType(filepath, "application/pdf");
            intent.SetFlags(ActivityFlags.ClearTop);
            return intent;
        }
    }
}

结果: http://i.stack.imgur.com/vrwzt.png

答案 2 :(得分:1)

Here有一个很好的项目在xamarin中使用 MuPDF库。我已经对它进行了测试,并且运行正常。

使用 MuPDF ,您可以缩小放大,甚至在PDF上写一些注释