Вопрос по – Как добавить номер страницы в нижний колонтитул в PDF от Itextsharp

9

Я использую iTextSharp DLL в коде ASP.NET. Я загружаю данные в набор данных и добавляю набор данных в таблицу PDF.

Если в моем наборе данных будет более 100 строк, то в таблицу PDF будут добавлены 100 строк, а в файле PDF будет создана страница 3-4.

Как я могу добавить нижний колонтитул на каждой странице?

Дубликатstackoverflow.com/questions/1032614/… Chris Gessler

Ваш Ответ

3   ответа
0

чтобы добавить номер страницы к динамически генерируемым страницам 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();
    }
}
0

создайте шаблоны на каждой странице, а затем при обновлении 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();
        }

    } 
18

ть методы, показанные во фрагменте кода ниже:

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();
        }
    }
@bleeeah Вы можете прокомментировать, почему вы вычли один из PageNumber? Раньше я делал это, и недавно он начал давать неправильные результаты. Была ли ошибка в iTextSharp, которая была исправлена в более новых версиях?
Я знаю, что вопрос действительно старый, и вопрос Бетти Кроккер тоже старый. Но я столкнулся с этим на каком-то более старом коде, который поддерживал, и я полагаю, что для тех, кто все еще использует версию 5, было изменение между 5.5.7 и 5.5.8 в методе Close () PdfDocument, который удалил дополнительный вызов NewPage () (который увеличивает количество страниц). С одним вызовом NewPage () меньше вам больше не нужно вычитать 1 из PageNumber - если вы делаете что-то в OnCloseDocument, конечно. Я полагаю, что версия 7 делает все это совершенно по-другому.
если вы не видите номер страницы, не забудьте установить свой document.bottomMargin или даже добавить (плавать) 50 к нему
this.RunDateFont не является частью iText, а является переменной шрифта, определенной во внешнем классе.
Я думаю, это больше не работает? this.RunDateFont не существует.

Похожие вопросы