ITextSharp中的页眉和页脚

时间:2015-12-27 19:56:20

标签: c# itextsharp

我知道这个问题已被问了一千次,但我还没有找到一个直截了当的答案。我对ITextSharp比较陌生,所以请解释好像你和一个小孩说话。如何在我正在创建的文档中添加一个简单的纯文本页眉和页脚?

我正在使用以下代码创建一个简单的pdf文档:

void Button1Click(object sender, EventArgs e)
    {

            Document doc = new Document(iTextSharp.text.PageSize.LEDGER, 10, 10, 42, 35);
            PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream(@"File Path", FileMode.Create));

            doc.Open();
            Paragraph par1 = new Paragraph("Hello World!");
            doc.Add(par1);

            //Code to add header/footer

            doc.Close();

            MessageBox.Show("Your PDF has been created!");
    }

我已经做了很多关于如何添加页眉和页脚的研究,但它们都与复杂的页面事件有关。有没有更简单的方法?如果没有,你能一步一步地指导我完成这个过程吗?我非常感谢你们所能给予的任何帮助。谢谢!

1 个答案:

答案 0 :(得分:6)

您正在创建Document,如下所示:

Document doc = new Document(iTextSharp.text.PageSize.LEDGER, 10, 10, 42, 35);

这意味着您有42个用户单位的上边距和35个用户单位的下边距。您可以使用此边距在页面事件中添加额外内容。

官方网站上有很多例子和全面的Q& A部分。所有示例和答案都被标记。如果单击header标记,可以找到大量示例。

正如评论中其他人已经指出的那样,您需要创建一个PdfPageEvent实现。最简单的方法是扩展PdfPageEventHelper类。

class MyHeaderFooterEvent : PdfPageEventHelper {
  Font FONT = new Font(Font.FontFamily.HELVETICA, 18, Font.BOLD);

  public override void OnEndPage(PdfWriter writer, Document document) {
    PdfContentByte canvas = writer.DirectContent;
    ColumnText.ShowTextAligned(
      canvas, Element.ALIGN_LEFT,
      new Phrase("Header", FONT), 10, 810, 0
    );
    ColumnText.ShowTextAligned(
      canvas, Element.ALIGN_LEFT,
      new Phrase("Footer", FONT), 10, 10, 0
    );
  }
}

重要的是要知道:

  • 禁止在OnStartPage()事件中添加内容。在iTextSharp移动到新页面之前将所有内容添加到页面时添加页眉和页脚。更具体地说:在OnEndPage()事件中添加内容。
  • 禁止向传递给事件的Document对象添加内容。此对象仅可用于只读目的。

如果您检查OnEndPage()课程中的MyHeaderFooterEvent方法,您会看到我们从作者那里获得了DirectContent,并且我们使用{canvasShowTextAligned添加内容{1}}方法。还有许多其他方法可以添加内容,但您明确要求最简单的方法。这种方式有其局限性,但很容易。

我使用了几个硬编码值:我使用10作为页眉和页脚的x值。那是因为您定义了10个用户单位的左边距。页眉和页脚与您要添加到页面的实际内容保持对齐。我使用810作为标题的y值,因为您要创建一个上边距为42的A4页面。页面的顶部y坐标为842。 {1}}上边距的坐标是842 - 42 = 800.我添加了10个用户单元,这样您的标题就不会粘贴到实际内容上。页面的底部y坐标在您的情况下为0,而下边距的y坐标在35中。我使用y作为页脚的基线。

您创建10并在创建此wri实例后立即打开PdfWriter实例。要使页面事件生效,您应该在打开Document之前添加以下链接:

Document

现在每次主进程最终确定页面时都会调用wri.PageEvent = new MyHeaderFooterEvent(); 方法。

重要提示:您在错误的地方添加了OnEndPage()。 iTextSharp将尝试尽快刷新页面内容。如果添加代码以在添加内容之后添加页眉/页脚,则无法返回向已刷新到输出流的页面添加页眉和页脚。