根据医生的说法
public Table(int numColumns,
boolean largeTable)
Constructs a Table with specified number of columns. The final column widths depend on selected table layout. Since 7.0.2 table layout algorithms were introduced. Auto layout is default, except large tables. For large table fixed layout set implicitly. Since 7.1 table will have undefined column widths, that will be determined during layout. In oder to set equal percent width as column width, use UnitValue.createPercentArray(int)我使用https://developers.itextpdf.com/examples/tables/clone-large-tables呈现一个大表,有方法定义autoLayout吗?可能在添加第一行之后,获取单元格宽度并在表上设置它们,但这似乎是不可能的,因为列宽度是空的,因为我使用的构造函数具有列数。或者在到达结束页时添加某种类型的autoLayout。我不想定义列的宽度,因为我们有很多表。
发布于 2018-04-18 19:23:18
首先,我想提到自动布局需要整个表的内容。计算列宽时使用内容。但是您使用的是大表,这可能意味着您有大量的数据,并且不希望将所有东西保存在内存中(如果不是这样的话,就不要使用大型表)。
因此,您所能做的就是计算给定一些初始单元格的自动列宽度的近似值。基本上,实现您的第一个想法是可能的,但是,它需要一些代码来编写。但是,如果不同行的单元格中有非常不同的内容(例如,图像与内部表相对于某些文本),则此方法可能不能很好地工作,因为正如我所说,要估计列的宽度--很好地需要所有内容。
也请记住,这种方法是相当肮脏的,可能不适用于某些角落案例。但它确实解决了目标,并使您不必定义列宽。
为了用几句话来描述这个解决方案,我们使用几个初始行的单元格,将它们添加到一个临时表中,并对其进行布局(估计位置等),而不实际将其绘制到任何地方。然后,我们从布局步骤信息中提取单元格宽度,并将它们用于大型表构造函数。
估计列宽的方法如下所示:
private UnitValue[] estimateWidths(Document document, Cell[][] cells) {
int numOfColumns = cells[0].length;
Table table = new Table(numOfColumns);
for (int i = 0; i < cells.length; i++) {
for (int j = 0; j < cells[i].length; j++) {
table.addCell(cells[i][j]);
}
}
LayoutContext context = new LayoutContext(document.getRenderer().getCurrentArea().clone());
TableRenderer tableRenderer = (TableRenderer)table.createRendererSubTree();
LayoutResult result = tableRenderer.setParent(document.getRenderer()).layout(context);
if (result.getStatus() == LayoutResult.PARTIAL) {
tableRenderer = (TableRenderer) result.getSplitRenderer();
}
UnitValue[] widths = new UnitValue[numOfColumns];
List<IRenderer> subList = tableRenderer.getChildRenderers().subList(0, numOfColumns);
for (int i = 0; i < subList.size(); i++) {
IRenderer cell = subList.get(i);
widths[i] = UnitValue.createPointValue(cell.getOccupiedArea().getBBox().getWidth());
}
return widths;
}因此,假设您有一个用于初始行的Cell[][] cells单元格数组(也可以是一行,但越多越好),其中cells[i][j]引用了行i和列j上的单元格,您可以创建这样的大型表:
Table table = new Table(estimateWidths(doc, cells), true);但是,在添加新内容之前,不要忘记显式地将cells数组中的单元格添加到大型表中。
https://stackoverflow.com/questions/49895553
复制相似问题