iText7 Знать, расширилась ли таблица на большее количество страниц

#c# #itext7

Вопрос:

возможно ли в itext7 узнать, занимает ли таблица (добавленная в документ) 1 или более страниц и на какой странице она размещена ?

Я пробовал в обработчике на END_PAGE:

  IRenderer pRenderer = TableData.CreateRendererSubTree().SetParent(doc.GetRenderer());
 LayoutResult pLayoutResult = pRenderer.Layout(new LayoutContext(new LayoutArea(0, PageSize.A4)));

float y = pLayoutResult.GetOccupiedArea().GetBBox().GetY();
float x = pLayoutResult.GetOccupiedArea().GetBBox().GetX();
float xBottom = pLayoutResult.GetOccupiedArea().GetBBox().GetBottom();
float xHeight = pLayoutResult.GetOccupiedArea().GetBBox().GetHeight();
int pageNumber= pLayoutResult.GetOccupiedArea().GetPageNumber();
 

Я пробовал использовать таблицу только на первой странице и с расширенной таблицей на первой и второй страницах.

Номер страницы всегда равен = 0.

Заранее спасибо.

Ответ №1:

Это, безусловно, возможно. iText 7 позволяет переопределять логику рендеринга, одним из простейших приложений которой является знание того, где на странице будут размещены ваши элементы.

В качестве вспомогательного средства для хранения информации о страницах, на которых размещена наша таблица, мы можем определить небольшой класс:

 private static class LayoutInfo {
    Collection<Integer> occupiedPages = new ArrayList<>();

    public void addPage(int pageNum) {
        occupiedPages.add(pageNum);
    }

    public Collection<Integer> getOccupiedPages() {
        return occupiedPages;
    }
}
 

Теперь мы можем определить наш пользовательский модуль визуализации таблиц, который будет хранить номера страниц в этом LayoutInfo объекте:

 private static class CustomTableRenderer extends TableRenderer {
    private LayoutInfo layoutInfo;

    public CustomTableRenderer(Table modelElement, LayoutInfo info) {
        super(modelElement);
        this.layoutInfo = info;
    }

    @Override
    public void draw(DrawContext drawContext) {
        super.draw(drawContext);
        layoutInfo.addPage(occupiedArea.getPageNumber());
    }

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

Вы должны настроить пользовательский визуализатор для таблицы после того, как в нее будут добавлены все ячейки и таблица будет готова к добавлению в документ:

 table.setNextRenderer(new CustomTableRenderer(table, info));
 

Полный код высокого уровня:

 PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName));

Document document = new Document(pdfDocument);

LayoutInfo info = new LayoutInfo();

Table table = new Table(2);
for (int i = 0; i < 200; i  ) {
    table.addCell("Row number ");
    table.addCell(i   "");
}
table.setNextRenderer(new CustomTableRenderer(table, info));
document.add(table);

document.close();

System.out.println("The table is placed on the following pages: "   info.getOccupiedPages().toString());
 

Вывод кода:

 The table is placed on the following pages: [1, 2, 3, 4, 5, 6]
 

Обратите внимание, что код написан на Java, но перевод на C# в основном заключается в изменении регистра символов в нескольких местах.