首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iText7大表autoLayout()

iText7大表autoLayout()
EN

Stack Overflow用户
提问于 2018-04-18 09:05:44
回答 1查看 582关注 0票数 0

根据医生的说法

代码语言:javascript
复制
  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。我不想定义列的宽度,因为我们有很多表。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-18 19:23:18

首先,我想提到自动布局需要整个表的内容。计算列宽时使用内容。但是您使用的是大表,这可能意味着您有大量的数据,并且不希望将所有东西保存在内存中(如果不是这样的话,就不要使用大型表)。

因此,您所能做的就是计算给定一些初始单元格的自动列宽度的近似值。基本上,实现您的第一个想法是可能的,但是,它需要一些代码来编写。但是,如果不同行的单元格中有非常不同的内容(例如,图像与内部表相对于某些文本),则此方法可能不能很好地工作,因为正如我所说,要估计列的宽度--很好地需要所有内容。

也请记住,这种方法是相当肮脏的,可能不适用于某些角落案例。但它确实解决了目标,并使您不必定义列宽。

为了用几句话来描述这个解决方案,我们使用几个初始行的单元格,将它们添加到一个临时表中,并对其进行布局(估计位置等),而不实际将其绘制到任何地方。然后,我们从布局步骤信息中提取单元格宽度,并将它们用于大型表构造函数。

估计列宽的方法如下所示:

代码语言:javascript
复制
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上的单元格,您可以创建这样的大型表:

代码语言:javascript
复制
Table table = new Table(estimateWidths(doc, cells), true);

但是,在添加新内容之前,不要忘记显式地将cells数组中的单元格添加到大型表中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49895553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档