我不能插入一些“页X”的内容.到我的PDF页脚使用iTextSharp

本文关键字:我的 PDF iTextSharp 插入 不能 | 更新日期: 2023-09-27 18:06:48

我在iTextSharp很新的,我有以下情况:我正在创建一个PDF,包含一个页眉和一个页脚(对于页眉和页脚的创建,我使用一个扩展PdfPageEventHelper的类,我已经覆盖了OnStartPage()OnEndPage()方法,它工作得很好)。

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

在线搜索我已经找到了这个教程(这是Java ittext ,但也许它不是那么不同于iTextSharp版本):http://itextpdf.com/examples/iia.php?id=104

在这个例子中,它创建了一个PDF,它的头包含类似于Page X of Y的内容。

我正试图理解这个例子(并将其翻译为iTextSharp),但我对它的工作方式有一些疑问(如果它是我问题的真正解决方案)。

根据我的理解,它执行以下操作:

在扩展PdfPageEventHelper的类中声明了一个PdfTemplate对象

PdfTemplate total;

我想也许它处理了我的PDF文档中的总页数,但是阅读官方文档我没有太多关于这个类究竟做什么的信息:http://api.itextpdf.com/itext/com/itextpdf/text/pdf/PdfTemplate.html

我试图做一些类似的东西到我的类扩展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);
    }

}

}

我想在页脚添加一些类似于Page X of Y的内容,如教程

中所示

我试着做下面的事情:

1)我声明了PdfTemplate total;对象作为我的类的字段,我初始化它到我的OnOpenDocument()方法

 total = writer.DirectContent.CreateTemplate(30, 16);
在我的OnEndPage()方法中,我放入:
String text = "Page " + pageN + " of ";
我创建了下面的表来显示Y 的页X
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 };

但是它不工作,抛出一个异常

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

我不能插入一些“页X”的内容.到我的PDF页脚使用iTextSharp

您没有阅读示例附带的文档就复制/粘贴代码。此外,您完全忽略了我书中示例的c#版本。我已经花了很多钱给一个c#开发人员来移植这些例子。感觉那笔钱好像被白白浪费了。您可以在这里找到您尝试移植自己的示例:http://tinyurl.com/itextsharpIIA2C05

错误#1:您正在添加OnStartPage()方法中的内容。这是禁止的!这在很多地方都有记载。请看下面这个从官方文档第150页抄来的答案:

FAQ 为什么不建议在 onStartPage() 方法中添加内容?您应该记得在5.2.4节中,当当前页面为空时,iText会忽略newPage()调用。当您从代码中显式调用该方法时,将执行(或忽略)该方法,但在多个场合也会从iText中隐式调用该方法。对于空白页,忽略它是很重要的;否则,您最终会得到大量不需要的新页面,这些页面会在无意中留下空白。如果您在onStartPage()方法中添加内容,那么总是有产生不需要的页面的风险。考虑为添加内容保留onEndPage()方法更安全。

错误#2:您正在添加OnOpenDocument()方法中的内容。为什么说得通呢?

错误#3:您创建total对象,因为您想要创建一个可以添加到每个页面的占位符。一旦知道了总页数,就需要在占位符上填写这个数字。然而,我没有看到你在任何地方这样做。这样做的适当的地方,显然是在OnCloseDocument()甚至。这个事件在文档关闭之前被触发,因此在那个时刻,总页数是已知的。正如歇洛克·福尔摩斯所说的那样,这是很初级的,亲爱的!