【问题标题】:How to view PDF file using Xamarin Forms如何使用 Xamarin Forms 查看 PDF 文件
【发布时间】:2015-03-05 09:27:42
【问题描述】:

有什么方法可以使用 xamarin 表单来查看 PDF 文件而不使用自定义渲染器。

【问题讨论】:

  • 尝试Device.OpenUri() 并传入 PDF 的本地 URI。这应该在(希望)能够查看它的浏览器中打开 PDF。
  • 我之前尝试过Device.OpenUri(),它可以工作
  • 感谢您的建议,但我的应用要求是在应用内而不是在浏览器中打开 PDF 文件。
  • 然后实例化一个 WebView 并使用它来导航到你的本地 URI - 你不会切换应用程序,你的导航堆栈仍然可以工作
  • 好的。我得到了它。谢谢@StenPetrov 和大家的建议。

标签: xamarin xamarin.forms


【解决方案1】:

安卓:

public void OpenPdf(string filePath)
{
    Android.Net.Uri uri = Android.Net.Uri.Parse("file:///" + filePath);
    Intent intent = new Intent(Intent.ActionView);
    intent.SetDataAndType(uri, "application/pdf");
    intent.SetFlags(ActivityFlags.ClearWhenTaskReset | ActivityFlags.NewTask);

    try
    {
        Xamarin.Forms.Forms.Context.StartActivity(intent);
    }
    catch (Exception)
    {
        Toast.MakeText(Xamarin.Forms.Forms.Context, "No Application Available to View PDF", ToastLength.Short).Show();
    }
}

iOS,有点复杂,需要一些额外的类:

public void OpenPDF(string filePath)
{
    FileInfo fi = new FileInfo(filePath);

    QLPreviewController previewController = new QLPreviewController();
    previewController.DataSource = new PDFPreviewControllerDataSource(fi.FullName, fi.Name);

    UINavigationController controller = FindNavigationController();
    if (controller != null)
        controller.PresentViewController(previewController, true, null);
}

private UINavigationController FindNavigationController()
{
    foreach (var window in UIApplication.SharedApplication.Windows)
    {
        if (window.RootViewController.NavigationController != null)
            return window.RootViewController.NavigationController;
        else
        {
            UINavigationController val = CheckSubs(window.RootViewController.ChildViewControllers);
            if (val != null)
                return val;
        }
    }

    return null;
}

private UINavigationController CheckSubs(UIViewController[] controllers)
{
    foreach (var controller in controllers)
    {
        if (controller.NavigationController != null)
            return controller.NavigationController;
        else
        {
            UINavigationController val = CheckSubs(controller.ChildViewControllers);
            if (val != null)
                return val;
        }
    }
    return null;
}

public class PDFItem : QLPreviewItem
{
    string title;
    string uri;

    public PDFItem(string title, string uri)
    {
        this.title = title;
        this.uri = uri;
    }

    public override string ItemTitle
    {
        get { return title; }
    }

    public override NSUrl ItemUrl
    {
        get { return NSUrl.FromFilename(uri); }
    }
}

public class PDFPreviewControllerDataSource : QLPreviewControllerDataSource
{
    string url = "";
    string filename = "";

    public PDFPreviewControllerDataSource(string url, string filename)
    {
        this.url = url;
        this.filename = filename;
    }

    public override QLPreviewItem GetPreviewItem(QLPreviewController controller, int index)
    {
        return new PDFItem(filename, url);
    }

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

使用依赖服务来获取它们并根据需要调用,对我来说效果很好。 PDFItem 和 PDFPreviewControllerDataSource 类来自一个博客,我一生都记不住名字,但它们不是我的作品。 FindNavigationController 在您的情况下可能不是必需的,它可能很简单:

UISharedApplication.KeyWindow.PresentViewController

您可以在此处找到信息: https://forums.xamarin.com/discussion/25746/how-to-open-pdf-in-xamarin-forms

【讨论】:

    【解决方案2】:

    现在有一个涵盖此的配方:https://developer.xamarin.com/recipes/cross-platform/xamarin-forms/controls/display-pdf/

    编辑:糟糕,配方确实使用了自定义渲染器。如果没有自定义渲染器就无法正常工作,它可能仍然有用。

    【讨论】:

      猜你喜欢
      • 2019-08-09
      • 1970-01-01
      • 2019-08-08
      • 2021-07-27
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 1970-01-01
      相关资源
      最近更新 更多