【发布时间】:2017-04-28 09:34:12
【问题描述】:
我对使用 itext 7 呈现的表格有几个问题。我使用的是 itext 7.0.2.2(C# 版)。
首先,当表格开始接近页面底部并且页面只有标题空间时,itext 7在第一页呈现标题,并且在标题之后分页符。如何强制将标题和第一行保持在一起?
下一个问题是 itext 7 拆分行而不是将整行移动到下一页。我知道 itext 5 有 setSplitLate(bool) 方法来配置 itext 是否拆分行,但是如何处理 itext 7?看看行发生了什么: 请注意,行可以为空并且应该具有最小高度,因此单元格内容上的 setKeepTogether(true) 不是解决方案。我以这种方式添加单元格:
table.AddCell(new Cell().SetMinHeight(MIN_HEIGHT).Add("foo"));
更新: 这是行拆分(C#)的重现:
var writer = new PdfWriter(new FileStream("...", FileMode.Create));
var pdfDoc = new PdfDocument(writer);
using (var document = new Document(pdfDoc, PageSize.A4))
{
var table = new iText.Layout.Element.Table(UnitValue.CreatePercentArray(new[] { 1.3f, 1f, 1f, 1f, 1f, 1f, 1f }))
.SetWidthPercent(100f)
.SetFixedLayout();
foreach (var i in Enumerable.Range(1, 7 * 100)) // 100 rows
{
var cell = new Cell().SetKeepTogether(true).SetMinHeight(45).Add(i.ToString());
table.AddCell(cell);
}
document.Add(table);
}
【问题讨论】:
-
嗯,为什么
setKeepTogether(true)不是解决方案? -
标题问题确实是 iText7 中应该改进的。作为一种解决方法,您可以在有问题的表之前添加
AreaBreak。但这当然不是通用的解决方案。 -
实际上,
setKeepTogether(true)应该适用于单元格,并且有很多测试。如果需要,您可以自己检查 (TableTest#simpleTableTest11)。但是,您没有发布您的代码,因此无法猜测是哪方面出了问题。 -
查看当前可用空间,可以使用
doc.getRenderer().getCurrentArea().getBBox(); -
这确实是 min-height 和 keepTogether 组合的边缘案例错误。已在 Java
7.0.3.-SNAPSHOT中修复。移植到 C# 需要一段时间。