2013-09-25 7 views
27

Как добавить верхний и нижний колонтитулы для каждой страницы в pdf.Добавить верхний и нижний колонтитулы для PDF с помощью iTextsharp

Headed будет содержать только текст Footer будет содержать текст и нумерацию страниц для PDF (Страница: 1 из 4)

Как это возможно? Я попытался добавить строку ниже, но заголовок не отображается в формате pdf.

document.AddHeader("Header", "Header Text"); 

Этот код я использую для генерации PDF:

protected void GeneratePDF_Click(object sender, EventArgs e) 
    { 
     DataTable dt = getData(); 

      Response.ContentType = "application/pdf"; 
      Response.AddHeader("content-disposition", "attachment;filename=Locations.pdf"); 
      Response.Cache.SetCacheability(HttpCacheability.NoCache); 

      Document document = new Document(); 

      PdfWriter.GetInstance(document, Response.OutputStream); 

      document.Open(); 

      iTextSharp.text.Font font5 = iTextSharp.text.FontFactory.GetFont(FontFactory.COURIER , 8); 

      PdfPTable table = new PdfPTable(dt.Columns.Count); 
      PdfPRow row = null; 
      float[] widths = new float[] { 6f, 6f, 2f, 4f, 2f }; 

      table.SetWidths(widths); 

      table.WidthPercentage = 100; 
      int iCol = 0; 
      string colname = ""; 
      PdfPCell cell = new PdfPCell(new Phrase("Locations")); 

      cell.Colspan = dt.Columns.Count; 

      foreach (DataColumn c in dt.Columns) 
      { 

       table.AddCell(new Phrase(c.ColumnName, font5)); 
      } 

      foreach (DataRow r in dt.Rows) 
      { 
       if (dt.Rows.Count > 0) 
       { 
        table.AddCell(new Phrase(r[0].ToString(), font5)); 
        table.AddCell(new Phrase(r[1].ToString(), font5)); 
        table.AddCell(new Phrase(r[2].ToString(), font5)); 
        table.AddCell(new Phrase(r[3].ToString(), font5)); 
        table.AddCell(new Phrase(r[4].ToString(), font5)); 
       } 
      } 
      document.Add(table); 
      document.Close(); 

      Response.Write(document); 
      Response.End(); 
     } 
    } 
+0

Может быть, эта помощь вам полна. http://www.mazsoft.com/blog/post/2008/04/30/Code-sample-for-using-iTextSharp-PDF-library.aspx –

ответ

6

Мы не говорим о iTextSharp больше. Вы используете iText 5 для .NET. Текущей версией является iText 7 для .NET.

Устаревший Ответ:

AddHeader устарели давно и был удален из iTextSharp. Добавление верхних и нижних колонтитулов теперь выполняется с использованием page events. Примеры приведены на Java, но вы можете найти порт C# для примеров here и here (прокрутите в нижней части страницы ссылки на файлы .cs).

Убедитесь, что вы прочитали документацию. Общая ошибка, которую многие разработчики сделали перед вами, добавляет контент в OnStartPage. Вы должны добавлять контент только в OnEndPage. Также очевидно, что вам нужно добавить контент в абсолютные координаты (например, используя ColumnText), и вам нужно зарезервировать достаточное пространство для верхнего и нижнего колонтитулов, правильно определяя поля вашего документа.

Обновленный ответ:

Если вы новичок в IText, вы должны использовать IText 7 и использовать обработчик событий, чтобы добавить верхние и нижние колонтитулы. См. chapter 3 учебника по началу работы с iText 7 для .NET.

Если у вас есть PdfDocument в IText 7, вы можете добавить обработчик событий:

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

Это является примером трудный путь, чтобы добавить текст в абсолютной позиции (с помощью 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(); 
    } 
} 

Это способ немного выше уровня, используя 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(); 
    } 
} 

Есть другие способы добавления контента в абсолютные позиции. Они описаны в разных iText books.

+0

Не совсем верно. Использование событий страницы - один из способов добавить верхние и нижние колонтитулы, но вы можете добавить их с помощью 'Document.Header' или' Document.Footer'. – Dom

