C# iTextSharp中HTMLWorker上的堆栈空异常
我正在使用此代码以pdf格式发送数据表。但是在使用html解析器转换数据时,它将异常显示为堆栈空。不管我以前做过什么,而且成功了,我只是不能指出我现在错过了什么。请帮忙C# iTextSharp中HTMLWorker上的堆栈空异常,c#,asp.net,itext,C#,Asp.net,Itext,我正在使用此代码以pdf格式发送数据表。但是在使用html解析器转换数据时,它将异常显示为堆栈空。不管我以前做过什么,而且成功了,我只是不能指出我现在错过了什么。请帮忙 using (StringWriter sw = new StringWriter()) { using (HtmlTextWriter hw = new HtmlTextWriter(sw)) { StringBuilder sb = new StringBuil
using (StringWriter sw = new StringWriter())
{
using (HtmlTextWriter hw = new HtmlTextWriter(sw))
{
StringBuilder sb = new StringBuilder();
//sb.Append("<table width='100%' cellspacing='0' cellpadding='2'>");
foreach (DataColumn column in dt.Columns)
{
//sb.Append("<th style = 'background-color: #D20B0C;color:#ffffff'>");
sb.Append(column.ColumnName);
sb.Append("</th>");
}
sb.Append("</tr>");
foreach (DataRow row in dt.Rows)
{
sb.Append("<tr>");
foreach (DataColumn column in dt.Columns)
{
sb.Append("<td>");
sb.Append(row[column]);
sb.Append("</td>");
}
sb.Append("</tr>");
}
sb.Append("</table>");
using (MemoryStream memoryStream = new MemoryStream())
{
PdfWriter writer = PdfWriter.GetInstance(pdfDoc, memoryStream);
pdfDoc.Open();
htmlparser.Parse(sr);//here is the error
pdfDoc.Close();
byte[] bytes = memoryStream.ToArray();
memoryStream.Close();
MailMessage mm = new MailMessage(txtEmail.Text.Trim(), email.Trim());
mm.Subject = txtSubject.Text.Trim();
//mm.CC.Add = txtcc.Text.Trim();
mm.Body = txtBody.Text.Trim();
mm.Attachments.Add(new Attachment(new MemoryStream(bytes), "iTextSharpPDF.pdf"));
mm.IsBodyHtml = true;
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.gmail.com";
smtp.EnableSsl = true;
NetworkCredential NetworkCred = new NetworkCredential();
NetworkCred.UserName = txtEmail.Text.Trim();
NetworkCred.Password = txtPassword.Text.Trim();
smtp.UseDefaultCredentials = true;
smtp.Credentials = NetworkCred;
smtp.Port = 587;
smtp.Send(mm);
}
使用(StringWriter sw=new StringWriter())
{
使用(HtmlTextWriter hw=新的HtmlTextWriter(sw))
{
StringBuilder sb=新的StringBuilder();
//某人加上(“”);
foreach(dt.Columns中的DataColumn列)
{
//某人加上(“”);
sb.Append(column.ColumnName);
某人加上(“”);
}
某人加上(“”);
foreach(数据行中的数据行)
{
某人加上(“”);
foreach(dt.Columns中的DataColumn列)
{
某人加上(“”);
sb.追加(行[列]);
某人加上(“”);
}
某人加上(“”);
}
某人加上(“”);
使用(MemoryStream MemoryStream=new MemoryStream())
{
PdfWriter writer=PdfWriter.GetInstance(pdfDoc,memoryStream);
pdfDoc.Open();
htmlparser.Parse(sr);//下面是错误
pdfDoc.Close();
byte[]bytes=memoryStream.ToArray();
memoryStream.Close();
MailMessage mm=新邮件消息(txtmail.Text.Trim(),email.Trim());
mm.Subject=txtSubject.Text.Trim();
//mm.CC.Add=txtcc.Text.Trim();
mm.Body=txtBody.Text.Trim();
添加(新附件(新内存流(字节),“iTextSharpPDF.pdf”);
mm.IsBodyHtml=true;
SmtpClient smtp=新SmtpClient();
smtp.Host=“smtp.gmail.com”;
smtp.EnableSsl=true;
NetworkCredential NetworkCred=新的NetworkCredential();
NetworkCred.UserName=txtEmail.Text.Trim();
NetworkCred.Password=txtPassword.Text.Trim();
smtp.UseDefaultCredentials=true;
smtp.Credentials=NetworkCred;
smtp.Port=587;
smtp.Send(mm);
}
}
}您缺少打开标记,这就是组件抛出异常的原因,因为它读取未打开的关闭标记,堆栈为空(可能它使用堆栈跟踪打开/关闭标记):
使用(StringWriter sw=new StringWriter())
{
使用(HtmlTextWriter hw=新的HtmlTextWriter(sw))
{
StringBuilder sb=新的StringBuilder();
某人加上(“”);
某人加上(“”);
foreach(dt.Columns中的DataColumn列)
{
某人加上(“”);
sb.Append(column.ColumnName);
某人加上(“”);
}
某人加上(“”);
foreach(数据行中的数据行)
{
某人加上(“”);
foreach(dt.Columns中的DataColumn列)
{
某人加上(“”);
sb.追加(行[列]);
某人加上(“”);
}
某人加上(“”);
}
某人加上(“”);
1)在通过StringBuilder
等工具构建html
的同时,进行如下更改
StringBuilder sb = new StringBuilder();
//Open table
sb.Append("<table width='100%' cellspacing='0' cellpadding='2'>");
//Open first tr for all of th
sb.Append("<tr>");
foreach (DataColumn column in dt.Columns)
{
sb.Append("<th style = 'background-color: #D20B0C;color:#ffffff'>");
sb.Append(column.ColumnName);
sb.Append("</th>");
}
//Close first tr for all of th
sb.Append("</tr>");
foreach (DataRow row in dt.Rows)
{
//Open tr for all of rows
sb.Append("<tr>");
foreach (DataColumn column in dt.Columns)
{
sb.Append("<td>");
sb.Append(row[column]);
sb.Append("</td>");
}
//Close tr for all of rows
sb.Append("</tr>");
}
//Close table
sb.Append("</table>");
看到这个了吗
请再试一次,可能会对您有所帮助。什么是sr变量。如果是HTML字符串,请在该行上设置断点。复制HTML字符串并运行一些联机HTML解析器工具,检查错误的位置。看起来HTML字符串中有问题。StringReader sr=new StringReader(sb.ToString());Document pdfDoc=new Document(PageSize.A4、10f、10f、10f、0f);HTMLWorker htmlparser=新HTMLWorker(pdfDoc);sr是字符串读取器,sb是字符串生成器您是否在字符串生成器中获取html意味着
sb.ToString()
从html文件或您在程序中以硬编码方式构建html?在字符串生成器中获取html是否可以在post中添加字符串生成器代码?@Tanvi Dutta,查看答案可能对您有帮助:)@Tanvi Dutta,如果答案对您有帮助,请接受它,或者如果您有任何问题,请告诉我:)
StringBuilder sb = new StringBuilder();
//Open table
sb.Append("<table width='100%' cellspacing='0' cellpadding='2'>");
//Open first tr for all of th
sb.Append("<tr>");
foreach (DataColumn column in dt.Columns)
{
sb.Append("<th style = 'background-color: #D20B0C;color:#ffffff'>");
sb.Append(column.ColumnName);
sb.Append("</th>");
}
//Close first tr for all of th
sb.Append("</tr>");
foreach (DataRow row in dt.Rows)
{
//Open tr for all of rows
sb.Append("<tr>");
foreach (DataColumn column in dt.Columns)
{
sb.Append("<td>");
sb.Append(row[column]);
sb.Append("</td>");
}
//Close tr for all of rows
sb.Append("</tr>");
}
//Close table
sb.Append("</table>");
PdfWriter writer = PdfWriter.GetInstance(pdfDoc, memoryStream);
pdfDoc.Open();
XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr);
pdfDoc.Close();
byte[] bytes = memoryStream.ToArray();
memoryStream.Close();