检查"继续"或"新"页

时间:2014-07-28 08:01:38

标签: c# itextsharp

我想知道是否有办法检查"新页面"是因为超出表格还是以编程方式(使用doc.NewPage();)?

如果新页面因超出表格或文本而导致,我需要隐藏标题表并显示文本,否则如果新页面以编程方式导致我需要正常显示标题表。

我试图在" OnStartPage"中找到一个标志或类似的东西。如果页面超出或没有显示我的事件,但我一无所获。

我希望有人可以帮助我。

谢谢!

1 个答案:

答案 0 :(得分:3)

我会查看您可以实现的IPdfPTableEventSplit接口,并将其分配给PdfPTable.TableEvent属性。它有两种方法SplitTableTableLayout。每当表拆分发生时调用第一个方法,每当表实际写入画布时调用第二个方法。在第一种方法中,您可以设置标志并在发生拆分时禁用标题行,在第二种方法中,您可以将内容写出来。

{<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;
        }
    }
}