#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# в основном заключается в изменении регистра символов в нескольких местах.