15

ASP.NETコードでiTextSharpDLLを使用しています。データセットにデータをフェッチし、データセットをPDFテーブルに追加しています。

データセットに100行以上ある場合、100行がPDFテーブルに追加され、3ページまたは4ページがPDFファイルに作成されます。

各ページにフッターを追加するにはどうすればよいですか?

4

4 に答える 4

22

PdfPageEventHelperクラスから継承し、以下のコードスニペットに示されているメソッドをオーバーライドする必要があります。

Document doc = new Document(PageSize.A4.Rotate());        

using (MemoryStream ms = new MemoryStream())
{
  PdfWriter writer = PdfWriter.GetInstance(doc, ms);
  PageEventHelper pageEventHelper = new PageEventHelper();
  writer.PageEvent = pageEventHelper;
}

 public class PageEventHelper : PdfPageEventHelper
    {
        PdfContentByte cb;
        PdfTemplate template;


        public override void OnOpenDocument(PdfWriter writer, Document document)
        {
            cb = writer.DirectContent;
            template = cb.CreateTemplate(50, 50);
        }

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

            int pageN = writer.PageNumber;
            String text = "Page " + pageN.ToString() + " of ";
            float len = this.RunDateFont.BaseFont.GetWidthPoint(text, this.RunDateFont.Size);

            iTextSharp.text.Rectangle pageSize = document.PageSize;

            cb.SetRGBColorFill(100, 100, 100);

            cb.BeginText();
            cb.SetFontAndSize(this.RunDateFont.BaseFont, this.RunDateFont.Size);
            cb.SetTextMatrix(document.LeftMargin, pageSize.GetBottom(document.BottomMargin));
            cb.ShowText(text);

            cb.EndText();

            cb.AddTemplate(template, document.LeftMargin + len, pageSize.GetBottom(document.BottomMargin));
        }

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

            template.BeginText();
            template.SetFontAndSize(this.RunDateFont.BaseFont, this.RunDateFont.Size);
            template.SetTextMatrix(0, 0);
            template.ShowText("" + (writer.PageNumber - 1));
            template.EndText();
        }
    }
于 2012-05-10T10:54:21.313 に答える
1

動的に生成された PDF ページにページ番号を追加するには、pageeventhepler を継承する必要があります。

public void printPdf()
{
    Document doc = new Document(PageSize.A4.Rotate());
    using (MemoryStream ms = new MemoryStream())
    {
        PdfWriter writer = PdfWriter.GetInstance(doc, ms);
        PageEventHelper pageEventHelper = new PageEventHelper();
        writer.PageEvent = pageEventHelper;
    }
}

public class PageEventHelper : PdfPageEventHelper
{
    PdfContentByte cb;
    PdfTemplate template;


    public override void OnOpenDocument(PdfWriter writer, Document document)
    {
        cb = writer.DirectContent;
        template = cb.CreateTemplate(50, 50);
    }

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

        int pageN = writer.PageNumber;
        String text = "Page " + pageN.ToString() + " of ";
        float len = this.RunDateFont.BaseFont.GetWidthPoint(text, this.RunDateFont.Size);

        iTextSharp.text.Rectangle pageSize = document.PageSize;

        cb.SetRGBColorFill(100, 100, 100);

        cb.BeginText();
        cb.SetFontAndSize(this.RunDateFont.BaseFont, this.RunDateFont.Size);
        cb.SetTextMatrix(document.LeftMargin, pageSize.GetBottom(document.BottomMargin));
        cb.ShowText(text);

        cb.EndText();

        cb.AddTemplate(template, document.LeftMargin + len, pageSize.GetBottom(document.BottomMargin));
    }

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

        template.BeginText();
        template.SetFontAndSize(this.RunDateFont.BaseFont, this.RunDateFont.Size);
        template.SetTextMatrix(0, 0);
        template.ShowText("" + (writer.PageNumber - 1));
        template.EndText();
    }
}
于 2014-09-01T05:03:27.780 に答える
0

単純なページ番号だけが必要な場合は、次のようにします。

public class PageHeaderFooter : PdfPageEventHelper
{
    private readonly Font _pageNumberFont = new Font(Font.HELVETICA, 8f, Font.NORMAL, Color.BLACK);

    public override void OnEndPage(PdfWriter writer, Document document)
    {
        AddPageNumber(writer, document);
    }

    private void AddPageNumber(PdfWriter writer, Document document)
    {
        var text = writer.PageNumber.ToString();

        var numberTable = new PdfPTable(1);
        var numberCell = new BorderlessPdfPCell(new Phrase(text, _pageNumberFont)) {HorizontalAlignment = Element.ALIGN_RIGHT};

        numberTable.AddCell(numberCell);
        numberTable.TotalWidth = 50;
        numberTable.WriteSelectedRows(0, -1, document.Right - 80, document.Bottom + 20, writer.DirectContent);
    }
}

そして、あなたはそれをこのように使います:

var stream = new MemoryStream();
var document = new Document(PageSize.A4, 20, 20, 30, 30);

var pdfWriter = PdfWriter.GetInstance(document, stream);
pdfWriter.PageEvent = new PageHeaderFooter();
// rest of PDF generation
于 2019-09-02T13:02:59.803 に答える