2016-07-04 167 views
1

我在我的代碼中被阻止,因爲我無法在任何地方找到對此主題的答案。所以我想要做的就是將一個Header添加到新的章節頁面中。我已經達到了這個目標,但是當添加一個需要兩頁或更多頁面的新表時,我無法將頁眉添加到我想要的頁面。我有以下代碼:使用itextsharp(c#)將標題添加到PDF文件 - 僅新的章節頁面

某處在我的主要功能:

  document.NewPage(); 
      writer.PageEvent = null; 
      addHeader(writer, document, chapter3, title3); 
      addFooter(writer, document, chapter3, title3); 
      table = createVariablesTable();     
      headerOffsetSpace(document); 
      addTableHeader(table); 
      addTableBody(table, firsPage); 
      document.Add(table); 

      document.NewPage(); 
      writer.PageEvent = null; 
      addFooter(writer, document, chapter3, title3); 
      table = createVariablesTable(); 
      addTableHeader(table); 
      firstPage = false; 
      addTableBody(table, firstPage); 
      document.Add(table); 

其中:

 private void addHeader(PdfWriter writer, Document document, String chapterText, String titleText) 
    { 
     Font ArialBold = new Font(Font.FontFamily.HELVETICA, 24, Font.BOLD); 
     Font ArialItalic = new Font(Font.FontFamily.HELVETICA, 24, Font.ITALIC); 

     Chunk headerChapterChunk = new Chunk(chapterText, ArialItalic); 
     Chunk headerTitleChunk = new Chunk(titleText, ArialBold); 
     Phrase headerText = new Phrase(); 
     headerText.Add(headerChapterChunk); 
     headerText.Add(headerTitleChunk); 

     HeaderPageEvent headerEvent = new HeaderPageEvent() { header = headerText }; 
     writer.PageEvent = headerEvent; 
    } 

    private void addFooter(PdfWriter writer, Document document, String chapterText, String titleText) 
    { 
     Font TimesNewRomanNormal = new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL); 
     Font TimesNewRomanItalic = new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.ITALIC); 

     Chunk footerChapterChunk = new Chunk(chapterText, TimesNewRomanItalic); 
     Chunk footerTitleChunk = new Chunk(titleText, TimesNewRomanNormal); 
     Phrase footerText = new Phrase(); 
     footerText.Add(footerChapterChunk); 
     footerText.Add(footerTitleChunk); 

     FooterPageEvent footerEvent = new FooterPageEvent() { footer = footerText }; 
     writer.PageEvent = footerEvent; 
    } 

和類PageEvent是:

