2

我有一个使用 iTextSharp 生成的 PDF,它在页脚中显示“第 1/4 页”等内容。这一切都很好,并使用在方法PdfTemplate中设置的 a 以及在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);
        }
4

2 回答 2

4

我最终采用的解决方案是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++;
                }
            }
        }
    }
于 2013-05-15T01:07:17.853 回答
1

您已经在方法中将文本写入内容流,并且在事后onEndPage()无法删除它,因为该流可能已经发送到.OutputStream

如果文档只有一页,避免在文档上出现任何页码的最佳方法是再次添加页码。看一下TwoPasses的例子,尤其是它上面写着“第二次通过”的地方。IMO,这是解决您的问题的最优雅的方法。询问reader页数。如果是 1,什么也不做。如果更多,请添加Y 页 X

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

于 2013-05-13T06:09:24.717 回答