ตัวอย่างการสร้าง 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 ดังรูป
ไม่มีความคิดเห็น:
แสดงความคิดเห็น