class HeaderPageEvent : PdfPageEventHelper 
    { 
     float marginHorizontal = 42.6f; 
     float marginTop = 777; 
     float marginTopHeaderSeparator = 738.1f; 
     float indentHeaderSeparator = 1.3f; 
     float headerLeading = 27.6f; 

     public Phrase header { get; set; } 

     public override void OnEndPage(PdfWriter writer, Document document) 
     { 
      iTextSharp.text.Rectangle pageSize = document.PageSize; 

      PdfContentByte cb = writer.DirectContent; 

      ColumnText columnHeader = new ColumnText(cb); 
      columnHeader.SetSimpleColumn(header, marginHorizontal, marginTop + headerLeading, pageSize.Width - 2 * marginHorizontal, 0, headerLeading, Element.ALIGN_LEFT); 
      columnHeader.Go(); 

      ColumnText columnHeaderSeparator = new ColumnText(cb); 
      Phrase headerSeparator = new Phrase(new Chunk(new iTextSharp.text.pdf.draw.LineSeparator(0.25f, 100.0f, BaseColor.BLACK, Element.ALIGN_LEFT, 0))); 
      columnHeaderSeparator.SetSimpleColumn(headerSeparator, marginHorizontal - indentHeaderSeparator, marginTopHeaderSeparator, pageSize.Width - marginHorizontal, 0, 0, Element.ALIGN_LEFT); 
      columnHeaderSeparator.Go(); 
     } 
    } 

    class FooterPageEvent : PdfPageEventHelper 
    { 
     float marginHorizontal = 42.6f; 
     float indentFooterSeparator = 1.5f; 
     float marginBottomFooter = 37.9f; 
     float marginBottomFooterSeparator = 48.2f; 

     float pageNumberEvenOffset = 35.4f; 
     float pageNumberOddOffset = 28.4f; 

     public Phrase footer { get; set; } 

     Font TimesNewRomanNormal = new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL); 

     public override void OnEndPage(PdfWriter writer, Document document) 
     { 
      iTextSharp.text.Rectangle pageSize = document.PageSize; 

      PdfContentByte cb = writer.DirectContent; 

      ColumnText columnFooterSeparator = new ColumnText(cb); 
      Phrase footerSeparator = new Phrase(new Chunk(new iTextSharp.text.pdf.draw.LineSeparator(0.25f, 100.0f, BaseColor.BLACK, Element.ALIGN_LEFT, 0))); 
      columnFooterSeparator.SetSimpleColumn(footerSeparator, marginHorizontal - indentFooterSeparator, 0, pageSize.Width - marginHorizontal + indentFooterSeparator, marginBottomFooterSeparator, 0, Element.ALIGN_LEFT); 
      columnFooterSeparator.Go(); 

      ColumnText columnPageNumber = new ColumnText(cb); 
      int pageN = writer.PageNumber; 
      Phrase pageNumber = new Phrase(pageN.ToString(), TimesNewRomanNormal); 

      ColumnText columnFooter = new ColumnText(cb); 

      switch(pageN % 2) 
      { 
       case 0: 
        columnPageNumber.SetSimpleColumn(pageNumber, marginHorizontal, 0, pageSize.Width, marginBottomFooter, 0, Element.ALIGN_LEFT); 
        columnPageNumber.Go(); 

        columnFooter.SetSimpleColumn(footer, marginHorizontal + pageNumberEvenOffset, 0, pageSize.Width, marginBottomFooter, 0, Element.ALIGN_LEFT); 
        columnFooter.Go(); 
        break; 

       case 1: 
        columnPageNumber.SetSimpleColumn(pageNumber, 0, 0, pageSize.Width - marginHorizontal, marginBottomFooter, 0, Element.ALIGN_RIGHT); 
        columnPageNumber.Go(); 

        columnFooter.SetSimpleColumn(footer, 0, 0, pageSize.Width - marginHorizontal - pageNumberOddOffset, marginBottomFooter, 0, Element.ALIGN_RIGHT); 
        columnFooter.Go(); 
        break; 
      } 
     } 
    } 

所以...做我的代碼是這樣的,它工作正常。我將標題和頁腳事件添加到新的章節頁面。然後,我將事件設置爲空,並在下一頁和下一頁再次添加頁腳事件,文檔將始終有頁腳事件。這可以解決我的問題,但有時「addTableBody」函數比一個頁面大,所以文檔會自動添加一個新頁面而不清除頁面事件,所以它將會有很多頁面顯示。誰能幫我?我只是想將Header事件添加到新的章節頁面。

在此先感謝

回答

0

添加一個額外的參數給您HeaderPageEvent

class HeaderPageEvent : PdfPageEventHelper 
{ 
    boolean ignoreHeader = true; 
    float marginHorizontal = 42.6f; 
    float marginTop = 777; 
    // rest of your code... 
} 

使用此額外的參數是這樣的:

public override void OnEndPage(PdfWriter writer, Document document) 
{ 
    if (ignoreHeader) return; 
    ignoreHeader = true; 
    // rest of your code... 
} 

通過這樣做,你告訴此次活動只爲如果ignoreHeader的值爲false,則顯示標題,如果該值爲false,則立即將其設置爲true

默認情況下,標題永遠不會顯示,這是你想要的。您只想在需要時顯示標題您可以通過添加這種方法你HeaderPageEvent做到這一點:

void ShowHeader() { 
    ignoreHeader = false; 
} 

您不再需要在活動頁面設置爲null。每當你想要一個標題時,你現在可以觸發showHeader()方法。

HeaderPageEvent event = new HeaderPageEvent(); 
writer.PageEvent = event; 
// Add stuff, no header will be added 
event.ShowHeader(); 
document.NewPage(); 
// A header will be shown, but only on one page 
document.Add(table); 

如果您想報頭出現在第一頁上,你需要的ignoreHeader默認值更改爲false

+0

感謝您的建議,它效果很好! –

相關問題