2016-05-20 7 views
0

現在、ライブラリまたはHTML/DOCXファイルを電話/タブでPDFに変換する方法を探しています。主にAndroidまたはiOS idkでの方法を探していますifそのPCLまたはプラットフォーム固有のアプローチです。私はすべてのプラットフォームでこれを個別に行うことができます。なぜなら、私たちのアプリはネイティブPDF変換をサポートしているiOS 8またはAndroid kitkatを必要としますが、これはユーザーにとってシームレスにしたいからです。目に見えるウェブビューにするか、Xamarinでこれを行うには、公開されていない公開API(コードを公開することはできません)に関する知識が必要です。XamarinフリーHTMLまたはDOCからPDFへの変換

私はこれをオンラインで行う可能性を認識していますが、私はこのためにオンラインサービスに依存したくありません。

ヘルプとアイデアがありがとうございます。

答えて

3

アンドロイドソリューション:

コールSafeHTMLToPDF(文字列のHTML、文字列filename)

DependencyService.Get<YOURINTERFACE>().SafeHTMLToPDF(htmlString, "Invoice"); 


    public string SafeHTMLToPDF(string html, string filename) 
    { 

     var dir = new Java.IO.File(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/pay&go/"); 
     var file = new Java.IO.File(dir + "/" + filename + ".pdf"); 

     if (!dir.Exists()) 
      dir.Mkdirs(); 


     int x = 0; 
     while (file.Exists()) 
     { 
      x++; 
      file= new Java.IO.File(dir + "/" + filename + "(" + x + ")" + ".pdf"); 
     } 

     if (webpage == null) 
      webpage = new Android.Webkit.WebView(GetApplicationContext()); 

     int width = 2102; 
     int height = 2973; 

     webpage.Layout(0, 0, width, height); 
     webpage.LoadDataWithBaseURL("",html, "text/html", "UTF-8" , null); 
     webpage.SetWebViewClient(new WebViewCallBack(file.ToString())); 

     return file.ToString(); 
    } 


    class WebViewCallBack : WebViewClient 
    { 

     string fileNameWithPath = null; 

     public WebViewCallBack(string path) 
     { 
      this.fileNameWithPath = path; 
     } 


     public override void OnPageFinished(Android.Webkit.WebView myWebview, string url) 
     { 
      PdfDocument document = new PdfDocument(); 
      PdfDocument.Page page = document.StartPage(new PdfDocument.PageInfo.Builder(2120 ,3000, 1).Create()); 

      myWebview.Draw(page.Canvas); 
      document.FinishPage(page); 
      Stream filestream = new MemoryStream(); 
      FileOutputStream fos = new Java.IO.FileOutputStream(fileNameWithPath, false); ; 
      try 
      { 
       document.WriteTo(filestream); 
       fos.Write(((MemoryStream)filestream).ToArray(), 0, (int)filestream.Length); 
       fos.Close(); 
      } 
      catch 
      { 
      } 
     } 
    } 

のような依存関係サービスと

public string SafeHTMLToPDF(string html, string filename) 
    { 
     UIWebView webView = new UIWebView(new CGRect(0, 0, 6.5 * 72, 9 * 72)); 


     var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
     var file = Path.Combine(documents, "Invoice" + "_" + DateTime.Now.ToShortDateString() + "_" + DateTime.Now.ToShortTimeString() + ".pdf"); 

     webView.Delegate = new WebViewCallBack(file); 
     webView.ScalesPageToFit = true; 
     webView.UserInteractionEnabled = false; 
     webView.BackgroundColor = UIColor.White; 
     webView.LoadHtmlString(html, null); 



     return file; 
    } 

    class WebViewCallBack : UIWebViewDelegate 
    { 

     string filename = null; 
     public WebViewCallBack(string path) 
     { 
      this.filename = path; 

     } 
     public override void LoadingFinished(UIWebView webView) 
     { 
      double height, width; 
      int header, sidespace; 

      width = 595.2; 
      height = 841.8; 
      header = 10; 
      sidespace = 10; 


      UIEdgeInsets pageMargins = new UIEdgeInsets(header, sidespace, header, sidespace); 
      webView.ViewPrintFormatter.ContentInsets = pageMargins; 

      UIPrintPageRenderer renderer = new UIPrintPageRenderer(); 
      renderer.AddPrintFormatter(webView.ViewPrintFormatter, 0); 

      CGSize pageSize = new CGSize(width, height); 
      CGRect printableRect = new CGRect(sidespace, 
           header, 
           pageSize.Width - (sidespace * 2), 
           pageSize.Height - (header * 2)); 
      CGRect paperRect = new CGRect(0, 0, width, height); 
      renderer.SetValueForKey(NSValue.FromObject(paperRect), (NSString)"paperRect"); 
      renderer.SetValueForKey(NSValue.FromObject(printableRect), (NSString)"printableRect"); 
      NSData file = PrintToPDFWithRenderer(renderer, paperRect); 
      File.WriteAllBytes(filename, file.ToArray()); 
     } 

     private NSData PrintToPDFWithRenderer(UIPrintPageRenderer renderer, CGRect paperRect) 
     { 
      NSMutableData pdfData = new NSMutableData(); 
      UIGraphics.BeginPDFContext(pdfData, paperRect, null); 

      renderer.PrepareForDrawingPages(new NSRange(0, renderer.NumberOfPages)); 

      CGRect bounds = UIGraphics.PDFContextBounds; 

      for (int i = 0; i < renderer.NumberOfPages; i++) 
      { 
       UIGraphics.BeginPDFPage(); 
       renderer.DrawPage(i, paperRect); 
      } 
      UIGraphics.EndPDFContent(); 

      return pdfData; 
     } 

    } 
のiOS

の下でそれを行う方法を経由して
関連する問題