C# 我能';请不要将某物插入为“;第X页,共Y页“;使用iTextSharp进入我的PDF页脚

C# 我能';请不要将某物插入为“;第X页,共Y页“;使用iTextSharp进入我的PDF页脚,c#,pdf,pdf-generation,itextsharp,itext,C#,Pdf,Pdf Generation,Itextsharp,Itext,我对iTextSharp非常陌生,我有以下情况:我正在创建一个包含页眉和页脚的PDF(对于页眉和页脚的创建,我使用了一个扩展了PdfPageEventHelper的类,我已经覆盖了OnStartPage()和OnEndPage()方法,效果很好) 现在我的问题是,我必须以第X页(共Y页)的形式插入页脚。其中,X**是**当前页码,Y是总页码。Y的值不是固定的(因为我的PDF的长度事先不知道,因为它取决于内容的长度,并且不同的PDF可能不同)。我如何处理这种情况?(在每个页脚中插入正确的Y值?)

我对iTextSharp非常陌生,我有以下情况:我正在创建一个包含页眉和页脚的PDF(对于页眉和页脚的创建,我使用了一个扩展了PdfPageEventHelper的类,我已经覆盖了OnStartPage()OnEndPage()方法,效果很好)

现在我的问题是,我必须以第X页(共Y页)的形式插入页脚。其中,X**是**当前页码Y总页码。Y的值不是固定的(因为我的PDF的长度事先不知道,因为它取决于内容的长度,并且不同的PDF可能不同)。我如何处理这种情况?(在每个页脚中插入正确的Y值?)

在线搜索我找到了本教程(这是针对JavaiText的,但可能与iTextSharp版本没有太大区别):

在本例中,它创建一个PDF,其标题包含类似于第X页(共Y页)的内容

我试图理解这个例子(并将其翻译成iTextSharp),但我对它的工作原理有一些怀疑(以及它是否是我问题的真正解决方案)

据我所知,它可以执行以下操作:

在扩展了PdfPageEventHelper的类中,它被声明为PdfTemplate对象

PdfTemplate total;
我认为它可能会处理我的PDF文档中的总页数,但阅读官方文档时,我没有太多关于这门课具体做什么的信息:

我试图在我的类中做一些类似的事情,扩展PdfPageEventHelper,但我做不到

这是我的非工作代码:

public class PdfHeaderFooter : PdfPageEventHelper
{

    // The template with the total number of pages:
    PdfTemplate total;

    private static int numPagina = 1;

    public Image CellImage;
    private string folderImages;
    private string _sourceId;


    public PdfHeaderFooter(string _folderImages, string sourceId)
    {
        folderImages = _folderImages;
        _sourceId = sourceId;

    }


    /* Creates the PdfTemplate that will hold the total number of pages.
     * Write on top of document
     * */
    public override void OnOpenDocument(PdfWriter writer, Document document)
    {

        base.OnOpenDocument(writer, document);

        // (Nobili) Page Number:
        total = writer.DirectContent.CreateTemplate(30, 16);

        //PdfPTable tabFot = new PdfPTable(new float[] { 1F });
        PdfPTable tabFot = new PdfPTable(2);
        tabFot.WidthPercentage = 98;
        tabFot.SpacingAfter = 10F;
        PdfPCell cell;
        //tabFot.TotalWidth = 300F;
        cell = new PdfPCell(new Phrase("Header"));
        tabFot.AddCell(cell);
        tabFot.WriteSelectedRows(0, -1, 150, document.Top, writer.DirectContent);
    }


