我有一个数据集,其中有多个记录可用,我正在从中创建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;
}
答案 0 :(得分:1)
您使用
writer.PageEvent = new PDFFooter(ds.Tables["ab"].Rows[i]["lName"].ToString());
在循环中更新PageEvent
的{{1}}。
不幸的是,这种C#语法(就像在iText / Java中使用setter一样)具有误导性:
PdfWriter
因此,上面引用的代码行不替换 当前的 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
实现实例,其中您只更改成员变量,而成员变量又用作页脚文本。