Добавьте номер страницы в нижний колонтитул PDF-файла с помощью iText7 и ASP.NET C #

Я могу создать файл pdf, используя iText7 и C # ASP.NET

Этот файл pdf содержит всего 9 страниц.

Я попытался добавить в свой код общее количество страниц и пунктирную линию

Но у меня две проблемы

  1. количество страниц (1 из 9, 2 из 9, 3 из 9 ...) отображается только на страницах номер 8 и номер 9 в файле PDF
  2. пунктирная линия не отображается на первой странице ...

Любая помощь будет очень признательна ... Спасибо.

Мой код ниже

private void mtpdfnew()
{
    DataTable dt = new DataTable();

    filename = @"C:\inetpub\wwwroot\public\pdf\" +
        DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";

    PdfWriter writer = new PdfWriter(filename);
    PdfDocument pdf = new PdfDocument(writer);
    Document document = new Document(pdf);

    using (MySqlConnection myConnectionString =
       new MySqlConnection(ConfigurationManager.ConnectionStrings["cn"].ConnectionString))
    {
        using (MySqlCommand cmd =
            new MySqlCommand("SP", myConnectionString))
        {
            cmd.Connection.Open();
            cmd.CommandType = CommandType.StoredProcedure;

            using (MySqlDataAdapter da =
                new MySqlDataAdapter(cmd))
            {
                da.Fill(dt);

                if (dt.Rows.Count > 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        contents = new Paragraph(dt.Rows[i]["contents"].ToString())
                            .SetTextAlignment(TextAlignment.JUSTIFIED)
                            .SetFontSize(12);

                        if (dt.Rows[i]["contents"].ToString().StartsWith("Set") && i != 0)
                        {
                            document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
                            document.Add(new LineSeparator(new DottedLine(1, 2)).SetMarginTop(4));
                        }

                        List<IElement> lst = HtmlConverter.ConvertToElements(dt.Rows[i]["contents"].ToString()).ToList();

                        for (int j = 0; j < lst.Count; j++)
                        {
                            IBlockElement element = (IBlockElement)lst[j];

                            if (dt.Rows[i]["contents"].ToString().StartsWith("Set"))
                            {
                                contents.SetFontSize(12)
                                    .SetBold()
                                    .SetFontColor(ColorConstants.BLUE);
                            }
                            else if (dt.Rows[i]["contents"].ToString().StartsWith("- "))
                            {
                                contents.SetFontSize(10)
                                    .SetBold()
                                    .SetFontColor(ColorConstants.BLACK);
                            }
                            else
                            {
                                contents.SetTextAlignment(TextAlignment.JUSTIFIED_ALL)
                                    .SetFontSize(10)
                                    .SetFontColor(ColorConstants.BLACK);

                            }

                            element.SetProperty(Property.LEADING, new Leading(Leading.MULTIPLIED, -1f));
                            document.Add(element);
                        }
                    }

                    Footer footerHandler = new Footer();
                    pdf.AddEventHandler(PdfDocumentEvent.END_PAGE, footerHandler);
                    footerHandler.WriteTotal(pdf);
                    dest = filename.ToString();
                    document.Close();
                }

                Response.Clear();
                Response.ContentType = "application/pdf";
                Response.AppendHeader("Content-Disposition", "attachment; filename=" + dest);
                Response.TransmitFile(dest);
                Response.End();
            }
        }
    }
}

private class TableFooterEventHandler : IEventHandler
{
    private Table table;

    public TableFooterEventHandler(Table table)
    {
        this.table = table;
    }

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

        int pageNumber = pdfDoc.GetPageNumber(page);
        Rectangle pageSize = page.GetPageSize();

        PdfCanvas canvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc);
        new Canvas(canvas, new Rectangle(36, 20, page.GetPageSize().GetWidth() - 72, 50))
            .Add(table)
            .Close();
    }
}

protected class Footer : IEventHandler
{
    protected PdfFormXObject placeholder;
    protected float side = 20;
    protected float x = 300;
    protected float y = 25;
    protected float space = 4.5f;
    protected float descent = 3;

    public Footer()
    {
        placeholder = new PdfFormXObject(new Rectangle(0, 0, side, side));
    }

    public virtual void HandleEvent(Event @event)
    {
        PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;
        PdfDocument pdf = docEvent.GetDocument();
        PdfPage page = docEvent.GetPage();
        int pageNumber = pdf.GetPageNumber(page);
        Rectangle pageSize = page.GetPageSize();

        PdfCanvas pdfCanvas = new PdfCanvas(page);
        Canvas canvas = new Canvas(pdfCanvas, pageSize);
        canvas.SetFontSize(10);

        Paragraph p = new Paragraph()
            .Add("Page ")
            .Add(pageNumber.ToString())
            .Add(" of");

        canvas.ShowTextAligned(p, x, y, TextAlignment.RIGHT);
        canvas.Close();

        pdfCanvas.AddXObjectAt(placeholder, x + space, y - descent);
        pdfCanvas.Release();
    }

    public void WriteTotal(PdfDocument pdfDoc)
    {
        Canvas canvas = new Canvas(placeholder, pdfDoc);
        canvas.SetFontSize(10);
        canvas.ShowTextAligned(pdfDoc.GetNumberOfPages().ToString(),
            0, descent, TextAlignment.LEFT);
        canvas.Close();
    }
}

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

    public float GetTableHeight()
    {
        return tableHeight;
    }

    private void InitTable()
    {

    }
}

person Edward Sheriff Curtis    schedule 19.03.2021    source источник


Ответы (1)


Вы добавляете обработчик события рисования нижнего колонтитула в документ непосредственно перед закрытием документа:

Footer footerHandler = new Footer();
pdf.AddEventHandler(PdfDocumentEvent.END_PAGE, footerHandler);
footerHandler.WriteTotal(pdf);
dest = filename.ToString();
document.Close();

К этому моменту почти все страницы уже завершены, а END_PAGE события для них были инициированы и обработаны, поэтому обработчик нижнего колонтитула их не получит. Только последняя и, возможно, предыдущая страница все еще должна быть завершена, поэтому для них будет вызван обработчик нижнего колонтитула.

Итак, чтобы обработчик нижнего колонтитула получал END_PAGE события для всех страниц, создайте и зарегистрируйте его заранее, сразу после создания документа pdf:

PdfWriter writer = new PdfWriter(filename);
PdfDocument pdf = new PdfDocument(writer);
Footer footerHandler = new Footer();
pdf.AddEventHandler(PdfDocumentEvent.END_PAGE, footerHandler);
Document document = new Document(pdf);

Записать итог, конечно, еще нужно в конце:

footerHandler.WriteTotal(pdf);
dest = filename.ToString();
document.Close();
person mkl    schedule 19.03.2021
comment
Большое спасибо за эту помощь ... - person Edward Sheriff Curtis; 19.03.2021