2

フッターに「ページ1/4」などを表示するiTextSharpを使用して生成されたPDFがあります。これはすべて正常に機能し、メソッドに追加されたページの総数でメソッドにPdfTemplate設定されたを使用して実装されます。OnEndPage()OnCloseDocument()

ドキュメントに1ページしかない場合は、これを削除したいと思います。私は自分の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 に答える