2016-05-20 4 views
0

Я в настоящее время ищу библиотеку или способ конвертировать файлы HTML или DOCX в PDF на телефоне/вкладке, в первую очередь я ищу способ на Android или iOS idk, если его подход PCL или платформы. Я мог бы сделать это для каждой платформы самостоятельно, потому что для нашего приложения требуется iOS 8 или андроид kitkat, поддерживающие встроенное преобразование PDF, но я хочу сделать это без проблем для пользователя, поэтому вопрос заключается в том, если кто-то сделал это раньше, не загружая его в видимый Webview поначалу или имеет знания открытого API лицензированного GPL (не может публиковать код), чтобы сделать это с помощью Xamarin.Xamarin free HTML или DOC to PDF Conversion

Мне известно о возможности сделать это в Интернете, но я не хочу, чтобы это зависело от онлайн-сервиса.

Помощь и идеи приветствуются.

ответ

3

Android Решение:

Вызовите SafeHTMLToPDF (строка HTML, строка файла) с помощью службы зависимостей, как

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

    }