:: Kunagorn Sirikup :: C# Developer

11/12/56

iTextSharp สร้าง Footer แสดงหน้าและจำนวนหน้า

ตัวอย่างการสร้าง 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)
จะได้ 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 ดังรูป

ไม่มีความคิดเห็น:

แสดงความคิดเห็น