在iTextSharp中为pdf单元格添加页眉,页脚和背景颜色

时间:2014-06-05 07:17:06

标签: c# pdf itextsharp

我正在使用iTextSharp for PDF Doc creater。我想添加标题,它是一个文本和它下面的一行,然后是要出现的表格。页脚应包含右下角的页码。我能够创建表,但页眉和页脚似乎是一个问题。有人可以给出一个示例代码来解决这个问题。我还要为表格中的标题列着色,即仅第一行的标题列具有背景颜色。我是新来的,所以请帮帮我。提前谢谢。

1 个答案:

答案 0 :(得分:4)

请查看与iText相关的keywords list商家信息主题。现在选择关键字headers / footers。您将发现使用页面事件添加页眉和页脚。

这就是它的工作原理:在创建文档时,可以在文档中添加对象,而不必担心这些对象在不同页面上的分布。例如:PdfPTable在不适合页面时被拆分,而不适合的部分将被转发到下一页。

每次发生这种情况时,iText都会调用一个事件。如文档所述,在OnStartPage()方法中添加内容很危险,因此如果要添加页眉和页脚,则需要在OnEndPage()事件中添加内容。

让我们从我书的Chapter 5中选择一个C#示例。在MovieHistory2中,我们创建了一个像这样的页面事件:

class HeaderFooter : PdfPageEventHelper {
  /** Alternating phrase for the header. */
  Phrase[] header = new Phrase[2];
  /** Current page number (will be reset for every chapter). */
  int pagenumber;

  /**
   * Initialize one of the headers.
   * @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(
   *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
   */
  public override void OnOpenDocument(PdfWriter writer, Document document) {
    header[0] = new Phrase("Movie history");
  }

  /**
   * Initialize one of the headers, based on the chapter title;
   * reset the page number.
   * @see com.itextpdf.text.pdf.PdfPageEventHelper#onChapter(
   *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document, float,
   *      com.itextpdf.text.Paragraph)
   */
  public override void OnChapter(
    PdfWriter writer, Document document,
    float paragraphPosition, Paragraph title) 
  {
    header[1] = new Phrase(title.Content);
    pagenumber = 1;
  }

  /**
   * Increase the page number.
   * @see com.itextpdf.text.pdf.PdfPageEventHelper#onStartPage(
   *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
   */
  public override void OnStartPage(PdfWriter writer, Document document) {
    pagenumber++;
  }

  /**
   * Adds the header and the footer.
   * @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(
   *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
   */
  public override void OnEndPage(PdfWriter writer, Document document) {
    Rectangle rect = writer.GetBoxSize("art");
    switch(writer.PageNumber % 2) {
    case 0:
      ColumnText.ShowTextAligned(writer.DirectContent,
        Element.ALIGN_RIGHT, 
        header[0],
        rect.Right, rect.Top, 0
      );
      break;
    case 1:
      ColumnText.ShowTextAligned(
        writer.DirectContent,
        Element.ALIGN_LEFT,
        header[1],
        rect.Left, rect.Top, 0
      );
      break;
    }
    ColumnText.ShowTextAligned(
      writer.DirectContent,
      Element.ALIGN_CENTER, 
      new Phrase(String.Format("page {0}", pagenumber)),
      (rect.Left + rect.Right) / 2, 
      rect.Bottom - 18, 0
    );
  }
}

请注意,OnChapter()方法可能与您无关:它会在事件中存储章节的标题,并将该标题用于标题。您可能感兴趣的部分可以在OnEndPage()方法中找到。每次页面结束时,我们都会在绝对位置添加内容。

您希望内容成为一张桌子吗?没问题,这正是MovieCountries1示例中所做的。

创建页面事件后,实施OnEndPage()方法,您只需将事件声明为PdfWriter

TableHeader tevent = new TableHeader();
writer.PageEvent = tevent;

在表格中着色细胞的背景是不费脑子的。这在chapter 4中解释。

PdfPCell cell = new PdfPCell(new Phrase("red cell"));
cell.BackgroundColor = BaseColor.RED;

我假设您刚刚为我们的信息添加了这条评论,并且这不是一个实际的问题,但无论如何,如果设置单元格的背景颜色对您来说并非无足轻重,我还是会回答它。当然,您可以找到创建像this one这样的PDF的示例,这是一个带有重复页眉和页脚行的PDF,页眉和页脚单元格的颜色不同。