Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Itext 如何在多页上对齐PdfPCell的底部?_Itext - Fatal编程技术网

Itext 如何在多页上对齐PdfPCell的底部?

Itext 如何在多页上对齐PdfPCell的底部?,itext,Itext,我使用的是iTextSharp版本4.1.6.16。我有一个带有两列(1行)的PdfPTable 右边的单元格中有很多内容,所以它跨越整个页面并到达下一页 在左边的单元格中,我只想在底部放置一些小的PdfPTable。为此,我使用cell.VerticalAlignment=Element.ALIGN\u BOTTOM位于最顶部表格的左侧单元格中。如果行不大于一页,则此操作效果良好 如果行到达下一页,则左侧单元格的内容确实与第一页底部对齐,但与第一页底部对齐。因此,右侧单元格的内容仍在下一页上继

我使用的是iTextSharp版本4.1.6.16。我有一个带有两列(1行)的
PdfPTable

右边的单元格中有很多内容,所以它跨越整个页面并到达下一页

在左边的单元格中,我只想在底部放置一些小的
PdfPTable
。为此,我使用cell.VerticalAlignment=Element.ALIGN\u BOTTOM位于最顶部表格的左侧单元格中。如果行不大于一页,则此操作效果良好

如果行到达下一页,则左侧单元格的内容确实与第一页底部对齐,但与第一页底部对齐。因此,右侧单元格的内容仍在下一页上继续,但左侧单元格在那里是空的(我用背景色测试,它也跨越到下一页)

我尝试在内表上设置
KeepTogether
,但没有任何效果。我也考虑过用
CellEvent
来做这件事,但到目前为止我还找不到如何在单元格中绝对定位
IElement
(不仅仅是
图像或文本)


内容与单元格占据的第一页底部对齐是错误还是设计行为?是否有一种变通方法或更好的方法将内容放在单元格的底部,无论其结束在哪里?

我最终通过以下变通方法解决了问题

我创建了一个
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]);
    }
}
然后,我在原来的两行表中添加了第二行,并在其中添加了一个高度等于0的单元格,其中我使用了这个
CellEvent
,而不是将内容放入其中。原来的左侧单元格保留为空,因此下一行的内容被推送到该单元格上,看起来与原来一样。此表中没有边框,所以它们不是问题,但也可以通过将此1px单元格的边框设置为“无”来解决

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