Pergunta

Im working in a project which requires current html page to convert in pdf and that pdf will automatically save on button click on server and its reference will be save in database.I can convert the view if its data comes from data base but the data in this form is static that means on the view it has so many radio button and text box in which i can write the detail and check the check box on after clicking save button it will save on the server and and its reference will save in the data base.

the reason is that im not saving the data in database is that the report is less use full for the client but if i save the data in data base then the database become very huge and its become complicate to handle. because the report has approx 100 fields. so please if any one can help me in it.

Foi útil?

Solução 6

I have used Canvas to PDF and that worked great for me. Here is the perfect tutorial for the same: https://www.freakyjolly.com/jspdf-multipage-example-generate-multipage-pdf-using-single-canvas-of-html-document-using-jspdf/

Thank you everyone.

Outras dicas

You can use the Free Html To Pdf Converter from SelectPdf (http://selectpdf.com/community-edition/).

Code for MVC looks like this:

[HttpPost]
public ActionResult Convert(FormCollection collection)
{
    // read parameters from the webpage
    string url = collection["TxtUrl"];

    string pdf_page_size = collection["DdlPageSize"];
    PdfPageSize pageSize = (PdfPageSize)Enum.Parse(typeof(PdfPageSize), pdf_page_size, true);

    string pdf_orientation = collection["DdlPageOrientation"];
    PdfPageOrientation pdfOrientation = (PdfPageOrientation)Enum.Parse(
        typeof(PdfPageOrientation), pdf_orientation, true);

    int webPageWidth = 1024;
    try
    {
        webPageWidth = System.Convert.ToInt32(collection["TxtWidth"]);
    }
    catch { }

    int webPageHeight = 0;
    try
    {
        webPageHeight = System.Convert.ToInt32(collection["TxtHeight"]);
    }
    catch { }

    // instantiate a html to pdf converter object
    HtmlToPdf converter = new HtmlToPdf();

    // set converter options
    converter.Options.PdfPageSize = pageSize;
    converter.Options.PdfPageOrientation = pdfOrientation;
    converter.Options.WebPageWidth = webPageWidth;
    converter.Options.WebPageHeight = webPageHeight;

    // create a new pdf document converting an url
    PdfDocument doc = converter.ConvertUrl(url);

    // save pdf document
    byte[] pdf = doc.Save();

    // close pdf document
    doc.Close();

    // return resulted pdf document
    FileResult fileResult = new FileContentResult(pdf, "application/pdf");
    fileResult.FileDownloadName = "Document.pdf";
    return fileResult;
}

VB.NET MVC version of the code can be found here: http://selectpdf.com/convert-from-html-to-pdf-in-asp-net-mvc-csharp-and-vb-net/

In short:

HTML Renderer for PDF using PdfSharp

    public static Byte[] PdfSharpConvert(String html)
    {
        Byte[] res = null;
        using (MemoryStream ms = new MemoryStream())
        {
            var pdf = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator.GeneratePdf(html, PdfSharp.PageSize.A4);
            pdf.Save(ms);
            res = ms.ToArray();
        }
        return res;
    }

More Detailed Answer

The C# code below can be used in a MVC application to convert the current view to PDF and produce a PDF in a buffer that can be saved on server or sent to browser for download. The code is using evopdf library for .net to perform the HTML to PDF conversion:

[HttpPost]
public ActionResult ConvertCurrentPageToPdf(FormCollection collection)
{
    object model = null;
    ViewDataDictionary viewData = new ViewDataDictionary(model);

    // The string writer where to render the HTML code of the view
    StringWriter stringWriter = new StringWriter();

    // Render the Index view in a HTML string
    ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, "Index", null);
    ViewContext viewContext = new ViewContext(
            ControllerContext,
            viewResult.View,
            viewData,
            new TempDataDictionary(),
            stringWriter
            );
    viewResult.View.Render(viewContext, stringWriter);

    // Get the view HTML string
    string htmlToConvert = stringWriter.ToString();

    // Get the base URL
    String currentPageUrl = this.ControllerContext.HttpContext.Request.Url.AbsoluteUri;
    String baseUrl = currentPageUrl.Substring(0, currentPageUrl.Length - "Convert_Current_Page/ConvertCurrentPageToPdf".Length);

    // Create a HTML to PDF converter object with default settings
    HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();

    // Convert the HTML string to a PDF document in a memory buffer
    byte[] outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlToConvert, baseUrl);

    // Send the PDF file to browser
    FileResult fileResult = new FileContentResult(outPdfBuffer, "application/pdf");
    fileResult.FileDownloadName = "Convert_Current_Page.pdf";

    return fileResult;
}

There is special nuget package RazorPDF. It simple works. RazorPDF site

use ABCpdf dll, here in text area we can write html code and on a button click corresponding pdf will be shown.ABCpdf trail version is easily available for downloding, adding linlk to download the ABCpdf dll https://www.websupergoo.com/download.htm

index.cshtml

      @using (Html.BeginForm("covertopdf", "simple", FormMethod.Post))
{
        <p style="margin-top:50px">
            Input Html: @Html.TextArea("Htmlcontent", new { @class = "form-control",@cols="160" , @rows="20"})<br />
            <input type="submit" class="btn-primary" value="Convertopdf" />
        </p>
}

