Xamarin free HTML or DOC to PDF Conversion

前端 未结 4 1849
既然无缘
既然无缘 2021-02-06 15:49

I\'m currently searching for a library or a way to convert HTML OR DOCX files into PDF on the phone/tab, primarily I\'am searching for a way on Android or iOS idk if its a PCL o

相关标签:
4条回答
  • 2021-02-06 16:08

    Frustrated with the existing solutions, I've built some extension methods (OpenSource, MIT Licensed) that convert HTML or the content of a Xamarin.Forms.WebView to a PDF file. Sample usage for WebView to PDF:

            async void ShareButton_Clicked(object sender, EventArgs e)
            {
                if (Forms9Patch.ToPdfService.IsAvailable)
                {
                    if (await webView.ToPdfAsync("output.pdf") is ToFileResult pdfResult)
                    {
                        if (pdfResult.IsError)
                            using (Toast.Create("PDF Failure", pdfResult.Result)) { }
                        else
                        {
                            var collection = new Forms9Patch.MimeItemCollection();
                            collection.AddBytesFromFile("application/pdf", pdfResult.Result);
                            Forms9Patch.Sharing.Share(collection, shareButton);
                        }
                    }
                }
                else
                    using (Toast.Create(null, "PDF Export is not available on this device")) { }
            }
        }
    

    For a more complete explanation of how to use it, here's a short article: https://medium.com/@ben_12456/share-xamarin-forms-webview-as-a-pdf-a877542e824a?

    0 讨论(0)
  • 2021-02-06 16:13

    Yes, you can convert a Word document to PDF in Xamarin with a few lines of code easily. You need to refer Syncfusion.Xamarin.DocIORenderer from nuget.org

    Assembly assembly = typeof(App).GetTypeInfo().Assembly;
    // Retrieves the document stream from embedded Word document
    Stream inputStream = assembly.GetManifestResourceStream("WordToPDF.Assets.GettingStarted.docx");
    string fileName = "GettingStarted.pdf";
    // Creates new instance of WordDocument
    WordDocument wordDocument = new WordDocument(inputStream,Syncfusion.DocIO.FormatType.Automatic);
    inputStream.Dispose();
    // Creates new instance of DocIORenderer for Word to PDF conversion
    DocIORenderer render = new DocIORenderer();
    // Converts Word document into PDF document
    PdfDocument pdfDocument = render.ConvertToPDF(wordDocument);
    // Releases all resources used by the DocIORenderer and WordDocument instance
    render.Dispose();
    document.Close();
    // Saves the converted PDF file
    MemoryStream outputStream = new MemoryStream();
    pdfDocument.Save(outputStream);
    // Releases all resources used by the PdfDocument instance
    pdfDocument.Close();
    

    To know more about this, kindly refer here.

    0 讨论(0)
  • 2021-02-06 16:26

    You can able to convert the HTML to PDF file without any third party library. I am sharing my git repo for future reference.

    https://github.com/dinesh4official/XFPDF

    0 讨论(0)
  • 2021-02-06 16:32

    Android Solution:

    Call the SafeHTMLToPDF(string html, string filename) via a dependency service like

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

    And the Way to do it under iOS

    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;
            }
    
        }
    
    0 讨论(0)
提交回复
热议问题