How to Add Page number in Footer in PDF by Itextsharp

后端 未结 4 843
遥遥无期
遥遥无期 2020-12-05 19:51

I am using iTextSharp DLL in ASP.NET code. I am fetching a data into dataset and Add the dataset into PDF table.

If my dataset have more 100 rows then 100 rows will

相关标签:
4条回答
  • 2020-12-05 20:24

    You need to inherit from PdfPageEventHelper class and override the methods shown in the code snippet below:

    Document doc = new Document(PageSize.A4.Rotate());        
    
    using (MemoryStream ms = new MemoryStream())
    {
      PdfWriter writer = PdfWriter.GetInstance(doc, ms);
      PageEventHelper pageEventHelper = new PageEventHelper();
      writer.PageEvent = pageEventHelper;
    }
    
     public class PageEventHelper : PdfPageEventHelper
        {
            PdfContentByte cb;
            PdfTemplate template;
    
    
            public override void OnOpenDocument(PdfWriter writer, Document document)
            {
                cb = writer.DirectContent;
                template = cb.CreateTemplate(50, 50);
            }
    
            public override void OnEndPage(PdfWriter writer, Document document)
            {
                base.OnEndPage(writer, document);
    
                int pageN = writer.PageNumber;
                String text = "Page " + pageN.ToString() + " of ";
                float len = this.RunDateFont.BaseFont.GetWidthPoint(text, this.RunDateFont.Size);
    
                iTextSharp.text.Rectangle pageSize = document.PageSize;
    
                cb.SetRGBColorFill(100, 100, 100);
    
                cb.BeginText();
                cb.SetFontAndSize(this.RunDateFont.BaseFont, this.RunDateFont.Size);
                cb.SetTextMatrix(document.LeftMargin, pageSize.GetBottom(document.BottomMargin));
                cb.ShowText(text);
    
                cb.EndText();
    
                cb.AddTemplate(template, document.LeftMargin + len, pageSize.GetBottom(document.BottomMargin));
            }
    
            public override void OnCloseDocument(PdfWriter writer, Document document)
            {
                base.OnCloseDocument(writer, document);
    
                template.BeginText();
                template.SetFontAndSize(this.RunDateFont.BaseFont, this.RunDateFont.Size);
                template.SetTextMatrix(0, 0);
                template.ShowText("" + (writer.PageNumber - 1));
                template.EndText();
            }
        }
    
    0 讨论(0)
  • 2020-12-05 20:26

    You must inherit pageeventhepler to add page number to dynamically generated pdf pages.

    public void printPdf()
    {
        Document doc = new Document(PageSize.A4.Rotate());
        using (MemoryStream ms = new MemoryStream())
        {
            PdfWriter writer = PdfWriter.GetInstance(doc, ms);
            PageEventHelper pageEventHelper = new PageEventHelper();
            writer.PageEvent = pageEventHelper;
        }
    }
    
    public class PageEventHelper : PdfPageEventHelper
    {
        PdfContentByte cb;
        PdfTemplate template;
    
    
        public override void OnOpenDocument(PdfWriter writer, Document document)
        {
            cb = writer.DirectContent;
            template = cb.CreateTemplate(50, 50);
        }
    
        public override void OnEndPage(PdfWriter writer, Document document)
        {
            base.OnEndPage(writer, document);
    
            int pageN = writer.PageNumber;
            String text = "Page " + pageN.ToString() + " of ";
            float len = this.RunDateFont.BaseFont.GetWidthPoint(text, this.RunDateFont.Size);
    
            iTextSharp.text.Rectangle pageSize = document.PageSize;
    
            cb.SetRGBColorFill(100, 100, 100);
    
            cb.BeginText();
            cb.SetFontAndSize(this.RunDateFont.BaseFont, this.RunDateFont.Size);
            cb.SetTextMatrix(document.LeftMargin, pageSize.GetBottom(document.BottomMargin));
            cb.ShowText(text);
    
            cb.EndText();
    
            cb.AddTemplate(template, document.LeftMargin + len, pageSize.GetBottom(document.BottomMargin));
        }
    
        public override void OnCloseDocument(PdfWriter writer, Document document)
        {
            base.OnCloseDocument(writer, document);
    
            template.BeginText();
            template.SetFontAndSize(this.RunDateFont.BaseFont, this.RunDateFont.Size);
            template.SetTextMatrix(0, 0);
            template.ShowText("" + (writer.PageNumber - 1));
            template.EndText();
        }
    }
    
    0 讨论(0)
  • 2020-12-05 20:42

    Here is another approach, make templates on each page and then at onCloseDocument update those templates look at the code below I am using iTextSharp 7

     class PDFBackgroundHelper : PdfPageEventHelper
    {
    
        private PdfContentByte cb;
        private List<PdfTemplate> templates;
        //constructor
        public PDFBackgroundHelper()
        {
            this.templates = new List<PdfTemplate>();
        }
    
        public override void OnEndPage(PdfWriter writer, Document document)
        {
            base.OnEndPage(writer, document);
    
            cb = writer.DirectContentUnder;
            PdfTemplate templateM = cb.CreateTemplate(50, 50);
            templates.Add(templateM);
    
            int pageN = writer.CurrentPageNumber;
            String pageText = "Page " + pageN.ToString() +" of ";
            BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            float len = bf.GetWidthPoint(pageText, 10);
            cb.BeginText();
            cb.SetFontAndSize(bf, 10);
            cb.SetTextMatrix(document.LeftMargin, document.PageSize.GetBottom(document.BottomMargin));
            cb.ShowText(pageText);
            cb.EndText();
            cb.AddTemplate(templateM, document.LeftMargin + len, document.PageSize.GetBottom(document.BottomMargin));
        }
    
        public override void OnCloseDocument(PdfWriter writer, Document document)
        {
            base.OnCloseDocument(writer, document);
            BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            foreach (PdfTemplate item in templates)
            {
                item.BeginText();
                item.SetFontAndSize(bf, 10);
                item.SetTextMatrix(0, 0);
                item.ShowText("" + (writer.PageNumber));
                item.EndText();
            }
    
        } 
    
    0 讨论(0)
  • 2020-12-05 20:43

    If you just need a simple page number, then this does the job:

    public class PageHeaderFooter : PdfPageEventHelper
    {
        private readonly Font _pageNumberFont = new Font(Font.HELVETICA, 8f, Font.NORMAL, Color.BLACK);
    
        public override void OnEndPage(PdfWriter writer, Document document)
        {
            AddPageNumber(writer, document);
        }
    
        private void AddPageNumber(PdfWriter writer, Document document)
        {
            var text = writer.PageNumber.ToString();
    
            var numberTable = new PdfPTable(1);
            var numberCell = new BorderlessPdfPCell(new Phrase(text, _pageNumberFont)) {HorizontalAlignment = Element.ALIGN_RIGHT};
    
            numberTable.AddCell(numberCell);
            numberTable.TotalWidth = 50;
            numberTable.WriteSelectedRows(0, -1, document.Right - 80, document.Bottom + 20, writer.DirectContent);
        }
    }
    

    And you use it this way:

    var stream = new MemoryStream();
    var document = new Document(PageSize.A4, 20, 20, 30, 30);
    
    var pdfWriter = PdfWriter.GetInstance(document, stream);
    pdfWriter.PageEvent = new PageHeaderFooter();
    // rest of PDF generation
    
    0 讨论(0)
提交回复
热议问题