    // write on end of each page
    public override void OnEndPage(PdfWriter writer, Document document)
    {
        base.OnEndPage(writer, document);

        int pageN = writer.PageNumber;
        String text = "Page " + pageN + " of ";

        //PdfPTable tabFoot = new PdfPTable(new float[] { 1F });
        PdfPTable tabFoot = new PdfPTable(3);
        tabFoot.TotalWidth = document.Right - document.Left;

        tabFoot.DefaultCell.Border = PdfPCell.NO_BORDER;
        tabFoot.DefaultCell.CellEvent = new RoundedBorder();

        PdfPTable innerTable = new PdfPTable(2);
        innerTable.SetWidths(new int[] { 247, 246 });
        innerTable.TotalWidth = document.Right - document.Left;
        innerTable.DefaultCell.Border = PdfPCell.NO_BORDER;
        PdfPCell innerCellLeft = new PdfPCell(new Phrase("Early Warning - Bollettino")) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 20, HorizontalAlignment = Element.ALIGN_LEFT };
        //PdfPCell innerCellRight = new PdfPCell(new Phrase("Pag. " + numPagina + "/5")) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 20, HorizontalAlignment = Element.ALIGN_RIGHT };
        PdfPCell innerCellCenter = new PdfPCell(new Phrase(text)) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 20, HorizontalAlignment = Element.ALIGN_RIGHT };
        PdfPCell innerCellRight = new PdfPCell(Image.GetInstance(total)) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 20, HorizontalAlignment = Element.ALIGN_RIGHT };

        innerTable.AddCell(innerCellLeft);
        innerTable.AddCell(innerCellRight);

        tabFoot.AddCell(innerTable);

        tabFoot.WriteSelectedRows(0, -1, document.Left, document.Bottom, writer.DirectContent);

        numPagina++;
    }


    // write on start of each page
    public override void OnStartPage(PdfWriter writer, Document document)
    {
        base.OnStartPage(writer, document);
        PdfPTable tabHead = new PdfPTable(3);
        tabHead.SetWidths(new int[] { 165, 205, 125 });

        //tabHead.TotalWidth = 460F;
        tabHead.TotalWidth = document.Right - document.Left;        // TotalWidth = 495
        tabHead.WidthPercentage = 98;


        PdfPCell cell1 = new PdfPCell(iTextSharp.text.Image.GetInstance(folderImages + "logoEarlyWarning.png"), true) { Border = PdfPCell.BOTTOM_BORDER };
        tabHead.AddCell(cell1);
        //tabHead.AddCell(new PdfPCell(new Phrase("CELL 1:")) { Border = PdfPCell.BOTTOM_BORDER, Padding = 5, MinimumHeight = 50, PaddingTop = 15, });

        tabHead.AddCell(new PdfPCell(new Phrase("CELL 2:")) { Border = PdfPCell.BOTTOM_BORDER, Padding = 5, MinimumHeight = 50, PaddingTop = 15 });

        if(_sourceId == "NVD")
        {
            iTextSharp.text.Image logo = iTextSharp.text.Image.GetInstance(folderImages + "nvdLogo.png");
            logo.ScalePercent(48f);
            //PdfPCell cell3 = new PdfPCell(iTextSharp.text.Image.GetInstance(folderImages + "nvdLogo.png"), true) { Border = PdfPCell.BOTTOM_BORDER, PaddingBottom = 25 };
            PdfPCell cell3 = new PdfPCell(logo) { Border = PdfPCell.BOTTOM_BORDER, PaddingLeft = 50 };
            tabHead.AddCell(cell3);
        }
        else if(_sourceId == "DeepSight")
        {
            PdfPCell cell3 = new PdfPCell(iTextSharp.text.Image.GetInstance(folderImages + "DSLogo.jpg"), true) { Border = PdfPCell.BOTTOM_BORDER };
            tabHead.AddCell(cell3);
        }
        //tabHead.AddCell(new PdfPCell(new Phrase("CELL 3:")) { Border = PdfPCell.BOTTOM_BORDER, Padding = 5, MinimumHeight = 50, PaddingTop = 15 });


        tabHead.WriteSelectedRows(0, -1, document.Left, document.Top, writer.DirectContent);
    }



    //write on close of document
    public override void OnCloseDocument(PdfWriter writer, Document document)
    {
        base.OnCloseDocument(writer, document);
    }



}
}

我想在页脚中添加一些类似于教程中所示的第X页(共Y页)

我试着做以下事情:

1) 我宣布了PdfTemplate总数对象作为类的字段,并将其初始化为OnOpenDocument()方法

 total = writer.DirectContent.CreateTemplate(30, 16);
2) 在我的onedpage()方法中,我放入:

String text = "Page " + pageN + " of ";
我创建了下表,以显示第X页(共Y页)

PdfPCell innerCellLeft = new PdfPCell(new Phrase("Early Warning - Bollettino")) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 20, HorizontalAlignment = Element.ALIGN_LEFT };
PdfPCell innerCellCenter = new PdfPCell(new Phrase(text)) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 20, HorizontalAlignment = Element.ALIGN_RIGHT };
            PdfPCell innerCellRight = new PdfPCell(Image.GetInstance(total)) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 20, HorizontalAlignment = Element.ALIGN_RIGHT };
但它不起作用,给我一个例外


我的代码可能有什么问题?

您在复制/粘贴代码时没有阅读示例附带的文档。此外,你完全忽略了我书中例子的C版本。我花了很多钱给一个C#开发者来移植这些例子。感觉好像那笔钱被扔掉了。您可以在此处找到您尝试移植自己的示例:

错误#1:您正在
OnStartPage()
方法中添加内容。那是禁止的!这在许多地方都有记录。例如,参见官方文件第150页的副本:

FAQ为什么不建议在
onStartPage()方法中添加内容?从第5.2.4节中您会记得,当当前页面为空时,iText会忽略
newPage()
调用。当您从代码显式调用此方法时,会执行或忽略此方法,但在多种情况下也会从iText中隐式调用此方法。重要的是,它被忽略的空白页;否则,您将得到大量不需要的新页面,而这些页面无意中被留白。如果在
onStartPage()
方法中添加内容,则始终存在生成不需要的页面的风险。更安全的做法是保留<代码> OnEndPGE()/<代码>添加内容的方法。

错误#2:您正在
OnOpenDocument()
方法中添加内容。这有什么意义

错误#3:创建
total
对象是因为要创建可添加到每个页面的占位符。一旦你知道了总页数,你就要在那个占位符上填写这个数字。然而,我看你在任何地方都没有这样做。执行此操作的适当位置显然是在
OnCloseDocument()中。此事件在文档关闭之前触发,因此此时,总页数是已知的。正如福尔摩斯所说,这是最基本的,亲爱的

或者直接去。可能是重复的