iTextSharp - 如果只有一页,则不显示页码

时间:2013-05-13 00:30:55

标签: itextsharp

我有一个使用iTextSharp生成的PDF,在页脚中显示“Page 1/4”等内容。这一切都运行正常,并使用PdfTemplate方法中设置的OnEndPage()OnCloseDocument()方法中添加的总页数来实现。

如果文档中只有一页,我想要删除它。我在我的OnCloseDocument()方法中尝试了这个,但实际上并没有删除模板:

        public override void OnCloseDocument(PdfWriter writer, Document document)
        {
            base.OnCloseDocument(writer, document);

            if (writer.PageNumber >= 3)
            {
                template.BeginText();
                template.SetFontAndSize(f_cn, CocService.footerFont.Size);
                template.SetTextMatrix(0, 0);
                template.ShowText("" + (writer.PageNumber - 1));
                template.EndText();
            }
            else
            {
                template.Reset();
            }
        }

仅供参考,以下是OnEndPage()方法的相关代码:

        public override void OnEndPage(PdfWriter writer, Document document)
        {
            base.OnEndPage(writer, document);

            int pageN = writer.PageNumber;
            String text = "Page " + pageN.ToString() + "/";

            float len = f_cn.GetWidthPoint(text, CocService.footerFont.Size);
            iTextSharp.text.Rectangle pageSize = document.PageSize;
            cb.SetRGBColorFill(100, 100, 100);
            cb.BeginText();
            cb.SetFontAndSize(f_cn, CocService.footerFont.Size);
            cb.SetTextMatrix(document.LeftMargin+520, pageSize.GetBottom(document.BottomMargin)+33);
            cb.ShowText(text);
            cb.EndText();
            cb.AddTemplate(template, document.LeftMargin + 520 + len, pageSize.GetBottom(document.BottomMargin)+33);
        }

2 个答案:

答案 0 :(得分:3)

我最终选择的解决方案是在每个页面中添加一个单独的PdfTemplate对象,然后在OnCloseDocument()方法中设置所有页码(或将它们全部删除)。我觉得这也很优雅。这是基本代码:

    // Inner class for dealing with the page numbering
    class CocPdfEventHelper : PdfPageEventHelper
    {
        List<PdfTemplate> pageNumberTemplates = new List<PdfTemplate>();

        public override void OnEndPage(PdfWriter writer, Document document)
        {
            base.OnEndPage(writer, document);

            // Add a unique (empty) template for each page here
            PdfTemplate t = writer.DirectContent.CreateTemplate(180, 50);
            pageNumberTemplates.Add(t);
            writer.DirectContent.AddTemplate(t, document.LeftMargin + 520, document.PageSize.GetBottom(document.BottomMargin) + 33);
        }

        public override void OnCloseDocument(PdfWriter writer, Document document)
        {
            base.OnCloseDocument(writer, document);

            // Only bother if there is more than 1 page
            if (writer.PageNumber >= 3)
            {
                int count = 1;
                foreach (PdfTemplate template in pageNumberTemplates)
                {
                    template.BeginText();
                    template.SetFontAndSize(f_cn, CocService.footerFont.Size);
                    template.SetRGBColorFill(100, 100, 100);
                    template.SetTextMatrix(0,0);
                    template.ShowText("Page " + count + " of " + (writer.PageNumber - 1));
                    template.EndText();
                    count++;
                }
            }
        }
    }

答案 1 :(得分:1)

您已经在onEndPage()方法中将文字写入内容流,并且无法在事实之后删除该,因为该流可能已经发送到{{ 1}}。

如果只有一个页面,避免在文档上显示任何页码的最佳方法是在一秒钟内添加页码。看一下TwoPasses示例,尤其是“SECOND PASS”。 IMO,这是解决您问题的最优雅方式。询问OutputStream页数。如果是1,则什么也不做。如果更多,请添加 Y的页面

顺便说一句:对于示例的C#端口,请转到http://tinyurl.com/itextsharpIIA2C06