【问题标题】:iTextSharp: Page header out of alignment with large tablesiTextSharp:页眉与大表格不对齐
【发布时间】:2013-09-14 18:19:09
【问题描述】:

我正在使用最新版本的 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:

结果第 2 页: 编辑:

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

【问题讨论】:

  • OnStartPageOnEndPage 中,您不应该向给定的Document 实例添加任何内容。而是应将页眉和页脚添加到给定PdfWriter 的直接内容中。参照。 iText (Sharp) 示例。
  • 谢谢 mkl。我不知道这一点(我只是想面向对象......)。会接受这个作为答案。
  • 稍后我会用一两个链接来回答。

标签: itextsharp


【解决方案1】:

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

  /**
   * 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# 化示例)

【讨论】:

  • 注意,示例使用rect = writer.GetBoxSize("art");如果你不设置艺术框,你可能想改用rect = document.PageSize
猜你喜欢
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
相关资源
最近更新 更多