我想知道是否有办法检查"新页面"是因为超出表格还是以编程方式(使用doc.NewPage();
)?
如果新页面因超出表格或文本而导致,我需要隐藏标题表并显示文本,否则如果新页面以编程方式导致我需要正常显示标题表。
我试图在" OnStartPage"中找到一个标志或类似的东西。如果页面超出或没有显示我的事件,但我一无所获。
我希望有人可以帮助我。
谢谢!
答案 0 :(得分:3)
我会查看您可以实现的IPdfPTableEventSplit
接口,并将其分配给PdfPTable.TableEvent
属性。它有两种方法SplitTable
和TableLayout
。每当表拆分发生时调用第一个方法,每当表实际写入画布时调用第二个方法。在第一种方法中,您可以设置标志并在发生拆分时禁用标题行,在第二种方法中,您可以将内容写出来。
{<1}}方法在添加新页面之前触发,因此您需要跟踪三元状态,“不分割”,“在下一页上绘制”和“绘制”在本页面”。我把它们打包成枚举:
SplitTable
实现的界面如下所示:
[Flags]
public enum SplitState {
None = 0,
DrawOnNextPage = 1,
DrawOnThisPage = 2
}
最后用一些简单的测试数据实际实现该类:
public class SplitTableWatcher : IPdfPTableEventSplit {
/// <summary>
/// The current table split state
/// </summary>
private SplitState currentSplitState = SplitState.None;
public void SplitTable(PdfPTable table) {
//Disable header rows for automatic splitting (per OP's request)
table.HeaderRows = 0;
//We now need to split on the next page, so append the flag
this.currentSplitState |= SplitState.DrawOnNextPage;
}
public void TableLayout(PdfPTable table, float[][] widths, float[] heights, int headerRows, int rowStart, PdfContentByte[] canvases) {
//If a split happened and we're on the next page
if (this.currentSplitState.HasFlag(SplitState.DrawOnThisPage)) {
//Draw something, nothing too special here
var cb = canvases[PdfPTable.TEXTCANVAS];
cb.BeginText();
cb.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, false), 18);
//Use the table's widths and heights to find a spot, this probably could use some tweaking
cb.SetTextMatrix(widths[0][0], heights[0]);
cb.ShowText("A Split Happened!");
cb.EndText();
//Unset the draw on this page flag, it will be reset below if needed
this.currentSplitState ^= SplitState.DrawOnThisPage;
}
//If we previously had the next page flag set change it to this page
if (currentSplitState.HasFlag(SplitState.DrawOnNextPage)) {
this.currentSplitState = SplitState.DrawOnThisPage;
}
}
}