iTextSharp:页面标题与大表格不对齐

时间:2013-09-14 18:19:10

标签: itextsharp

我使用的是最新版本的iTextSharp(5.4.3)。定义偶数简单页面标题时,如果文档包含不适合一页的大表,则标题将不会垂直对齐。显示大表的第一页上的对齐很好,但在后续页面上,标题会进一步向下显示并覆盖表格。

我的代码如下。很高兴得到一个解决方法或想法可能出错。

顺便说一句:当添加导致自动分页符的段落时,我会按预期获得页眉。

这是我的测试代码:

const string pdfFileName = "iTestSharp Table Split Test.pdf";
using (var pdfFileStream = File.Create(pdfFileName))
{
   using (Document document = new Document(PageSize.A4, 25, 25, 30, 30))
   {
      PdfWriter pdfWriter = PdfWriter.GetInstance(document, pdfFileStream);
      pdfWriter.PageEvent = new PageEventHelper();
      document.Open();  

      // When adding a large table the page heading for pages automatically created 
      // by the table are  out of alignment
      const int numberOfRows = 50;
      PdfPTable table = new PdfPTable(1)
      {
         TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin,
         LockedWidth = true
      };
      for (int i = 1; i <= numberOfRows; i++)
      {
         table.AddCell(i.ToString());
      }
      document.Add(table);

      // Adding more paragraphs than fit on one page creates page headers as expected
      document.NewPage();
      for (int i = 1; i <= numberOfRows; i++)
      {
         document.Add(new Paragraph("Line " + i));
      }
   }
} 

这是(非常简单的)PageEventHelper类:

public class PageEventHelper : PdfPageEventHelper
{
   public override void OnStartPage(PdfWriter writer, Document document)
   {
      base.OnStartPage(writer, document); // Does actually nothing
      document.Add(new Paragraph("Page Heading"));
   }
}

结果第1页:

Result Page 1

结果第2页: Result Page 2 修改

LineSeparator中添加的{p> PdfPageEventHelper.OnStartPage只要不在Chunk内,就会正确显示。 ChunkParagraph个对象不一致(即使LineSeparator在它们之前和/或之后)。看起来段落被正确添加(行在标题中),但只有它们内部的文本打印在错误的位置。

1 个答案:

答案 0 :(得分:1)

OnStartPageOnEndPage中,您不应该向给定的Document实例添加任何内容。相反,页眉和页脚应添加到给定PdfWriter的直接内容中。参看iText(夏普)样本,例如

  /**
   * 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
    );
  }
  

(来自MovieHistory2.cs,来自iText in Action — 2nd Edition第5章的C#'样本)