SimpleController.cs

 public class SimpleController : Controller
    {
        public class FileViewModel
        {
            public byte[] Content { get; set; }
            public string Extension { get; set; }
            public string FileName { get; set; }
        }

       [HttpPost]
       [ValidateInput(false)]
       public FileStreamResult covertopdf(string Htmlcontent)
        //public FileStreamResult covertopdf(file fo)
        {
            var result = ExecuteAction(() =>
            {
                var fileViewmodel = new FileViewModel
                {
                    Content = ConvertHtmlToPdf(Htmlcontent),
                    //Content= ConvertHtmlToPdf(fo.cont),
                    Extension = "application/pdf",
                    FileName = "Policy Information.pdf"
                };
                return fileViewmodel;
            }, "covertopdf");
            // return result;
            HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
            // Content is the file 
            Stream stream = new MemoryStream(result.Content);
            return new FileStreamResult(stream, "application/pdf")
            {

            };
        }



        public T ExecuteAction<T>(Func<T> action, string method)
        {
            try
            {
                return action.Invoke();
            }
            catch (Exception ex)
            {
                return default(T);
            }
        }



        protected byte[] ConvertHtmlToPdf(string html, string header = null, string footer = null, bool isPageNumberInFooter = false)
        {
            // Create ABCpdf Doc object
            var doc = new Doc();
            if (header == null && footer == null)
                doc.Rect.Inset(20, 20);
            else
                doc.Rect.String = "0 70 600 760"; /*padding from left, padding from bottom, width from left, height from bottom*/
            // Add html to Doc   
            //html = "<html><head></head><body></body></html>";
            int theId = doc.AddImageHtml(html);

            // Loop through document to create multi-page PDF
            while (true)
            {
                if (!doc.Chainable(theId))
                    break;
                doc.Page = doc.AddPage();
                theId = doc.AddImageToChain(theId);
            }
            var count = doc.PageCount;

            /*****************Footer area******************/
            if (footer != null)
            {
                var newfooter = "";
                doc.Rect.String = "40 20 580 50";
                for (int i = 1; i <= count; i++)
                {

                    doc.PageNumber = i;
                    if (isPageNumberInFooter)
                    {
                        newfooter = footer.Replace("PageNumber", "Page " + i.ToString() + " of " + count.ToString());
                        int id = doc.AddImageHtml(newfooter);

                        while (true)
                        {
                            if (!doc.Chainable(id))
                                break;
                            id = doc.AddImageToChain(id);
                        }
                    }
                    else
                        doc.AddText(footer);
                }
            }
            /*****************Footer area******************/


            // Flatten the PDF
            for (int i = 1; i <= doc.PageCount; i++)
            {
                doc.PageNumber = i;
                doc.Flatten();
            }

            var pdf = doc.GetData();
            doc.Clear();
            // Get PDF as byte array. Couls also use .Save() to save to disk
            return pdf;
        }
    }

There are a number of html to pdf converters for .NET available out there. I can recommend ExpertPdf (www.html-to-pdf.net).

Code looks something like this:

PdfConverter pdfConverter = new PdfConverter();

pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
byte[] downloadBytes = pdfConverter.GetPdfFromUrlBytes(url);

There is an online demo here: http://www.html-to-pdf.net/free-online-pdf-converter.aspx

I used iDiTect.Converter to convert html to pdf in asp.net mvc https://www.iditect.com/tutorial/html-to-pdf/, however it's not free code in short

public static Byte[] ConvertToBytes()
{
HtmlToPdfConverter converter = new HtmlToPdfConverter();

converter.DefaultStyleSheet = ".para{font-size: 24px; color: #FF0000;}";

string htmlContent = "<p class=\"para\">Content with special style.</p><p>Content without style</p>";
converter.Load(htmlContent);

return converter.SaveAsBytes();
}

Canvas to PDF is the right choice to make

function getPDF(){

    var HTML_Width = $(".canvas_div_pdf").width();
    var HTML_Height = $(".canvas_div_pdf").height();
    var top_left_margin = 15;
    var PDF_Width = HTML_Width+(top_left_margin*2);
    var PDF_Height = (PDF_Width*1.5)+(top_left_margin*2);
    var canvas_image_width = HTML_Width;
    var canvas_image_height = HTML_Height;
    
    var totalPDFPages = Math.ceil(HTML_Height/PDF_Height)-1;
    

    html2canvas($(".canvas_div_pdf")[0],{allowTaint:true}).then(function(canvas) {
        canvas.getContext('2d');
        
        console.log(canvas.height+"  "+canvas.width);
        
        
        var imgData = canvas.toDataURL("image/jpeg", 1.0);
        var pdf = new jsPDF('p', 'pt',  [PDF_Width, PDF_Height]);
        pdf.addImage(imgData, 'JPG', top_left_margin, top_left_margin,canvas_image_width,canvas_image_height);
        
        
        for (var i = 1; i <= totalPDFPages; i++) { 
            pdf.addPage(PDF_Width, PDF_Height);
            pdf.addImage(imgData, 'JPG', top_left_margin, -(PDF_Height*i)+(top_left_margin*4),canvas_image_width,canvas_image_height);
        }
        
        pdf.save("HTML-Document.pdf");
    });
};
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top