iTextSharp:如何找到表格中的第一行和第二行高度
本文关键字:一行 高度 二行 表格 iTextSharp 何找 | 更新日期: 2023-09-27 18:27:33
我想获得第一列和第二列的高度,以了解是否需要调用document.NewPage()
。但是,如果不将表添加到文档中,我就找不到实现这一点的方法。
示例:
PdfPRow firstRow = new PdfPRow(cells1.ToArray());
table.Rows.Add(firstRow);
PdfPRow secondRow = new PdfPRow(cells2.ToArray());
table.Rows.Add(secondRow);
float h1 = table.GetRowHeight(0), h2 = table.GetRowHeight(1);
if (currentY - h1 - h2 < 30) document.NewPage();
document.Add(table);
请在此处查看我的答案。基本上,在渲染表之前,您无法知道表的维度。但是,您可以将表呈现为刚丢弃的文档,然后再重新呈现。
有趣的问题,所以+1。并且已经标记为已回答,但是。。。
"但是,如果不在文档中添加表格,我就找不到实现这一目标的方法。"
这是有可能的。将PdfPTable
封装在ColumnText
对象中,并利用ColumnText.Go()重载来获得所需的任意/任意行数的总高度,而无需将PdfPTable
添加到Document
。这里有一个简单的辅助方法:
public static float TotalRowHeights(
Document document, PdfContentByte content,
PdfPTable table, params int[] wantedRows)
{
float height = 0f;
ColumnText ct = new ColumnText(content);
// respect current Document.PageSize
ct.SetSimpleColumn(
document.Left, document.Bottom,
document.Right, document.Top
);
ct.AddElement(table);
// **simulate** adding the PdfPTable to calculate total height
ct.Go(true);
foreach (int i in wantedRows) {
height += table.GetRowHeight(i);
}
return height;
}
和一个用5.2.0.0:测试的简单用例
using (Document document = new Document()) {
PdfWriter writer = PdfWriter.GetInstance(document, STREAM);
document.Open();
PdfPTable table = new PdfPTable(4);
for (int i = 1; i < 20; ++i) {
table.AddCell(i.ToString());
}
int[] wantedRows = {0, 2, 3};
document.Add(new Paragraph(string.Format(
"Simulated table height: {0}",
TotalRowHeights(document, writer.DirectContent, table, wantedRows)
)));
// uncomment block below to verify correct height is being calculated
/*
document.Add(new Paragraph("Add the PdfPTable"));
document.Add(table);
float totalHeight = 0f;
foreach (int i in wantedRows) {
totalHeight += table.GetRowHeight(i);
}
document.Add(new Paragraph(string.Format(
"Height after adding table: {0}", totalHeight
)));
*/
document.Add(new Paragraph("Test paragraph"));
}
在用例中,使用了行1、行3和行4,但仅用于演示行的任何组合/数量。
除非您设置了表的宽度,table。GetRowHeight(0)将始终返回零。
// added
table.TotalWidth = 400f;
//
PdfPRow firstRow = new PdfPRow(cells1.ToArray());
table.Rows.Add(firstRow);
PdfPRow secondRow = new PdfPRow(cells2.ToArray());
table.Rows.Add(secondRow);
float h1 = table.GetRowHeight(0), h2 = table.GetRowHeight(1);
if (currentY - h1 - h2 < 30) document.NewPage();
document.Add(table);
还有另一种方法:首先创建表。
this.table = new PdfPTable(relativeColumnWidths);
this.table.SetTotalWidth(absoluteColumnWidths);
this.rowCells.Clear();
您现在可以用表格单元格填充列表:
Paragraph pText = new Paragraph(text, this.font);
PdfPCell cell = new PdfPCell(pText);
this.rowCells.Add(cell);
当您准备好创建新行时:
PdfPRow row = new PdfPRow(this.rowCells.ToArray());
this.table.Rows.Add(row);
这没什么特别的。但是,如果您现在再次设置表格宽度,则可以正确计算行高:
this.table.SetTotalWidth(this.table.AbsoluteWidths);
this.rowCells.Clear();
float newRowsHeight = this.table.GetRowHeight(this.table.Rows.Count - 1);
如果该行不符合您的条件,您可以简单地将其从表的rows集合中删除。桌子的总高度也将正确计算。