setTableEvent setter больше не доступен для Table с itext7 - PullRequest
0 голосов
/ 30 апреля 2019

Я использую itext7. У меня есть таблица с заголовком и несколько обычных строк. Я также поместил заголовок страницы из pageNumber> 1. Поэтому, когда таблица разбивается на следующей странице, у меня появляется заголовок таблицы, который перекрывает заголовок страницы.

Моя цель - поместить заголовок разделенной таблицы чуть ниже заголовка страницы, чтобы больше не было перекрытия.

Для этого я хочу поместить табличное событие и попытаться изменить верхнюю часть поля таблицы, когда происходит разделение.

В случае с itext5 существовал установщик setTableEvent, который можно установить для PdfPTable с использованием PdfPTableEventForwarder для создания события.

Как мне достичь этой цели с помощью itext7?

Мой код такой:

Я добавил следующий обработчик для события END_PAGE

PdfDocument pdf = new PdfDocument(writer);

pdf.addEventHandler(PdfDocumentEvent.END_PAGE, new MyHeaderEventHandler());

Фрагмент кода класса MyHeaderEventHandler:

public void handleEvent (Event event) {

// код здесь

if(pageNumber > 1)
{

  Table pageHeaderTable = new Table(new float[]{1.5f, 1.3f, 1.5f, 2.3f, 2.3f, 2.3f, 2f, 2.6f});

 pageHeaderTable.setMarginTop(12).setWidth(523).setMarginLeft(36);

 pageHeaderTable.setFixedLayout();

//some code to fill pageHeaderTable cells(1 row with 8 cells) with string values

 canvas.add(pageHeaderTable);

}

 canvas.close();
 pdfCanvas.release();

}

// фрагмент кода для моей invoiceElementTable

Table invoiceElementTable = new Table(new float[]{1.5f, 1.3f, 1.5f, 2.3f, 2.3f, 2.3f, 2f, 2.6f});
invoiceElementTable.setFixedLayout();
                                invoiceElementTable.setWidth(UnitValue.createPercentValue(100));
invoiceElementTable.addHeaderCell(new Cell(1,8).add(new Paragraph("invoiceElementTable Header")));

I have a list of objects to fill the cells:

eltList.stream().forEach(elt-> {
invoiceElementTable.addCell(new Cell().add(new Paragraph(elt.getItem0)));
invoiceElementTable.addCell(new Cell().add(new Paragraph(elt.getItem1)));
invoiceElementTable.addCell(new Cell().add(new Paragraph(elt.getItem2)));
invoiceElementTable.addCell(new Cell().add(new Paragraph(elt.getItem3)));
invoiceElementTable.addCell(new Cell().add(new Paragraph(elt.getItem4)));
invoiceElementTable.addCell(new Cell().add(new Paragraph(elt.getItem5)));
invoiceElementTable.addCell(new Cell().add(new Paragraph(elt.getItem6)));
invoiceElementTable.addCell(new Cell().add(new Paragraph(elt.getItem7)));
});

Проблема заключается в том, что когда invoiceElementTable разделяется на следующую страницу, строка его заголовка («invoiceElementTable Header») перекрывает уникальную строку pageHeaderTable.

Я хочу изменить положение invoiceElementTable, когда оно разделяется на следующую страницу, чтобы избежать наложения

1 Ответ

0 голосов
/ 10 мая 2019

Реализуйте свой собственный рендерер таблиц и укажите область макета для разделенных частей таблицы.

В приведенном ниже примере прямоугольник макета был уменьшен на 100 (вам нужно изменить это значение с высотойзаголовок вашей страницы):

    class CustomTableRenderer extends TableRenderer {
    public CustomTableRenderer(Table modelElement) {
        super(modelElement);
    }

    @Override
    public IRenderer getNextRenderer() {
        return new CustomTableRenderer((Table)modelElement);
    }

    @Override
    public LayoutResult layout(LayoutContext layoutContext) {
        if (!isOriginalNonSplitRenderer) {
            LayoutArea area = layoutContext.getArea();
            area.setBBox(area.getBBox().decreaseHeight(100));
        }
        return super.layout(layoutContext);
    }
}

Чтобы интегрировать его в ваш код, просто установите экземпляр этого средства визуализации на вашей таблице:

table.setNextRenderer(new CustomTableRenderer(table));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...