Почему table.addcell (ячейка) будет просто отображать HTML-код в iTextSharp - PullRequest
2 голосов
/ 09 ноября 2011

Я сейчас пытаюсь экспортировать gridview в файл PDF.

Мой код:

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

Он может экспортировать PDF и экспортировать весь столбец, который я хочу, но кроме изображения, другие ячейки просто отображают HTML-код <table><tr><td>text</td></tr></table>.

Что это и как я могу решить?

1 Ответ

0 голосов
/ 09 ноября 2011

У меня нет прямого ответа, но я могу с уверенностью сказать вам, что проблема будет в том, что вы делаете для установки содержимого PdfPCell.Ядро iTextSharp не имеет понятия HTML, почти все команды основаны на PDF, и есть пара специфичных для .Net. - это парсер, который превращает HTML в команды на основе PDF, но вы его не используете.Поэтому все, что вы делаете для получения содержимого ячейки, возвращает HTML, который iTextSharp рассматривает как строковый литерал.Вам нужно будет либо, чтобы ваши алгоритмы возвращали только текст, либо использовать iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList для преобразования HTML в объекты iTextSharp.

...