2015-01-07 2 views
3

사용자 정의 렌더러를 사용하지 않고 xamarin 양식을 사용하여 PDF 파일을 볼 수있는 방법이 있습니까?Xamarin Forms를 사용하여 PDF 파일을 보는 방법

+1

'Device.OpenUri()'을 시도해보고 PDF의 로컬 URI를 전달하십시오. 이렇게하면 브라우저에서 PDF가 열리므로 (잘하면) 볼 수 있습니다. – Krumelur

+0

이전에'Device.OpenUri()'을 시도했지만 작동했습니다 –

+0

제안 해 주셔서 감사합니다.하지만 제 앱 요구 사항은 브라우저가 아닌 앱 내부에서 PDF 파일을 여는 것입니다. – Sonu

답변

5

안드로이드 :

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(); 
    } 
} 

아이폰 OS, 좀 더 복잡하고 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 클래스는 블로그에서 가져온 것입니다. 그 블로그는 저의 삶을 기억할 수는 없지만 그 이름은 내 작품이 아닙니다. https://developer.xamarin.com/recipes/cross-platform/xamarin-forms/controls/display-pdf/

: https://forums.xamarin.com/discussion/25746/how-to-open-pdf-in-xamarin-forms

3

지금이 커버하는 조리법이있다 :

UISharedApplication.KeyWindow.PresentViewController 

당신이있어 정보를 찾을 수 있습니다 FindNavigationController는 귀하의 경우,처럼 간단 할 수있다 필요하지 않을 수도있다 편집 : 조리법은 사용자 지정 렌더러를 사용합니다. 그래도 사용자 지정 렌더러없이 작업 할 수 없다면 여전히 유용 할 수 있습니다.

관련 문제