2015-01-07 1 views
3

Можно ли использовать форму xamarin для просмотра PDF-файла без использования настраиваемого средства визуализации.Как просмотреть PDF-файл с использованием форм Xamarin

+1

Попробуйте 'Device.OpenUri()' и перейдите в локальный URI PDF. Это должно открыть PDF в браузере, который (надеюсь) способен его просматривать. – Krumelur

+0

Я попытался 'Device.OpenUri()' раньше, и он работает –

+0

Спасибо за ваше предложение, но мое приложение должно открыть PDF-файл внутри приложения, а не в браузере. – Sonu

ответ

5

Android:

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, немного более сложные и requiries некоторые дополнительные классы:

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

Смежные вопросы