如何对齐跨越多个页面的 PdfPCell 底部?
How to align bottom a PdfPCell spaning across more than one page?
我使用的是 iTextSharp 版本 4.1.6.16。我有一个包含两列(1 行)的 PdfPTable
。
右侧单元格内容较多,跨页到下一页。
在左边的单元格中,我只想在底部放一些小的 PdfPTable
。为此,我在最顶部 table 的左侧单元格中使用 cell.VerticalAlignment = Element.ALIGN_BOTTOM;
。如果行不大于一页,此方法效果很好。
如果行到达下一页,则左侧单元格的内容确实与底部对齐,但第一页的底部。所以右边单元格的内容仍然在下一页继续,但左边单元格那里是空的(我测试了它也跨越下一页的背景颜色)。
我尝试在内部 table 上设置 KeepTogether
,但它没有任何效果。我也考虑过用 CellEvent
来做,但到目前为止我找不到如何在单元格中绝对定位 IElement
(不仅是 Image
或文本)。
内容与单元格占据的第一页底部对齐是错误还是设计行为?是否有解决方法或更好的方法将内容放在单元格底部,无论它在哪里结束?
我终于通过以下解决方法解决了这个问题。
我创建了一个 CellEvent
获取 PdfPTable
并向上移动它的内容:
class BottomFix : IPdfPCellEvent
{
private readonly PdfPTable _content;
public BottomFix(PdfPTable content)
{
_content = content;
}
public void CellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases)
{
_content?.WriteSelectedRows(0, -1, position.Left, position.Top + _content.TotalHeight, canvases[PdfPTable.BACKGROUNDCANVAS]);
}
}
然后在我原来的两行 table 中添加了第二行,并在那里添加了一个高度等于 0 的单元格,我没有将内容放入其中,而是使用了这个 CellEvent
。原来的左边单元格是空的,所以下一行的内容被推到它上面,看起来就像原来在那里一样。我在 table 中没有边框,所以它们不是问题,但也可以通过将此 1px 单元格的边框设置为 none.
来解决
var cell = new PdfPCell();
var table = new PdfPTable(1) { /* some content etc... */ };
cell.FixedHeight = 0;
cell.CellEvent = new BottomFix(table);
// such prepared cell goes to top level table, second row, left column
我使用的是 iTextSharp 版本 4.1.6.16。我有一个包含两列(1 行)的 PdfPTable
。
右侧单元格内容较多,跨页到下一页。
在左边的单元格中,我只想在底部放一些小的 PdfPTable
。为此,我在最顶部 table 的左侧单元格中使用 cell.VerticalAlignment = Element.ALIGN_BOTTOM;
。如果行不大于一页,此方法效果很好。
如果行到达下一页,则左侧单元格的内容确实与底部对齐,但第一页的底部。所以右边单元格的内容仍然在下一页继续,但左边单元格那里是空的(我测试了它也跨越下一页的背景颜色)。
我尝试在内部 table 上设置 KeepTogether
,但它没有任何效果。我也考虑过用 CellEvent
来做,但到目前为止我找不到如何在单元格中绝对定位 IElement
(不仅是 Image
或文本)。
内容与单元格占据的第一页底部对齐是错误还是设计行为?是否有解决方法或更好的方法将内容放在单元格底部,无论它在哪里结束?
我终于通过以下解决方法解决了这个问题。
我创建了一个 CellEvent
获取 PdfPTable
并向上移动它的内容:
class BottomFix : IPdfPCellEvent
{
private readonly PdfPTable _content;
public BottomFix(PdfPTable content)
{
_content = content;
}
public void CellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases)
{
_content?.WriteSelectedRows(0, -1, position.Left, position.Top + _content.TotalHeight, canvases[PdfPTable.BACKGROUNDCANVAS]);
}
}
然后在我原来的两行 table 中添加了第二行,并在那里添加了一个高度等于 0 的单元格,我没有将内容放入其中,而是使用了这个 CellEvent
。原来的左边单元格是空的,所以下一行的内容被推到它上面,看起来就像原来在那里一样。我在 table 中没有边框,所以它们不是问题,但也可以通过将此 1px 单元格的边框设置为 none.
var cell = new PdfPCell();
var table = new PdfPTable(1) { /* some content etc... */ };
cell.FixedHeight = 0;
cell.CellEvent = new BottomFix(table);
// such prepared cell goes to top level table, second row, left column