+2

Дорогой Dom, если вы можете добавить верхние и нижние колонтитулы с помощью 'Document.Header' или' Document.Footer', вы используете версию iText, которая больше не поддерживается: http://lowagie.com/itext2 –

+0

Приносим извинения ! Благодарю вас за информацию! – Dom

32

Как уже ответил @Bruno, вам нужно использовать pageEvents.

Пожалуйста, проверьте код примера ниже:

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 
      { 
      }  
     }  
    } 
} 

И создать один файл с именем класса ITextEvents.cs и добавить следующий код:

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(); 
    } 
} 

Надеюсь, это поможет!

+0

Мне нравится этот пример, но у меня есть один вопрос: если я использую ваш класс PdfPageEventHelper как общий класс для всех своих PDF-документов, и я хочу отображать другой текст в заголовке каждого документа (например, как название документа ... и т. д.), как это установить? Благодарю. – user2430797

+0

Вы можете создать свойство для каждого элемента, который должен быть настроен динамически пользователем. Например, «Sample Header Here», может быть заменен свойством, и его значение может быть установлено во время выполнения. Надеюсь, это имеет смысл. –

+0

Работает отлично! Нужна помощь, чтобы удалить добавочный текст TotalCount в нижний колонтитул страницы, поскольку я размещаю другой текст в нижнем колонтитуле. Счет страницы будет прикрепляться к любой строке, которую я размещаю – Bhat

0

Easy кода, которые работают успешно:

protected void Page_Load(object sender, EventArgs e) 
{ 
. 
.  
using (MemoryStream ms = new MemoryStream()) 
{ 
    . 
    . 
    iTextSharp.text.Document doc = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 36, 36, 54, 54); 
    iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, ms); 
    writer.PageEvent = new HeaderFooter(); 
    doc.Open(); 
    . 
    . 
    // make your document content.. 
    . 
    .     
    doc.Close(); 
    writer.Close(); 

    // output 
    Response.ContentType = "application/pdf;"; 
    Response.AddHeader("Content-Disposition", "attachment; filename=clientfilename.pdf"); 
    byte[] pdf = ms.ToArray(); 
    Response.OutputStream.Write(pdf, 0, pdf.Length); 
} 
. 
. 
. 
} 
class HeaderFooter : PdfPageEventHelper 
{ 
public override void OnEndPage(PdfWriter writer, Document document) 
{ 

    // Make your table header using PdfPTable and name that tblHeader 
    . 
    . 
    tblHeader.WriteSelectedRows(0, -1, page.Left + document.LeftMargin, page.Top, writer.DirectContent); 
    . 
    . 
    // Make your table footer using PdfPTable and name that tblFooter 
    . 
    . 
    tblFooter.WriteSelectedRows(0, -1, page.Left + document.LeftMargin, writer.PageSize.GetBottom(document.BottomMargin), writer.DirectContent); 
} 
} 
2

Просто добавьте эту строку перед открытием документа (должно быть перед):

 document.Header = new HeaderFooter(new Phrase("Header Text"), false); 
     document.Open(); 
+0

Привет Альваро, добро пожаловать в StackOverflow. Можете ли вы объяснить, почему вы должны это делать, или * как это работает? –

+1

Привет, это должно быть перед открытием документа, если вы хотите, чтобы заголовок отображался на первой странице, если вам это не нужно, вы можете поместить его после. Я знаю, что новый способ сделать это через PdfPageEvent, но это простой способ, если вам не нужен такой контроль над верхним или нижним колонтитулом. Как это работает ... документации об этом нет. –

+0

Ага. Большое спасибо за объяснение этого - я надеюсь, что дополнительная информация поможет другим. –

5

Ответов на этот вопрос, в то время как они являются правильными, являются очень излишне сложно. В верхнем и нижнем колонтитуле не отображается много кода для текста. Вот простой пример добавления текста в верхний/нижний колонтитул.

