Вложенные большие таблицы в itext7

Я видел, что лучший способ обработки больших таблиц в itext 7 объясняется в http://developers.itextpdf.com/examples/tables/clone-large-tables

У меня есть стол внутри другого. Что, если большой стол - внутренний?

Table outTable = new Table(new float[]{1f},true);

Cell cellHeader1 = new Cell();
cellHeader1.add(new Paragraph("Header 1").addStyle(style));
outTable.addHeaderCell(cellHeader1);

document.add(outTable);

for (int i=0; i<smallArray.size();i++) {
    Table innerTable = new Table(new float[]{0.5f,0.5f},true);
    Cell cellHeader2 = new Cell(1,2);
    cellHeader2.add(new Paragraph("Header 2").addStyle(style));
    innerTable.addHeaderCell(cellHeader2);

    Cell cellInnerTable = new Cell();
    cellInnerTable.add(innerTable);
    outTable.addCell(cellInnerTable);

    for(int j=0;j<bigArray.size();j++){
        //add cells to innerTable;
        if (j%20==0){
            innerTable.flush();  (1)
            outTable.flush(); (2)
        }
    }

    innerTable.complete(); (1)
}
outTable.complete();

(2) Этот сброс не решает проблему с памятью.

(1) Эти строки возвращают исключение NullPointerException в объекте Table, строка 539, так как document имеет значение null. Родителем outTable является документ, поэтому метод flush сбрасывает данные в документ, но родительским элементом innerTable является outTable, а не документ. Есть ли способ встроенной внутренней таблицы в outTable и outTable в документ?

Если я установлю документ на innerTable, чтобы не получить NullPointerException: innerTable.setDocument(document);

он не ведет себя должным образом, потому что теперь innerTable сбрасывается в документ, а не в outTable, и он делает странные вещи.

Большое спасибо!

2 ответа

Решение

К сожалению, большие таблицы поддерживаются, только если вы добавляете их непосредственно в Document, Внутренние большие таблицы не поддерживаются, и в ближайшее время не планируется добавлять поддержку внутренних больших таблиц.

Пытаться:

for(int j=0;j<bigArray.size();j++){
    //add cells to innerTable;
    if (j%20==0){
        Cell cellContent = new Cell(1,2).add(innerTable);
        outTable.addCell(cellContent);
        innerTable.flushContent();  // API says is internal but is public and works OK
        outTable.flush();
    }
}
Другие вопросы по тегам