使用c#和asp.net将HTML内容转换为Pdf

时间:2013-10-26 06:57:26

标签: c# html asp.net pdf itext

我试图将 html div标签内的内容转换为pdf ,我发现以下错误:

输入字符串格式不正确

以下是我尝试使用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();
}

这是我的HTML代码:

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

2 个答案:

答案 0 :(得分:3)

我建议不要使用htmlworker因为它是旧的并且不支持css样式,所以尝试使用htmlworker的xmlworker。这很简单,请参考以下代码。
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();
}

答案 1 :(得分:0)

尝试将width ='200px'替换为width ='200'它应该有效。从每个有宽度的地方删除px。