使用 ItextSharp PdfPTable,table.TotalHeight returns 0.0,但期望正浮点值

Using ItextSharp PdfPTable, table.TotalHeight returns 0.0, but expecting a positive float value

我正在使用 ItextSharp 创建包含多个 PdfPTable 的 PDF 文档。我使用列表对多个 PdfPTables 进行分组,该列表在函数中创建并 returned 作为列表。然后我获取列表并循环遍历它以将每个 PdfPTable 添加到文档中。

如果列表中的下一个 PdfPTable 大于文档中剩余的 space,我想添加一个新页面。

使用断点,我注意到 "table.TotalHeight" 总是 returns 0,而我希望它 return 是一个正浮点值。我可能误解了 table.TotalHeight 的工作方式,但据我了解,它应该 return 个人的总身高 table。

for (count1 = 0; count1 < testQuote.Count + 1; count1++)
            {                
                var list = BuildDetail(testQuote, count1);
                foreach (PdfPTable table in list)
                {
                    if (table.TotalHeight > (writer.GetVerticalPosition(false) - doc.BottomMargin))
                    {
                        doc.Add(new Paragraph("Quote continues on next page"));
                        doc.NewPage();
                    }
                    doc.Add(new Paragraph(" "));
                    doc.Add(table);
            }

除非您使用绝对值,否则 table 的高度只有在渲染后才能知道。虽然一开始令人沮丧,但一旦您开始考虑它,它就会变得有意义。此外,tables 可以嵌套在其他内容中,这就是为什么您还需要使用固定宽度而不是相对宽度的原​​因。

知道您可以使用 this post 中的辅助方法来计算 table 的高度,前提是您之前已经固定了 table 的列宽。此代码创建一个快速的临时内存文档,向其呈现 table,然后 returns table 的呈现高度。

public static float CalculatePdfPTableHeight(PdfPTable table)
{
    using (MemoryStream ms = new MemoryStream())
    {
        using (Document doc = new Document(PageSize.TABLOID))
        {
            using (PdfWriter w = PdfWriter.GetInstance(doc, ms))
            {
                doc.Open();

                table.WriteSelectedRows(0, table.Rows.Count, 0, 0, w.DirectContent);

                doc.Close();
                return table.TotalHeight;
            }
        }
    }
}

我可以在不添加文档的情况下获得table的高度,如果将table包裹在单元格中,那么您可以使用GetMaxHeight()

foreach (PdfPTable table in list)
{
    var tableHeight = new PdfPCell(table).GetMaxHeight();
}