0

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

结果第 1 页

结果第 2 页: 结果第 2 页 编辑:

LineSeparatorPdfPageEventHelper.OnStartPage只要添加的 s不在 a 中,它们就会正确显示ChunkChunk并且Paragraph对象不对齐(即使 aLineSeparator在它们之前和/或之后)。看起来段落已正确添加(行在标题中),但只有其中的文本打印在错误的位置。

4

1 回答 1

1

OnStartPage并且OnEndPage您不应该向给定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# 化示例)

于 2013-09-16T14:27:15.973 回答