I’m currently trying to export gridview to pdf file.
My code is:
public void GvExportPDF(GridView gvListing, string fileName,int TotalColumns)
{
http.Response.ContentType = "application/pdf";
http.Response.AddHeader("content-disposition", "attachment;filename= " + fileName + ".pdf");
http.Response.Cache.SetCacheability(HttpCacheability.NoCache);
StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
gvListing.AllowPaging = false;
PdfPTable table = new PdfPTable(TotalColumns);
foreach (GridViewRow rows in gvListing.Rows)
{
if (rows.RowType == DataControlRowType.Header)
{
for (int i = 0; i < rows.Cells.Count; i++)
{
PdfPCell cell = new PdfPCell();
cell.Phrase = new Phrase(getCellText(rows.Cells[i]));
table.AddCell(cell);
}
}
else if (rows.RowType == DataControlRowType.DataRow)
{
System.Web.UI.WebControls.Image Image1 = (System.Web.UI.WebControls.Image)rows.FindControl("Image1");
string url = Image1.ImageUrl;
Image1.Visible = false;
iTextSharp.text.Image jpg = iTextSharp.text.Image.GetInstance(new Uri(url));
jpg.ScaleToFit(8f, 10f);
jpg.Border = Rectangle.NO_BORDER;
for (int i = 0; i < rows.Cells.Count; i++)
{
if (i == 0)
table.AddCell(jpg);
else
{
PdfPCell cell = new PdfPCell(new Phrase(HttpContext.Current.Server.HtmlDecode(getCellText(rows.Cells[i]))));
table.AddCell(cell);
}
}
}
}
//gvListing.RenderControl(hw);
StringReader sr = new StringReader(sw.ToString());
Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
PdfWriter.GetInstance(pdfDoc, http.Response.OutputStream);
try
{
pdfDoc.Open();
pdfDoc.Add(table);
}
catch (DocumentException dex)
{
//http.Response.Write(dex.Message);
System.Diagnostics.Debug.WriteLine(dex.Message);
}
catch (IOException ioex)
{
//http.Response.Write(ioex.Message);
System.Diagnostics.Debug.WriteLine(ioex.Message);
}
catch (Exception ex)
{
//http.Response.Write(ex.Message);
System.Diagnostics.Debug.WriteLine(ex.Message);
}
finally
{
pdfDoc.Close();
//http.Response.Write(StyleOfExportTable());
http.Response.Output.Write(pdfDoc);
http.Response.End();
}
}
private string getCellText(TableCell cell)
{
StringBuilder sb = new StringBuilder(cell.Text);
foreach (Control c in cell.Controls)
{
if (c.Visible)
{
string controlText = getTextProperty(c);
if (controlText != null)
{
if (sb.Length > 0) sb.Append(" ");
sb.Append(controlText);
}
}
}
return sb.ToString();
}
private string getTextProperty(object o)
{
PropertyInfo propertyInfo = o.GetType().GetProperty("Text");
if (propertyInfo != null)
{
MethodInfo getMethod = propertyInfo.GetGetMethod();
if (getMethod != null)
{
return (string)getMethod.Invoke(o, null);
}
}
return string.Empty;
}
It can export pdf and can export the total column I want but besides the image, others cell just display the html code <table><tr><td>text</td></tr></table>.
What is this and how can I solve it?
I don’t have a direct answer but I can tell you with almost certainty that the problem is going to be with whatever you are doing to set the contents of the
PdfPCell. The core of iTextSharp has no concept of HTML, almost all commands are PDF-based with a couple of .Net-specific ones in there. There is a parser that turns HTML into PDF-based commands but you aren’t using it. So whatever you are doing to get a cell’s contents is returning HTML which iTextSharp is treating as a string literal. You will either need to have your algorithms return text only or use theiTextSharp.text.html.simpleparser.HTMLWorker.ParseToListto convert the HTML to iTextSharp objects.