Текущая версия iTextSharp работает путем реализации класса обратного вызова, который определяется интерфейсом IPdfPageEvent. Из того, что я понимаю, не стоит добавлять вещи во время метода OnStartPage, поэтому вместо этого я буду использовать способ страницы OnEndPage. События запускаются в зависимости от того, что происходит с PdfWriter

Сначала создайте класс, который реализует IPdfPageEvent. В: функция

 public void OnEndPage(PdfWriter writer, Document document) 

, получить PdfContentByte объект по телефону

 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); 
      //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(); 

Так полный для функции OnEndPage будет:

 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(); 

     } 

Это будет отображаться внизу документа. Одна последняя вещь. Не забудьте присвоить IPdfPageEvent так:

 writter.PageEvent = new PDFEvents(); 

к объекту PdfWriter writter

Для заголовка очень похожи. Просто переверните SetTextMatrix у координат:

 cb.SetTextMatrix(document.LeftMargin, document.PageSize.Height - document.TopMargin); 
+1

Решение без таблиц проще других. Лол сумасшедший, что нам нужно сделать, чтобы добавить простую ногу и заголовок. –

1

Для iTextSharp 4.1.6, последняя версия iTextSharp, которая была лицензирована в качестве LGPL, то решение, предоставляемое Alvaro Patiño является простым и эффективным.

Поскольку документация несколько скудна, я хотел бы расширить его ответ с помощью этого фрагмента кода, который можно использовать для изменения внешнего вида верхнего и нижнего колонтитула. По умолчанию они имеют довольно большой размер шрифта и толстую границу, которую многие люди захотят изменить.

// Parameters passed on to the function that creates the PDF 
String headerText = "Your header text"; 
String footerText = "Page"; 

// Define a font and font-size in points (plus f for float) and pick a color 
// This one is for both header and footer but you can also create seperate ones 
Font fontHeaderFooter = FontFactory.GetFont("arial", 8f); 
fontHeaderFooter.Color = Color.GRAY; 

// Apply the font to the headerText and create a Phrase with the result 
Chunk chkHeader = new Chunk(headerText, fontHeaderFooter); 
Phrase p1 = new Phrase(chkHeader); 

// create a HeaderFooter element for the header using the Phrase 
// The boolean turns numbering on or off 
HeaderFooter header = new HeaderFooter(p1, false); 

// Remove the border that is set by default 
header.Border = Rectangle.NO_BORDER; 
// Align the text: 0 is left, 1 center and 2 right. 
header.Alignment = 1; 

// add the header to the document 
document.Header = header; 

// The footer is created in an similar way 

// If you want to use numbering like in this example, add a whitespace to the 
// text because by default there's no space in between them 
if (footerText.Substring(footerText.Length - 1) != " ") footerText += " "; 

Chunk chkFooter = new Chunk(footerText, fontHeaderFooter); 
Phrase p2 = new Phrase(chkFooter); 

// Turn on numbering by setting the boolean to true 
HeaderFooter footer = new HeaderFooter(p2, true); 
footer.Border = Rectangle.NO_BORDER; 
footer.Alignment = 1; 

document.Footer = footer; 

// Open the Document for writing and continue creating its content 
document.Open(); 

Для получения дополнительной информации ознакомьтесь Creating PDFs with iTextSharp и iTextSharp - Adding Text with Chunks, Phrases and Paragraphs. Исходный код на GitHub также может быть полезен.

0
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; } 
    } 
} 

использовать:

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; 

.. .. Построить массив строк для заголовков ...

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(); 

... Теперь ваши заголовки и колонтитул обрабатываться автоматически

+0

Как вы думаете, какое преимущество вашего решения в отличие от существующих ответов? – mkl

+0

Его очень общая подпрограмма, которую я использую для создания верхних и нижних колонтитулов для множества отчетов, для которых не требуется заголовок изображения. Его легко адаптироваться в большинстве случаев требует только изменения свойств. – Woody

+0

Возможно, вы захотите отредактировать свой ответ, чтобы объяснить, что, поскольку столько кода вряд ли кто-нибудь прочитает все и узнает о преимуществах. – mkl

Смежные вопросы