Как добавить номер страницы в заголовок PDF-файла с помощью iText7 и C#

#c# #asp.net #itext7

#c# #asp.net #itext7

Вопрос:

Я не могу добавить номера страниц в header свой PDF-документ, используя iText7 и C# . …

это учебное пособие https://kb.itextpdf.com/home/it7kb/examples/page-numbers-and-pdf-a

ошибка возникает в этих строках, когда я добавляю в свой код эту часть после закрытия документа

     int n = pdfDoc.GetNumberOfPages();
    for (int i = 1; i <= n; i  )
    {
        doc.ShowTextAligned(new Paragraph(String
            .Format("page "   i   " of "   n))
            .SetFontSize(8)
            .SetMarginLeft(20),
           559, 806, i, TextAlignment.RIGHT,
           VerticalAlignment.MIDDLE, 0);
    }
 

Я не знаю почему, но это происходит, когда я вставляю новую страницу в PDF-документ

  document.Add(new AreaBreak());
 

Как решить эту проблему?

Мой код выглядит следующим образом.

 private class TableHeaderEventHandler : IEventHandler
{
    private Table table;
    private float tableHeight;
    private Document doc;

    public TableHeaderEventHandler(Document doc)
    {
        this.doc = doc;
        InitTable();

        TableRenderer renderer = (TableRenderer)table.CreateRendererSubTree();
        renderer.SetParent(new DocumentRenderer(doc));

        LayoutResult result = renderer.Layout(new LayoutContext(new LayoutArea(0, PageSize.A4)));
        tableHeight = result.GetOccupiedArea().GetBBox().GetHeight();
    }

    public void HandleEvent(Event currentEvent)
    {
        PdfDocumentEvent docEvent = (PdfDocumentEvent)currentEvent;
        PdfDocument pdfDoc = docEvent.GetDocument();
        PdfPage page = docEvent.GetPage();

        int pageNum = docEvent.GetDocument().GetPageNumber(page);

        PdfCanvas canvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc);
        PageSize pageSize = pdfDoc.GetDefaultPageSize();
        float coordX = pageSize.GetX()   doc.GetLeftMargin();
        float coordY = pageSize.GetTop() - doc.GetTopMargin();
        float width = pageSize.GetWidth() - doc.GetRightMargin() - doc.GetLeftMargin();
        float height = GetTableHeight();
        Rectangle rect = new Rectangle(coordX, coordY, width, height);

        new Canvas(canvas, rect)
            .Add(table)
            .Close();

        int n = pdfDoc.GetNumberOfPages();
        for (int i = 1; i <= n; i  )
        {
            doc.ShowTextAligned(new Paragraph(String
               .Format("page "   i   " of "   n))
                .SetFontSize(8)
                .SetMarginLeft(20),
               559, 806, i, TextAlignment.RIGHT,
               VerticalAlignment.MIDDLE, 0);
        }
    }

    public float GetTableHeight()
    {
        return tableHeight;
    }

    private void InitTable()
    {
        Paragraph newline = new Paragraph(new Text("n"));

        table = new Table(1).UseAllAvailableWidth();

        Image img = new Image(ImageDataFactory
        .Create(@"C:\Users\admin\source\repos\newpdf2\newpdf2\img\logo.png"))
        .SetTextAlignment(TextAlignment.CENTER);

        img.ScaleToFit(150, 150);
        table.AddCell(img).SetBorder(Border.NO_BORDER);
    }
}
 

Комментарии:

1. Что именно происходит? Вы говорите, что возникает ошибка. Какая ошибка? С помощью какой трассировки стека? И как вы регистрируете свой TableHeaderEventHandler ?

2. @mkl спасибо за ответ, решаемый с помощью iText KB