繁体   English   中英

使用 iText7 和 ASP.NET C# 在 PDF 文件的页脚添加页码

[英]Add a page number in the footer of a PDF file using iText7 and ASP.NET C#

我可以使用 iText7 和 C# ASP.NET 创建 pdf 文件

这个 pdf 文件总共包含 9 页。

我试图在我的代码中添加总页数和虚线

但是我有两个问题

  1. 页数(1 of 9、2 of 9、3 of 9...)仅显示在 PDF 文件的第 8 页和第 9 页中
  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()
    {

    }
}

在关闭文档之前将页脚绘图事件处理程序添加到文档:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM