如何在asp.net中使用itextsharp启动或不启动新页面

时间:2014-12-05 07:30:55

标签: asp.net itextsharp

我有一个数据集,其中有多个记录可用,我正在从中创建PDF。 每条记录的数据都没有修复它可能包含任意数量的页面,现在我想在每页末尾添加姓氏。每当我想用页脚做的时候,每个页面上都会显示相同的名字,但我想要记录正在打印的人的姓名。

这是我的代码 @ K.C.

    Document document = new Document();
    //PdfWriter writer =  PdfWriter(document, Response.OutputStream);
    PdfWriter writer = PdfWriter.GetInstance(document, Response.OutputStream);

    document.Open();
    for (int i = 0; i < ds.Tables["ab"].Rows.Count ; i++)
    {

       // calling PDFFooter class to Include in document
        footer = ds.Tables["ab"].Rows[i]["lName"].ToString();
        PdfPTable table = new PdfPTable(2);
        table.SetWidths(new int[] { 3, 3 });
        table.SpacingBefore = 5f;


        PdfPCell cell;
        Phrase phrase = new Phrase();
        var blackListTextFont = FontFactory.GetFont("Arial", 10f, Color.WHITE);
        var innerrtextFont = FontFactory.GetFont("Arial", 7f, Color.BLACK);
        phrase.Add(new Chunk(ds.Tables["ab"].Rows[i]["header"].ToString(), blackListTextFont));
        cell = new PdfPCell(new Phrase(phrase));
        cell.Colspan = 2;
        cell.Padding = 5f;
        cell.BackgroundColor = new Color(85, 142, 213); 
        table.AddCell(cell);
        table.CompleteRow();
        writer.PageEvent = new PDFFooter(ds.Tables["ab"].Rows[i]["lName"].ToString());
        document.Add(table);
        document.NewPage();

    }
    document.Close();
    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", "attachment; filename= SampleExport.pdf");
    Response.End();
    Connection.Close();
}

public override void OnEndPage(PdfWriter writer, Document document)
{
    base.OnEndPage(writer, document);
    PdfPTable tabFot = new PdfPTable(new float[] { 1F });
    PdfPCell cell;
    tabFot.TotalWidth = 300F;
    string lname = cp;
    cell = new PdfPCell(new Phrase(lname));
    tabFot.AddCell(cell);
    tabFot.WriteSelectedRows(0, -1, 150, document.Bottom, writer.DirectContent);
    lname = null;
}

1 个答案:

答案 0 :(得分:1)

您使用

writer.PageEvent = new PDFFooter(ds.Tables["ab"].Rows[i]["lName"].ToString());

在循环中更新PageEvent的{​​{1}}。

不幸的是,这种C#语法(就像在iText / Java中使用setter一样)具有误导性:

PdfWriter
  

PdfWriter.cs

因此,上面引用的代码行替换 当前的 public virtual IPdfPageEvent PageEvent { get { return pageEvent; } set { if (value == null) this.pageEvent = null; else if (this.pageEvent == null) this.pageEvent = value; else if (this.pageEvent is PdfPageEventForwarder) ((PdfPageEventForwarder)this.pageEvent).AddPageEvent(value); else { PdfPageEventForwarder forward = new PdfPageEventForwarder(); forward.AddPageEvent(this.pageEvent); forward.AddPageEvent(value); this.pageEvent = forward; } } } 实例,而是 添加 它解释了你对你的评论的观察:

  

每次页脚与前一个页脚合并然后打印

您必须先清除现有的页面事件:

PageEvent

(参见上面writer.PageEvent = null; writer.PageEvent = new PDFFooter(ds.Tables["ab"].Rows[i]["lName"].ToString()); 值的特殊处理)或使用单个null实现实例,其中您只更改成员变量,而成员变量又用作页脚文本。