Convert HTML content to Pdf using c# and asp.net

2019-05-08 05:18发布

问题:

Here i am trying to convert the content inside html div tag to pdf i found the following error:

Input string was not in a correct format is occur

Here is the code i tried using c#:

public string getWhileLoopData()
{
 string htmlStr = "";
 SqlConnection thisConnection = new SqlConnection("Data Source=VELU-PC\\SQLEXPRESS;Initial Catalog=EEP;Trusted_Connection=True;");
        SqlCommand thisCommand = thisConnection.CreateCommand();
        thisCommand.CommandText = "select * from Product_category";
        thisConnection.Open();
        SqlDataReader reader = thisCommand.ExecuteReader();
        while (reader.Read())
        {
            string id = reader.GetString(6);
            string Name = reader.GetString(3);
            string Pass = reader.GetString(5);
            htmlStr += "<tr><td><table width='200px'><tr><td align='center'><img src=" + id + " /></td></tr><tr><td align='center'>" + Name + "</td></tr></table></td><td><table width='600px'><tr><td align='left' style='border:1px solid blue;border-radius:7px;box-shadow: 10px 0 10px #888888; padding: 8px 6px 0 7px;'>Features: <br/><p style='margin-top: 10px;'>" + Pass + "</p></td></tr></table></td></tr>";               
        }
        thisConnection.Close();
        return htmlStr;
}    
void generatetable()
{
    divexcel.Visible = true;
    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", "attachment;filename=TestPage.pdf");
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    StringWriter sw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(sw);
    divexcel.RenderControl(hw);
    StringReader sr = new StringReader(sw.ToString());
    Document pdfDoc = new Document(PageSize.A4, 80f, 80f, -2f, 35f);
    HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
    PdfWriter writer = PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
    pdfDoc.Open();
    htmlparser.Parse(sr);
    pdfDoc.Close();
    Response.Write(pdfDoc);
    Response.End();
}
public override void VerifyRenderingInServerForm(System.Web.UI.Control control)
{ }
protected void button_Click(object sender, EventArgs e)
{
    generatetable();
}

Here is my html code:

        <div id="divexcel" runat="server">
    <table><tr><td><asp:Button ID="button" runat="server" Text="Submit" 
        onclick="button_Click" /></td></tr></table>
    <table align="center" width="100%">
        <tr>
            <td>
                <table>
                    <tr><td align="center">ID</td></tr>
                    <tr><td align="center">Name </td></tr>
                </table>
            </td>
            <td>
                <table>
                    <tr><td align='left'>Features: <br/><p>Pass</p></td></tr>
                </table>
            </td>
            </tr>                       

        <%=getWhileLoopData()%>

    </table>


    </div>

回答1:

Try to replace width='200px' with width='200' it should work. Remove px from every places with width.



回答2:

I recommended to don't use the htmlworker because it is the old one and won't support css styles, so try to use the xmlworker insted of htmlworker. It is very simple refer the following code.
Refer from here

protected void lnkPDF_Clicked(object sender, EventArgs e)
{

    Document Doc;
    Doc = new Document(PageSize.A4, 10f, 10f, 50f, 20f);

    string filename = "PaySlip";         
    string outXml = selectedhtml.Value;
    outXml = "<style>#tdiv1{background:red;color:white;}</style>" + outXml;
    outXml = outXml.Replace("px", "");
    outXml = outXml.Replace("<br>", "<br/>");

    MemoryStream memStream = new MemoryStream();
    TextReader xmlString = new StringReader(outXml);
    using (Document document = new Document())
    {
        PdfWriter writer = PdfWriter.GetInstance(document, memStream);
        document.Open();
        byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(outXml);
        MemoryStream ms = new MemoryStream(byteArray);
        XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, ms, System.Text.Encoding.UTF8);
        document.Close();
    }

    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", "attachment;filename=" + filename + ".pdf");
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.BinaryWrite(memStream.ToArray());
    Response.End();
    Response.Flush();
}