我使用的是最新版本的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页: 修改
LineSeparator
中添加的{p> PdfPageEventHelper.OnStartPage
只要不在Chunk
内,就会正确显示。 Chunk
和Paragraph
个对象不一致(即使LineSeparator
在它们之前和/或之后)。看起来段落被正确添加(行在标题中),但只有它们内部的文本打印在错误的位置。
答案 0 :(得分:1)
在OnStartPage
和OnEndPage
中,您不应该向给定的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#'样本)