Add Header and Footer for PDF using iTextsharp

后端 未结 9 1473
情歌与酒
情歌与酒 2020-11-27 04:04

How can I add header and footer for each page in the pdf.

Headed will contain just a text Footer will contain a text and pagination for pdf (Page : 1 of 4)

H

相关标签:
9条回答
  • 2020-11-27 04:19

    The answers to this question, while they are correct, are very unnecessarily complicated. It doesn't take that much code for text to show up in the header/footer. Here is a simple example of adding text to the header/footer.

    The current version of iTextSharp works by implementing a callback class which is defined by the IPdfPageEvent interface. From what I understand, it's not a good idea to add things during the OnStartPage method, so instead I will be using the OnEndPage page method. The events are triggered depending on what is happening to the PdfWriter

    First, create a class which implements IPdfPageEvent. In the:

    public void OnEndPage(PdfWriter writer, Document document)
    

    function, obtain the PdfContentByte object by calling

    PdfContentByte cb = writer.DirectContent;
    

    Now you can add text very easily:

    ColumnText ct = new ColumnText(cb);
    
    cb.BeginText();
    cb.SetFontAndSize(BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 12.0f);
    //Note, (0,0) in this case is at the bottom of the document
    cb.SetTextMatrix(document.LeftMargin, document.BottomMargin); 
    cb.ShowText(String.Format("{0} {1}", "Testing Text", "Like this"));
    cb.EndText();
    

    So the full for the OnEndPage function will be:

    public void OnEndPage(PdfWriter writer, Document document)
    {
        PdfContentByte cb = writer.DirectContent;
        ColumnText ct = new ColumnText(cb);
    
        cb.BeginText();
        cb.SetFontAndSize(BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 12.0f);
        cb.SetTextMatrix(document.LeftMargin, document.BottomMargin);
        cb.ShowText(String.Format("{0} {1}", "Testing Text", "Like this"));
        cb.EndText();
    
    }
    

    This will show up at the bottom of your document. One last thing. Don't forget to assign the IPdfPageEvent like this:

    writter.PageEvent = new PDFEvents();
    

    To the PdfWriter writter object

    For the header it is very similar. Just flip the SetTextMatrix y coordinate:

    cb.SetTextMatrix(document.LeftMargin, document.PageSize.Height - document.TopMargin);
    
    0 讨论(0)
  • 2020-11-27 04:20

    This link will help you out completely(the Shortest and Most Elegant way):

    Header Footer with PageEvent

            PdfPTable tbheader = new PdfPTable(3);
            tbheader.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin;
            tbheader.DefaultCell.Border = 0;
            tbheader.AddCell(new Paragraph());
            tbheader.AddCell(new Paragraph());
            var _cell2 = new PdfPCell(new Paragraph("This is my header", arial_italic));
            _cell2.HorizontalAlignment = Element.ALIGN_RIGHT;
            _cell2.Border = 0;
            tbheader.AddCell(_cell2);
            float[] widths = new float[] { 20f, 20f, 60f };
            tbheader.SetWidths(widths);
            tbheader.WriteSelectedRows(0, -1, document.LeftMargin, writer.PageSize.GetTop(document.TopMargin), writer.DirectContent);
    
            PdfPTable tbfooter = new PdfPTable(3);
            tbfooter.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin;
            tbfooter.DefaultCell.Border = 0;
            tbfooter.AddCell(new Paragraph());
            tbfooter.AddCell(new Paragraph());
            var _cell2 = new PdfPCell(new Paragraph("This is my footer", arial_italic));
            _cell2.HorizontalAlignment = Element.ALIGN_RIGHT;
            _cell2.Border = 0;
            tbfooter.AddCell(_cell2);
            tbfooter.AddCell(new Paragraph());
            tbfooter.AddCell(new Paragraph());
            var _celly = new PdfPCell(new Paragraph(writer.PageNumber.ToString()));//For page no.
            _celly.HorizontalAlignment = Element.ALIGN_RIGHT;
            _celly.Border = 0;
            tbfooter.AddCell(_celly);
            float[] widths1 = new float[] { 20f, 20f, 60f };
            tbfooter.SetWidths(widths1);
            tbfooter.WriteSelectedRows(0, -1, document.LeftMargin, writer.PageSize.GetBottom(document.BottomMargin), writer.DirectContent);
    
    0 讨论(0)
  • 2020-11-27 04:22
    pdfDoc.Open();
    Paragraph para = new Paragraph("Hello World", new Font(Font.FontFamily.HELVETICA, 22));
    para.Alignment = Element.ALIGN_CENTER;
    pdfDoc.Add(para);
    pdfDoc.Add(new Paragraph("\r\n"));
    htmlparser.Parse(sr);
    pdfDoc.Close();
    
    0 讨论(0)
  • 2020-11-27 04:26

    We don't talk about iTextSharp anymore. You are using iText 5 for .NET. The current version is iText 7 for .NET.

    Obsolete answer:

    The AddHeader has been deprecated a long time ago and has been removed from iTextSharp. Adding headers and footers is now done using page events. The examples are in Java, but you can find the C# port of the examples here and here (scroll to the bottom of the page for links to the .cs files).

    Make sure you read the documentation. A common mistake by many developers have made before you, is adding content in the OnStartPage. You should only add content in the OnEndPage. It's also obvious that you need to add the content at absolute coordinates (for instance using ColumnText) and that you need to reserve sufficient space for the header and footer by defining the margins of your document correctly.

    Updated answer:

    If you are new to iText, you should use iText 7 and use event handlers to add headers and footers. See chapter 3 of the iText 7 Jump-Start Tutorial for .NET.

    When you have a PdfDocument in iText 7, you can add an event handler:

    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    pdf.addEventHandler(PdfDocumentEvent.END_PAGE, new MyEventHandler());
    

    This is an example of the hard way to add text at an absolute position (using PdfCanvas):

    protected internal class MyEventHandler : IEventHandler {
        public virtual void HandleEvent(Event @event) {
            PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;
            PdfDocument pdfDoc = docEvent.GetDocument();
            PdfPage page = docEvent.GetPage();
            int pageNumber = pdfDoc.GetPageNumber(page);
            Rectangle pageSize = page.GetPageSize();
            PdfCanvas pdfCanvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc);
            //Add header
            pdfCanvas.BeginText()
                .SetFontAndSize(C03E03_UFO.helvetica, 9)
                .MoveText(pageSize.GetWidth() / 2 - 60, pageSize.GetTop() - 20)
                .ShowText("THE TRUTH IS OUT THERE")
                .MoveText(60, -pageSize.GetTop() + 30)
                .ShowText(pageNumber.ToString())
                .EndText();
            pdfCanvas.release();
        }
    }
    

    This is a slightly higher-level way, using Canvas:

    protected internal class MyEventHandler : IEventHandler {
        public virtual void HandleEvent(Event @event) {
            PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;
            PdfDocument pdfDoc = docEvent.GetDocument();
            PdfPage page = docEvent.GetPage();
            int pageNumber = pdfDoc.GetPageNumber(page);
            Rectangle pageSize = page.GetPageSize();
            PdfCanvas pdfCanvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc);
            //Add watermark
            Canvas canvas = new Canvas(pdfCanvas, pdfDoc, page.getPageSize());
            canvas.setFontColor(Color.WHITE);
            canvas.setProperty(Property.FONT_SIZE, 60);
            canvas.setProperty(Property.FONT, helveticaBold);
            canvas.showTextAligned(new Paragraph("CONFIDENTIAL"),
                298, 421, pdfDoc.getPageNumber(page),
                TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45);
            pdfCanvas.release();
        }
    }
    

    There are other ways to add content at absolute positions. They are described in the different iText books.

    0 讨论(0)
  • 2020-11-27 04:30

    As already answered by @Bruno you need to use pageEvents.

    Please check out the sample code below:

    private void CreatePDF()
    {
        string fileName = string.Empty;    
        DateTime fileCreationDatetime = DateTime.Now;    
        fileName = string.Format("{0}.pdf", fileCreationDatetime.ToString(@"yyyyMMdd") + "_" + fileCreationDatetime.ToString(@"HHmmss"));    
        string pdfPath = Server.MapPath(@"~\PDFs\") +   fileName;
    
        using (FileStream msReport = new FileStream(pdfPath, FileMode.Create))
        {
            //step 1
            using (Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 140f, 10f))
            {
                try
                {
                    // step 2
                    PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc, msReport);
                    pdfWriter.PageEvent = new Common.ITextEvents();
    
                    //open the stream 
                    pdfDoc.Open();
    
                    for (int i = 0; i < 10; i++)
                    {
                        Paragraph para = new Paragraph("Hello world. Checking Header Footer", new Font(Font.FontFamily.HELVETICA, 22));    
                        para.Alignment = Element.ALIGN_CENTER;    
                        pdfDoc.Add(para);    
                        pdfDoc.NewPage();
                    }
    
                    pdfDoc.Close();    
                }
                catch (Exception ex)
                {
                    //handle exception
                }    
                finally
                { 
                }    
            }    
        }
    }
    

    And create one class file named ITextEvents.cs and add following code:

    public class ITextEvents : PdfPageEventHelper
    {    
        // This is the contentbyte object of the writer
        PdfContentByte cb;
    
        // we will put the final number of pages in a template
        PdfTemplate headerTemplate, footerTemplate;
    
        // this is the BaseFont we are going to use for the header / footer
        BaseFont bf = null;
    
        // This keeps track of the creation time
        DateTime PrintTime = DateTime.Now;    
    
        #region Fields
        private string _header;
        #endregion
    
        #region Properties
        public string Header
        {
            get { return _header; }
            set { _header = value; }
        }
        #endregion    
    
        public override void OnOpenDocument(PdfWriter writer, Document document)
        {
            try
            {
                PrintTime = DateTime.Now;
                bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
                cb = writer.DirectContent;
                headerTemplate = cb.CreateTemplate(100, 100);
                footerTemplate = cb.CreateTemplate(50, 50);
            }
            catch (DocumentException de)
            {    
            }
            catch (System.IO.IOException ioe)
            {    
            }
        }
    
        public override void OnEndPage(iTextSharp.text.pdf.PdfWriter writer, iTextSharp.text.Document document)
        {
            base.OnEndPage(writer, document);    
            iTextSharp.text.Font baseFontNormal = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 12f, iTextSharp.text.Font.NORMAL, iTextSharp.text.BaseColor.BLACK);    
            iTextSharp.text.Font baseFontBig = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 12f, iTextSharp.text.Font.BOLD, iTextSharp.text.BaseColor.BLACK);    
            Phrase p1Header = new Phrase("Sample Header Here", baseFontNormal);
    
            //Create PdfTable object
            PdfPTable pdfTab = new PdfPTable(3);
    
            //We will have to create separate cells to include image logo and 2 separate strings
            //Row 1
            PdfPCell pdfCell1 = new PdfPCell();
            PdfPCell pdfCell2 = new PdfPCell(p1Header);
            PdfPCell pdfCell3 = new PdfPCell();
            String text = "Page " + writer.PageNumber + " of ";    
    
            //Add paging to header
            {
                cb.BeginText();
                cb.SetFontAndSize(bf, 12);
                cb.SetTextMatrix(document.PageSize.GetRight(200), document.PageSize.GetTop(45));
                cb.ShowText(text);
                cb.EndText();
                float len = bf.GetWidthPoint(text, 12);
                //Adds "12" in Page 1 of 12
                cb.AddTemplate(headerTemplate, document.PageSize.GetRight(200) + len, document.PageSize.GetTop(45));
            }
            //Add paging to footer
            {
                cb.BeginText();
                cb.SetFontAndSize(bf, 12);
                cb.SetTextMatrix(document.PageSize.GetRight(180), document.PageSize.GetBottom(30));
                cb.ShowText(text);
                cb.EndText();
                float len = bf.GetWidthPoint(text, 12);
                cb.AddTemplate(footerTemplate, document.PageSize.GetRight(180) + len, document.PageSize.GetBottom(30));
            }
    
            //Row 2
            PdfPCell pdfCell4 = new PdfPCell(new Phrase("Sub Header Description", baseFontNormal));
    
            //Row 3 
            PdfPCell pdfCell5 = new PdfPCell(new Phrase("Date:" + PrintTime.ToShortDateString(), baseFontBig));
            PdfPCell pdfCell6 = new PdfPCell();
            PdfPCell pdfCell7 = new PdfPCell(new Phrase("TIME:" + string.Format("{0:t}", DateTime.Now), baseFontBig));    
    
            //set the alignment of all three cells and set border to 0
            pdfCell1.HorizontalAlignment = Element.ALIGN_CENTER;
            pdfCell2.HorizontalAlignment = Element.ALIGN_CENTER;
            pdfCell3.HorizontalAlignment = Element.ALIGN_CENTER;
            pdfCell4.HorizontalAlignment = Element.ALIGN_CENTER;
            pdfCell5.HorizontalAlignment = Element.ALIGN_CENTER;
            pdfCell6.HorizontalAlignment = Element.ALIGN_CENTER;
            pdfCell7.HorizontalAlignment = Element.ALIGN_CENTER;    
    
            pdfCell2.VerticalAlignment = Element.ALIGN_BOTTOM;
            pdfCell3.VerticalAlignment = Element.ALIGN_MIDDLE;
            pdfCell4.VerticalAlignment = Element.ALIGN_TOP;
            pdfCell5.VerticalAlignment = Element.ALIGN_MIDDLE;
            pdfCell6.VerticalAlignment = Element.ALIGN_MIDDLE;
            pdfCell7.VerticalAlignment = Element.ALIGN_MIDDLE;    
    
            pdfCell4.Colspan = 3;  
    
            pdfCell1.Border = 0;
            pdfCell2.Border = 0;
            pdfCell3.Border = 0;
            pdfCell4.Border = 0;
            pdfCell5.Border = 0;
            pdfCell6.Border = 0;
            pdfCell7.Border = 0;    
    
            //add all three cells into PdfTable
            pdfTab.AddCell(pdfCell1);
            pdfTab.AddCell(pdfCell2);
            pdfTab.AddCell(pdfCell3);
            pdfTab.AddCell(pdfCell4);
            pdfTab.AddCell(pdfCell5);
            pdfTab.AddCell(pdfCell6);
            pdfTab.AddCell(pdfCell7);
    
            pdfTab.TotalWidth = document.PageSize.Width - 80f;
            pdfTab.WidthPercentage = 70;
            //pdfTab.HorizontalAlignment = Element.ALIGN_CENTER;    
    
            //call WriteSelectedRows of PdfTable. This writes rows from PdfWriter in PdfTable
            //first param is start row. -1 indicates there is no end row and all the rows to be included to write
            //Third and fourth param is x and y position to start writing
            pdfTab.WriteSelectedRows(0, -1, 40, document.PageSize.Height - 30, writer.DirectContent);
            //set pdfContent value
    
            //Move the pointer and draw line to separate header section from rest of page
            cb.MoveTo(40, document.PageSize.Height - 100);
            cb.LineTo(document.PageSize.Width - 40, document.PageSize.Height - 100);
            cb.Stroke();
    
            //Move the pointer and draw line to separate footer section from rest of page
            cb.MoveTo(40, document.PageSize.GetBottom(50) );
            cb.LineTo(document.PageSize.Width - 40, document.PageSize.GetBottom(50));
            cb.Stroke();
        }
    
        public override void OnCloseDocument(PdfWriter writer, Document document)
        {
            base.OnCloseDocument(writer, document);
    
            headerTemplate.BeginText();
            headerTemplate.SetFontAndSize(bf, 12);
            headerTemplate.SetTextMatrix(0, 0);
            headerTemplate.ShowText((writer.PageNumber - 1).ToString());
            headerTemplate.EndText();
    
            footerTemplate.BeginText();
            footerTemplate.SetFontAndSize(bf, 12);
            footerTemplate.SetTextMatrix(0, 0);
            footerTemplate.ShowText((writer.PageNumber - 1).ToString());
            footerTemplate.EndText();  
        }
    }
    

    I hope it helps!

    0 讨论(0)
  • 2020-11-27 04:30
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using iTextSharp;
    using iTextSharp.text;
    using iTextSharp.text.pdf;
    using DataLayer;
    
    namespace DataMngt.MyCode
    {
        public class HeaderFooter : PdfPageEventHelper
        {
            #region Startup_Stuff
    
            private string[] _headerLines;
            private string _footerLine;
    
            private DefineFont _boldFont;
            private DefineFont _normalFont;
    
            private iTextSharp.text.Font fontTxtBold;
            private iTextSharp.text.Font fontTxtRegular;
    
            private int _fontPointSize = 0;
    
            private bool hasFooter = false;
            private bool hasHeader = false;
    
            private int _headerWidth = 0;
            private int _headerHeight = 0;
    
            private int _footerWidth = 0;
            private int _footerHeight = 0;
    
            private int _leftMargin = 0;
            private int _rightMargin = 0;
            private int _topMargin = 0;
            private int _bottomMargin = 0;
    
            private PageNumbers NumberSettings;
    
            private DateTime runTime = DateTime.Now;             
    
            public enum PageNumbers
            {
                None,
                HeaderPlacement,
                FooterPlacement
            }
    
            // This is the contentbyte object of the writer
            PdfContentByte cb;
    
            PdfTemplate headerTemplate;
            PdfTemplate footerTemplate;
    
            public string[] headerLines
            {
                get
                {
                    return _headerLines;
                }
                set
                {
                    _headerLines = value;
                    hasHeader = true;
                }
            }
    
            public string footerLine
            {
                get
                {
                    return _footerLine;
                }
                set
                {
                    _footerLine = value;
                    hasFooter = true;
                }
            }
    
            public DefineFont boldFont
            {
                get
                {
                    return _boldFont;
                }
                set
                {
                    _boldFont = value;
                }
            }
    
            public DefineFont normalFont
            {
                get
                {
                    return _normalFont;
                }
                set
                {
                    _normalFont = value;
                }
            }
    
            public int fontPointSize
            {
                get
                {
                    return _fontPointSize;
                }
                set
                {
                    _fontPointSize = value;
                }
            }
    
            public int leftMargin
            {
                get
                {
                    return _leftMargin;
                }
                set
                {
                    _leftMargin = value;
                }
            }
    
            public int rightMargin
            {
                get
                {
                    return _rightMargin;
                }
                set
                {
                    _rightMargin = value;
                }
            }
    
            public int topMargin
            {
                get
                {
                    return _topMargin;
                }
                set
                {
                    _topMargin = value;
                }
            }
    
            public int bottomMargin
            {
                get
                {
                    return _bottomMargin;
                }
                set
                {
                    _bottomMargin = value;
                }
            }
    
            public int headerheight
            {
                get
                {
                    return _headerHeight;
                }
            }
    
            public int footerHeight
            {
                get
                {
                    return _footerHeight;
                }
            }
    
            public PageNumbers PageNumberSettings
            {
                get
                {
                    return NumberSettings;
                }
    
                set
                {
                    NumberSettings = value;
                }
            }
    
            #endregion
    
            #region Write_Headers_Footers
    
            public override void OnEndPage(PdfWriter writer, Document document)
            {
                if (hasHeader)
                {
                    // left side is the string array passed in
                    // right side is a built in string array (0 = date, 1 = time, 2(optional) = page)
                    float[] widths = new float[2] { 90f, 10f };
    
                    PdfPTable hdrTable = new PdfPTable(2);
                    hdrTable.TotalWidth = document.PageSize.Width - (_leftMargin + _rightMargin);
                    hdrTable.WidthPercentage = 95;
                    hdrTable.SetWidths(widths);
                    hdrTable.LockedWidth = true;
    
                    for (int hdrIdx = 0; hdrIdx < (_headerLines.Length < 2 ? 2 : _headerLines.Length); hdrIdx ++)
                    {
                        string leftLine = (hdrIdx < _headerLines.Length ? _headerLines[hdrIdx] : string.Empty);
    
                        Paragraph leftPara = new Paragraph(5, leftLine, (hdrIdx == 0 ? fontTxtBold : fontTxtRegular));
    
                        switch (hdrIdx)
                        {
                            case 0:
                                {
                                    leftPara.Font.Size = _fontPointSize;
    
                                    PdfPCell leftCell = new PdfPCell(leftPara);
                                    leftCell.HorizontalAlignment = Element.ALIGN_LEFT;
                                    leftCell.Border = 0;
    
                                    string rightLine = string.Format(SalesPlanResources.datePara, runTime.ToString(SalesPlanResources.datePrintMask));
                                    Paragraph rightPara = new Paragraph(5, rightLine, (hdrIdx == 0 ? fontTxtBold : fontTxtRegular));
                                    rightPara.Font.Size = _fontPointSize;
    
                                    PdfPCell rightCell = new PdfPCell(rightPara);
                                    rightCell.HorizontalAlignment = Element.ALIGN_LEFT;
                                    rightCell.Border = 0;
    
                                    hdrTable.AddCell(leftCell);
                                    hdrTable.AddCell(rightCell);
    
                                    break;
                                }
    
                            case 1:
                                {
                                    leftPara.Font.Size = _fontPointSize;
    
                                    PdfPCell leftCell = new PdfPCell(leftPara);
                                    leftCell.HorizontalAlignment = Element.ALIGN_LEFT;
                                    leftCell.Border = 0;
    
                                    string rightLine = string.Format(SalesPlanResources.timePara, runTime.ToString(SalesPlanResources.timePrintMask));
                                    Paragraph rightPara = new Paragraph(5, rightLine, (hdrIdx == 0 ? fontTxtBold : fontTxtRegular));
                                    rightPara.Font.Size = _fontPointSize;
    
                                    PdfPCell rightCell = new PdfPCell(rightPara);
                                    rightCell.HorizontalAlignment = Element.ALIGN_LEFT;
                                    rightCell.Border = 0;
    
                                    hdrTable.AddCell(leftCell);
                                    hdrTable.AddCell(rightCell);
    
                                    break;
                                }
    
                            case 2:
                                {
                                    leftPara.Font.Size = _fontPointSize;
    
                                    PdfPCell leftCell = new PdfPCell(leftPara);
                                    leftCell.HorizontalAlignment = Element.ALIGN_LEFT;
                                    leftCell.Border = 0;
    
                                    string rightLine;
                                    if (NumberSettings == PageNumbers.HeaderPlacement)
                                    {
                                        rightLine = string.Concat(SalesPlanResources.pagePara, writer.PageNumber.ToString());
                                    }
                                    else
                                    {
                                        rightLine = string.Empty; 
                                    }
                                    Paragraph rightPara = new Paragraph(5, rightLine, fontTxtRegular);
                                    rightPara.Font.Size = _fontPointSize;
    
                                    PdfPCell rightCell = new PdfPCell(rightPara);
                                    rightCell.HorizontalAlignment = Element.ALIGN_LEFT;
                                    rightCell.Border = 0;
    
                                    hdrTable.AddCell(leftCell);
                                    hdrTable.AddCell(rightCell);
    
                                    break;
                                }
    
                            default:
                                {
                                    leftPara.Font.Size = _fontPointSize;
    
                                    PdfPCell leftCell = new PdfPCell(leftPara);
                                    leftCell.HorizontalAlignment = Element.ALIGN_LEFT;
                                    leftCell.Border = 0;
                                    leftCell.Colspan = 2;                               
    
                                    hdrTable.AddCell(leftCell);
    
                                    break;
                                }
                        }
                    }
    
                    hdrTable.WriteSelectedRows(0, -1, _leftMargin, document.PageSize.Height - _topMargin, writer.DirectContent);
    
                    //Move the pointer and draw line to separate header section from rest of page
                    cb.MoveTo(_leftMargin, document.Top + 10);
                    cb.LineTo(document.PageSize.Width - _leftMargin, document.Top + 10);
                    cb.Stroke();
                }
    
                if (hasFooter)
                {
                    // footer line is the width of the page so it is centered horizontally 
                    PdfPTable ftrTable = new PdfPTable(1);
                    float[] widths = new float[1] {100 };
    
                    ftrTable.TotalWidth = document.PageSize.Width - 10;
                    ftrTable.WidthPercentage = 95;
                    ftrTable.SetWidths(widths);
    
                    string OneLine;
    
                    if (NumberSettings == PageNumbers.FooterPlacement)
                    {
                        OneLine = string.Concat(_footerLine, writer.PageNumber.ToString());
                    }
                    else
                    {
                        OneLine = _footerLine;
                    }
    
                    Paragraph onePara = new Paragraph(0, OneLine, fontTxtRegular);
                    onePara.Font.Size = _fontPointSize;
    
                    PdfPCell oneCell = new PdfPCell(onePara);
                    oneCell.HorizontalAlignment = Element.ALIGN_CENTER; 
                    oneCell.Border = 0;
                    ftrTable.AddCell(oneCell);
    
                    ftrTable.WriteSelectedRows(0, -1, _leftMargin, (_footerHeight), writer.DirectContent);
    
                    //Move the pointer and draw line to separate footer section from rest of page
                    cb.MoveTo(_leftMargin, document.PageSize.GetBottom(_footerHeight + 2));
                    cb.LineTo(document.PageSize.Width - _leftMargin, document.PageSize.GetBottom(_footerHeight + 2));
                    cb.Stroke();
                }
            }
    
            #endregion
    
    
            #region Setup_Headers_Footers_Happens_here
    
            public override void OnOpenDocument(PdfWriter writer, Document document)
            {
                // create the fonts that are to be used
                // first the hightlight or Bold font
                fontTxtBold = FontFactory.GetFont(_boldFont.fontFamily, _boldFont.fontSize, _boldFont.foreColor);
                if (_boldFont.isBold)
                {
                    fontTxtBold.SetStyle(Font.BOLD);
                }
                if (_boldFont.isItalic)
                {
                    fontTxtBold.SetStyle(Font.ITALIC);
                }
                if (_boldFont.isUnderlined)
                {
                    fontTxtBold.SetStyle(Font.UNDERLINE);
                }
    
                // next the normal font
                fontTxtRegular = FontFactory.GetFont(_normalFont.fontFamily, _normalFont.fontSize, _normalFont.foreColor);
                if (_normalFont.isBold)
                {
                    fontTxtRegular.SetStyle(Font.BOLD);
                }
                if (_normalFont.isItalic)
                {
                    fontTxtRegular.SetStyle(Font.ITALIC);
                }
                if (_normalFont.isUnderlined)
                {
                    fontTxtRegular.SetStyle(Font.UNDERLINE);
                }
    
                // now build the header and footer templates
                try
                {
                    float pageHeight = document.PageSize.Height;
                    float pageWidth = document.PageSize.Width;
    
                    _headerWidth = (int)pageWidth - ((int)_rightMargin + (int)_leftMargin);
                    _footerWidth = _headerWidth;
    
                    if (hasHeader)
                    {
                        // i basically dummy build the headers so i can trial fit them and see how much space they take.
                        float[] widths = new float[1] { 90f };
    
                        PdfPTable hdrTable = new PdfPTable(1);
                        hdrTable.TotalWidth = document.PageSize.Width - (_leftMargin + _rightMargin);
                        hdrTable.WidthPercentage = 95;
                        hdrTable.SetWidths(widths);
                        hdrTable.LockedWidth = true;
    
                        _headerHeight = 0;
    
                        for (int hdrIdx = 0; hdrIdx < (_headerLines.Length < 2 ? 2 : _headerLines.Length); hdrIdx++)
                        {
                            Paragraph hdrPara = new Paragraph(5, hdrIdx > _headerLines.Length - 1 ? string.Empty : _headerLines[hdrIdx], (hdrIdx > 0 ? fontTxtRegular : fontTxtBold));
                            PdfPCell hdrCell = new PdfPCell(hdrPara);
                            hdrCell.HorizontalAlignment = Element.ALIGN_LEFT;
                            hdrCell.Border = 0;
                            hdrTable.AddCell(hdrCell);
                            _headerHeight = _headerHeight + (int)hdrTable.GetRowHeight(hdrIdx);
                        }
    
                        // iTextSharp underestimates the size of each line so fudge it a little 
                        // this gives me 3 extra lines to play with on the spacing
                        _headerHeight = _headerHeight + (_fontPointSize * 3);
    
                    }
    
                    if (hasFooter)
                    {
                        _footerHeight = (_fontPointSize * 2);
                    }
    
                    document.SetMargins(_leftMargin, _rightMargin, (_topMargin + _headerHeight), _footerHeight);
    
                    cb = writer.DirectContent;
    
                    if (hasHeader)
                    {
                        headerTemplate = cb.CreateTemplate(_headerWidth, _headerHeight);
                    }
    
                    if (hasFooter)
                    {
                        footerTemplate = cb.CreateTemplate(_footerWidth, _footerHeight);
                    }
                }
                catch (DocumentException de)
                {
    
                }
                catch (System.IO.IOException ioe)
                {
    
                }
            }
    
            #endregion
    
            #region Cleanup_Doc_Processing
    
            public override void OnCloseDocument(PdfWriter writer, Document document)
            {
                base.OnCloseDocument(writer, document);
    
                if (hasHeader)
                {
                    headerTemplate.BeginText();
                    headerTemplate.SetTextMatrix(0, 0);
    
                    if (NumberSettings == PageNumbers.HeaderPlacement)
                    {
                    }
    
                    headerTemplate.EndText();
                }
    
                if (hasFooter)
                {
                    footerTemplate.BeginText();
                    footerTemplate.SetTextMatrix(0, 0);
    
                    if (NumberSettings == PageNumbers.FooterPlacement)
                    {
                    }
    
                    footerTemplate.EndText();
                }
            }
    
            #endregion
    
        }
    }
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using iTextSharp;
    using iTextSharp.text;
    using iTextSharp.text.pdf;
    
    namespace DataMngt.MyCode
    {
    
        // used to define the fonts passed into the header and footer class
        public struct DefineFont
        {
            public string fontFamily { get; set; }
            public int fontSize { get; set; }
            public bool isBold { get; set; }
            public bool isItalic { get; set; }
            public bool isUnderlined { get; set; }
            public BaseColor foreColor { get; set; }
        }
    }
    

    To Use:

     Document pdfDoc = new Document(PageSize.LEGAL.Rotate(), 10, 10, 25, 25);
     System.IO.MemoryStream mStream = new System.IO.MemoryStream();
     PdfWriter writer = PdfWriter.GetInstance(pdfDoc, mStream);
     MyCode.HeaderFooter headers = new MyCode.HeaderFooter();
     writer.PageEvent = headers;
    

    .. .. Build the string array for the headers ...

    DefineFont passFont = new DefineFont();
    
        // always set this to the largest font used
        headers.fontPointSize = 8;
    
        // set up the highlight or bold font
        passFont.fontFamily = "Helvetica";
        passFont.fontSize = 8;
        passFont.isBold = true;
        passFont.isItalic = false;
        passFont.isUnderlined = false;
        passFont.foreColor = BaseColor.BLACK;
    
        headers.boldFont = passFont;
    
        // now setup the normal text font
        passFont.fontSize = 7;
        passFont.isBold = false;
    
        headers.normalFont = passFont;
    
        headers.leftMargin = 10;
        headers.bottomMargin = 25;
        headers.rightMargin = 10;
        headers.topMargin = 25;
    
        headers.PageNumberSettings = HeaderFooter.PageNumbers.FooterPlacement;
    
        headers.footerLine = "Page";
        headers.headerLines = parmLines.ToArray();
    
        pdfDoc.SetMargins(headers.leftMargin, headers.rightMargin, headers.topMargin + headers.headerheight, headers.bottomMargin + headers.footerHeight);
        pdfDoc.Open();
    
        // the new page is necessary due to a bug in in the current version of itextsharp
        pdfDoc.NewPage();
    

    ... now your headers and footer will be handled automatically

    0 讨论(0)
提交回复
热议问题