【问题标题】:How to Add Page number in Footer in PDF by Itextsharp如何通过 Itextsharp 在 PDF 的页脚中添加页码
【发布时间】:2012-05-17 22:28:23
【问题描述】:

我在 ASP.NET 代码中使用 iTextSharp DLL。我正在将数据提取到数据集中并将数据集添加到 PDF 表中。

如果我的数据集有超过 100 行,则将 100 行添加到 PDF 表中,并在 PDF 文件中创建 3 或 4 页。

如何在每个页面中添加页脚?

【问题讨论】:

标签: itextsharp itext


【解决方案1】:

如果您只需要一个简单的页码,那么就可以了:

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);
    }
}

你这样使用它:

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

【讨论】:

    【解决方案2】:

    这是另一种方法,在每个页面上制作模板,然后在 onCloseDocument 更新这些模板,看看下面的代码我正在使用 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();
            }
    
        } 
    

    【讨论】:

      【解决方案3】:

      您必须继承pageeventhepler才能将页码添加到动态生成的pdf页面。

      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();
          }
      }
      

      【讨论】:

        【解决方案4】:

        你需要从 PdfPageEventHelper 类继承并覆盖下面代码 sn-p 中显示的方法:

        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();
                }
            }
        

        【讨论】:

        • 如果你没有看到页码,别忘了设置你的document.bottomMargin,甚至在里面加上(float)50
        • 我猜这不再起作用了? this.RunDateFont 不存在。
        • this.RunDateFont 不是 iText 的一部分,而是在外部类中定义的字体变量。
        • @bleeeah 你能评论一下为什么你从 PageNumber 中减去一个吗?我曾经这样做过,最近它开始给出不正确的结果,iTextSharp 中是否存在已在较新版本中修复的错误?
        • 我知道这个问题已经很老了,Betty Crokker 的后续问题也很老了。但是我在维护的一些旧代码上遇到了这个问题,我相信,对于那些仍在使用版本 5 的人,PdfDocument 的 Close() 方法在 5.5.7 和 5.5.8 之间发生了变化,这消除了对NewPage() (增加页数)。减少一次 NewPage() 调用,您不再需要从 PageNumber 中减去 1 - 当然,如果在 OnCloseDocument 中做某事。我收集版本 7 完全不同。
        猜你喜欢
        • 2020-07-23
        • 2018-05-25
        • 2013-09-30
        • 1970-01-01
        • 1970-01-01
        • 2015-05-14
        • 2016-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多