Converting HTML to PDF in an ASP.NET MVC application can be accomplished using various libraries, with one of the most popular being iTextSharp. This library provides a robust set of features for creating and manipulating PDF documents. Below, I will guide you through the process step-by-step, ensuring that you have a comprehensive understanding of how to implement this functionality.

1- Install iTextSharp 
First, you need to install the iTextSharp library. You can do this via NuGet Package Manager.

2- Create an Method on Controller to generate PDF 

    public FileResult GeneratePdf(FormCollection fc)
            {
                string fromDate="";
                string Todate="";
                string buyer="";
                byte[] bytes=null;
                string fileName = "";
                fromDate = fc["txtFromDate"] == null ? "" : fc["txtFromDate"].ToString();
                Todate = fc["txtToDate"] == null ? "" : fc["txtToDate"].ToString();
                buyer = fc["txtBuyerName"] == null ? "" : fc["txtBuyerName"].ToString();
                Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
                string[,] Param = new string[,]
                {
                    {"@buyerId", buyer},
                    {"@FromDate", fromDate.Trim()},
                    {"@ToDate", Todate.Trim()},
                    {"@Type", "S"},
                };

                DataSet ds = CommonMethod.ExecuteProcedureReturnDS(Param, "USP_ShowExMeshReport_Pdf");
                if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    StringBuilder sb = CommonMethod.GenerateMeshReportPDF(ds, fromDate, Todate);
                    StringReader sr = new StringReader(sb.ToString());

                    using (MemoryStream memoryStream = new MemoryStream())
                    {
                        PdfWriter writer = PdfWriter.GetInstance(pdfDoc, memoryStream);
                        pdfDoc.Open();
                        PdfContentByte cb = writer.DirectContent;
                        cb.SetLineWidth(1f);
                        cb.SetColorStroke(BaseColor.GRAY);
                        cb.Rectangle(0, 0, pdfDoc.PageSize.Width, pdfDoc.PageSize.Height);
                        cb.Stroke();
                        iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr);
                        pdfDoc.NewPage();
                        StringBuilder itemListSb = CommonMethod.GenerateMeshReportPDF_ItemList(ds);
                        StringReader itemListSr = new StringReader(itemListSb.ToString());
                        iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, itemListSr);
                        pdfDoc.Close();
                        bytes = memoryStream.ToArray();
                        fileName = "Mess_Invoice_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".pdf";
                    }
                }
                return File(bytes, "application/pdf", fileName);
            }

StringBuilder itemListSb = CommonMethod.GenerateMeshReportPDF_ItemList(ds); // This is for generating dynamic html according to your requirement .
3-  Suppose we have below html , that need to generate PDF 

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>Daily Shopping Items</title>
    <style>
    body {
    font-family: Arial, sans-serif;
    margin: 0;
    padding: 20px;
    position: relative;
    }
    .container {
    max-width: 800px;
    margin: auto;
    background: #fff;
    padding: 20px;
    border-radius: 5px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
    border: 1px solid #ddd;
    }
    h1, h2 {
    color: #333;
    }
    .summary {
    margin-top: 20px;
    border: 1px solid #ddd;
    padding: 10px;
    border-radius: 5px;
    background-color: #f9f9f9;
    }
    .summary_ {
    margin-bottom: 20px;
    border: 1px solid #ddd;
    padding: 10px;
    border-radius: 5px;
    background-color: yellow;
    color: black;
    }
    summary div {
    margin: 5px 0;
    }
    table {
    width: 100%;
    border-collapse: collapse;
    margin-top: 20px;
    }
    th, td {
    padding: 10px;
    text-align: left;
    border: 1px solid #ddd;
    }
    th {
    background-color: #f2f2f2;
    }
    .watermark {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    opacity: 0.1;
    font-size: 50px;
    color: #000;
    }
    </style>
    </head>
    <body>
    <div class="container">
    <h1> Mess Item List</h1>
    <div class="summary">
    <div><strong>Buyer Name :</strong> Akash Verma</div>
    <div><strong>Shopping Date :</strong> 04-Nov-2024</div>
    <div><strong>Advance :</strong> 750.00</div>
    <div><strong>Expense :</strong> 840.00</div>
    <div><strong>Balance :</strong> -90.00</div>
    </div>
    <h4>Item List 04-Nov-2024</h4>
    <table id="shoppingList">
    <thead><tr><th>Sr.No</th><th>Item Name</th><th>Qty</th><th>Unit</th><th>Amount</th></tr></thead>
    <tbody>
    <tr>
    <td>1</td>
    <td>Tamatar</td>
    <td>1.000</td>
    <td>Kg</td>
    <td>60.00</td>
    </tr>
    <tr>
    <td>2</td>
    <td>Mirch Hara</td>
    <td>250.000</td>
    <td>Gram</td>
    <td>20.00</td>
    </tr>
    <tr>
    <td>3</td>
    <td>Soyabin</td>
    <td>250.000</td>
    <td>Gram</td>
    <td>25.00</td>
    </tr>
    <tr>
    <td>4</td>
    <td>Saraso Tel</td>
    <td>2.000</td>
    <td>Litre</td>
    <td>320.00</td>
    </tr>
    <tr>
    <td>5</td>
    <td>Kabuli Chana</td>
    <td>500.000</td>
    <td>Gram</td>
    <td>70.00</td>
    </tr>
    <tr>
    <td>6</td>
    <td>Rahar Dal</td>
    <td>1.000</td>
    <td>Kg</td>
    <td>170.00</td>
    </tr>
    <tr>
    <td>7</td>
    <td>Besan</td>
    <td>500.000</td>
    <td>Gram</td>
    <td>55.00</td>
    </tr>
    <tr>
    <td>8</td>
    <td>Chana Dal</td>
    <td>1.000</td>
    <td>Kg</td>
    <td>100.00</td>
    </tr>
    <tr>
    <td>9</td>
    <td>Matar</td>
    <td>500.000</td>
    <td>Gram</td>
    <td>20.00</td>
    </tr>
    </tbody>
    </table>
    </div>
    </body>
    </html>


4- Now need to call method to generate pdf from view, via button click.

@using (@Html.BeginForm("GeneratePdf", "Admin", FormMethod.Post, new { target = "_blank" }))
{
// Rest Code
    <button type="submit" id="btngeneratePDF" class="btn btn-primary"><i class="fa fa-download"></i>
&nbsp;Generate PDF</button>
}

Output : 

Leave a Reply

Your email address will not be published. Required fields are marked *


Talk to us?

Post your blog

F.A.Q

Frequently Asked Questions