ตัวอย่างการสร้าง Footer ที่แสดงจำนวนหน้าในรูปแบบ n of m หรือพูดง่ายๆคืิอ แสดงเลขที่หน้า และ จำนวนหน้าทั้งหมด โดยใช้ iTextSharp มาลองดูวิธีสร้างกันนะครับ
เรื่มต้นผมจะเริ่มจากสร้าง class ขึ้นมาชื่อว่า PDFPageEvent โดย Inherit iTextSharp.text.pdf.PdfPageEventHelper แล้ว โดยจะ override method ดังนี้
- OnOpenDocument(PdfWriter writer, Document document)
- OnStartPage(PdfWriter writer, Document document)
- OnEndPage(PdfWriter writer, Document document)
- OnCloseDocument(PdfWriter writer, Document document)
- OnStartPage(PdfWriter writer, Document document)
- OnEndPage(PdfWriter writer, Document document)
- OnCloseDocument(PdfWriter writer, Document document)
จะได้ Code ตามนี้ครับ
using iTextSharp.text;
using iTextSharp.text.pdf;
public class PDFPageEvent : iTextSharp.text.pdf.PdfPageEventHelper
{
// This is the contentbyte object of the writer
PdfContentByte cb;
// we will put the final number of pages in a template
PdfTemplate template;
// this is the BaseFont we are going to use for the header / footer
BaseFont bf = null;
// This keeps track of the creation time
DateTime PrintTime = DateTime.Now;
public string Title { get; set; }
public string HeaderLeft { get; set; }
public string HeaderRight { get; set; }
public Font HeaderFont { get; set; }
public Font FooterFont { get; set; }
// write on top of document
public override void OnOpenDocument(PdfWriter writer, Document document)
{
base.OnOpenDocument(writer, document);
try
{
PrintTime = DateTime.Now;
bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
cb = writer.DirectContent;
template = cb.CreateTemplate(50, 50);
}
catch (DocumentException de)
{
}
catch (System.IO.IOException ioe)
{
}
}
// write on start of each page
public override void OnStartPage(PdfWriter writer, Document document)
{
base.OnStartPage(writer, document);
Rectangle pageSize = document.PageSize;
if (Title != string.Empty)
{
cb.BeginText();
cb.SetFontAndSize(bf, 15);
cb.SetRGBColorFill(50, 50, 200);
cb.SetTextMatrix(pageSize.GetLeft(40), pageSize.GetTop(40));
cb.ShowText(Title);
cb.EndText();
}
if (HeaderLeft + HeaderRight != string.Empty)
{
PdfPTable HeaderTable = new PdfPTable(2);
HeaderTable.DefaultCell.VerticalAlignment = Element.ALIGN_MIDDLE;
HeaderTable.TotalWidth = pageSize.Width - 80;
HeaderTable.SetWidthPercentage(new float[] { 45, 45 }, pageSize);
PdfPCell HeaderLeftCell = new PdfPCell(new Phrase(8, HeaderLeft, HeaderFont));
HeaderLeftCell.Padding = 5;
HeaderLeftCell.PaddingBottom = 8;
HeaderLeftCell.BorderWidthRight = 0;
HeaderTable.AddCell(HeaderLeftCell);
PdfPCell HeaderRightCell = new PdfPCell(new Phrase(8, HeaderRight, HeaderFont));
HeaderRightCell.HorizontalAlignment = PdfPCell.ALIGN_RIGHT;
HeaderRightCell.Padding = 5;
HeaderRightCell.PaddingBottom = 8;
HeaderRightCell.BorderWidthLeft = 0;
HeaderTable.AddCell(HeaderRightCell);
cb.SetRGBColorFill(0, 0, 0);
HeaderTable.WriteSelectedRows(0, -1, pageSize.GetLeft(40), pageSize.GetTop(50), cb);
}
}
// write on end of each page
public override void OnEndPage(PdfWriter writer, Document document)
{
base.OnEndPage(writer, document);
int pageN = writer.PageNumber;
String text = "Page " + pageN + " of ";
float len = bf.GetWidthPoint(text, 8);
Rectangle pageSize = document.PageSize;
cb.SetRGBColorFill(100, 100, 100);
cb.BeginText();
cb.SetFontAndSize(bf, 8);
cb.SetTextMatrix(pageSize.GetLeft(40), pageSize.GetBottom(30));
cb.ShowText(text);
cb.EndText();
cb.AddTemplate(template, pageSize.GetLeft(40) + len, pageSize.GetBottom(30));
cb.BeginText();
cb.SetFontAndSize(bf, 8);
cb.ShowTextAligned(PdfContentByte.ALIGN_RIGHT,
"Create : " + PrintTime.ToString(),
pageSize.GetRight(40),
pageSize.GetBottom(30), 0);
cb.EndText();
}
//write on close of document
public override void OnCloseDocument(PdfWriter writer, Document document)
{
base.OnCloseDocument(writer, document);
template.BeginText();
template.SetFontAndSize(bf, 8);
template.SetTextMatrix(0, 0);
template.ShowText("" + (writer.PageNumber - 1));
template.EndText();
}
}
ที่นี้มาดูวิธีการเรียกใช้งานกันนะครับว่าทำอย่างไรบ้าง
Document document = new Document(); document.Open(); PdfWriter instance = PdfWriter.GetInstance(document, viewContext.HttpContext.Response.OutputStream); // สร้าง Event Handler PDFPageEvent pageevent = new PDFPageEvent(); // กำหนดค่า PageEvent โดยใช้ Event Handler ที่สร้างมา instance.PageEvent = pageevent
เท่านี้ก็สามารถสร้างแสดงจำนวนหน้าในรูปแบบในส่วน Footer ไ้ด้แล้วครับ ตัวอย่าง Footer ดังรูป




