0

我正在使用 itextsharp 生成动态事件列表的 pdf。我已将 gridview 设置为 visible = false 但我的理解是我需要一个 gridview 才能导出为 pdf。

我打开pdf,它是空白的,就像网格中的信息没有正确复制一样。我可能错过了使用 gridview 进行数据绑定的步骤。

这是网格视图:

<asp:GridView BackColor="Green" ID="gvEventCaf" runat="server" visible="false" >
 <Columns>
        <asp:TemplateField HeaderText="EventName" 
            SortExpression="EventName" >
            <ItemTemplate>
                <%# Eval("EventName") %>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="EventDate" 
            SortExpression="EventDate">
            <ItemTemplate>
                <%# Eval("EventDate") %>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="EventTime" 
            SortExpression="EventTime">
            <ItemTemplate>
                <%# Eval("EventTime") %>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Description" 
            SortExpression="Description">
            <ItemTemplate>
                <%# Eval("Description") %>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>`

这是代码隐藏:

using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html;
using iTextSharp.text.html.simpleparser;
using System.IO;

public partial class Objects_EventList : System.Web.UI.UserControl
{

public string city;
public int showcount;

protected void Page_Load(object sender, EventArgs e)
{

    if (!IsPostBack)
    {
        Load_Events();
    };
}

protected void Load_Events()
{
    EventsDataContext edc = new EventsDataContext();

    var events = (from e in edc.tblEvents_Cafes
                  where e.EventDateTime >= DateTime.Now && e.VenueCity.Trim() == city.Trim() && (e.VenueName.Contains("Café") || e.VenueName.Contains("Cafe") )
                  orderby e.EventDateTime
                  select new {
                      EventName = e.EventName,
                      EventDate = e.EventDate,
                      EventTime = e.EventTime,
                      Description = edc.tblEvents_Cafe_Descriptions.OrderBy(d => d.Priority).Where(d => d.Keywords.ToLower() == e.EventName.ToLower()).Select(d => d.Description).First(), // edc.tblEvents_Cafe_Descriptions.OrderBy(d => d.Priority).Where(d => d.Keywords.ToLower() == e.EventName.ToLower() || d.Keywords.ToLower().CompareTo(e.EventName.ToLower()) >= 0).Select(d => d.Description).First()
                  }).Take(showcount);

    gvEventCaf.DataSource = events;
    gvEventCaf.DataBind();
}


protected void btnGenerateReport(object sender, EventArgs e)
{
    gvEventCaf.DataBind();

 //Create a table

iTextSharp.text.Table table = new iTextSharp.text

             .Table(gvEventCaf.Columns.Count);

table.Cellpadding = 5;





//Transfer rows from GridView to table

for (int i = 0; i < gvEventCaf.Rows.Count; i++)

{

    if (gvEventCaf.Rows[i].RowType == DataControlRowType.DataRow)

    {

        for (int j = 0; j < gvEventCaf.Columns.Count; j++)

        {

            string cellText = Server.HtmlDecode

                              (gvEventCaf.Rows[i].Cells[j].Text);

            iTextSharp.text.Cell cell = new iTextSharp.text.Cell(cellText);



            //Set Color of Alternating row

            if (i % 2 != 0)

            {

                cell.BackgroundColor = new Color(System.Drawing

                                    .ColorTranslator.FromHtml("#C2D69B"));

            }

            table.AddCell(cell);

        }

    }

}



//Create the PDF Document

Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);

PdfWriter.GetInstance(pdfDoc, Response.OutputStream);

pdfDoc.Open();

pdfDoc.Add(table);

pdfDoc.Close(); 

Response.ContentType = "application/pdf";

Response.AddHeader("content-disposition", "attachment;" +

                               "filename=GridViewExport.pdf");

Response.Cache.SetCacheability(HttpCacheability.NoCache);

Response.Write(pdfDoc);

Response.End();

  }
}   
4

1 回答 1

0

尝试使用这组代码从 html 中获取内容并使用 ItextSharp 保存为 pdf。

gd.DataSource = GetTable();
        gd.DataBind();


        System.IO.StringWriter stringWrite = new System.IO.StringWriter();

        System.Web.UI.HtmlTextWriter htmlWrite =
        new HtmlTextWriter(stringWrite);

        gd.RenderControl(htmlWrite);

        String htmlText = "<div>" + stringWrite.ToString() +"</div>";

        using (FileStream fs = new FileStream(Request.PhysicalApplicationPath + "\\test.htm", FileMode.Create))
        {
            using (StreamWriter w = new StreamWriter(fs, Encoding.UTF8))
            {
                w.WriteLine(htmlText);
            }
        }

          String html = String.Empty;
          using (StreamReader sr = new StreamReader(Request.PhysicalApplicationPath + "\\test.htm"))
          {
              html = sr.ReadToEnd();
          }

          Document document = new Document();

          PdfWriter.GetInstance(document, new FileStream(Request.PhysicalApplicationPath + "\\outfile.pdf", FileMode.Create));
          document.Open();
          iTextSharp.text.html.simpleparser.StyleSheet styles = new iTextSharp.text.html.simpleparser.StyleSheet();
          iTextSharp.text.html.simpleparser.HTMLWorker hw = new iTextSharp.text.html.simpleparser.HTMLWorker(document);
          hw.Parse(new StringReader(html));
          document.Close();

          Response.ClearContent();
          Response.ClearHeaders();
          Response.AddHeader("Content-Disposition", "inline;filename=outfile.pdf");
          Response.ContentType = "application/pdf";
          Response.WriteFile(Request.PhysicalApplicationPath + "\\outfile.pdf");
          Response.Flush();
          Response.Clear();




public static DataTable GetTable()
    {

        DataTable table = new DataTable();
        table.Columns.Add("Dosage", typeof(int));
        table.Columns.Add("Drug", typeof(string));
        table.Columns.Add("Patient", typeof(string));
        table.Columns.Add("Date", typeof(DateTime));


        table.Rows.Add(25, "Indocin", "David", DateTime.Now);
        table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
        table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
        table.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
        table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
        return table;
    }
于 2013-08-29T13:04:17.670 回答