В iText5 элементы и информация об их позиции / размере были немного смешаны вместе, что позволило вам называть calculateWidths
на элементе PdfPTable
.
В iText7 эта функция отделена, который позволяет различную гибкость для элементов рендеринга / компоновки.
Таким образом, элементы модели, примером которых является экземпляр Table
, ничего не знают об их позиции или размере. Вызов table.getHeight
приводит к null
, потому что у table
не было ранее установленного свойства HEIGHT
.
Чтобы вычислить высоту таблицы, нужно было бы использовать функциональность рендеринга.
Для элемента модели вы можете получить поддерево визуализаторов, представляющих этот элемент модели, и все его дочерние элементы, а layout
- в любой заданной области. Чтобы действительно знать высоту таблицы, вы хотели бы создать область, которая сознательно будет достаточной для размещения всего содержимого элемента.
PdfDocument pdfDoc = ...
Document doc = ...
Table table = new Table(2)
.addCell(new Cell().add(new Paragraph("cell 1, 1")))
.addCell(new Cell().add(new Paragraph("cell 1, 2")));
LayoutResult result = table.createRendererSubTree().setParent(doc.getRenderer()).layout(
new LayoutContext(new LayoutArea(1, new Rectangle(0, 0, 400, 1e4f))));
System.out.println(result.getOccupiedArea().getBBox().getHeight());
Вышеприведенный код печатает 22.982422O
для меня, но результаты могут меняться в зависимости от конфигурации и свойств элементов.
Я хотел бы указать две важные части кода:
1e4f
как высота LayoutArea
, учитывая, что этого будет достаточно, чтобы поместить всю таблицу. Обратите внимание: если таблица не может быть помещена на эту высоту, результат никогда не будет превышать эту заданную высоту, и, следовательно, она не будет корректной для вашей usecase (знайте общую высоту таблицы). Поэтому обязательно пропустите высоту, которая будет достаточной для размещения всей таблицы. .setParent(doc.getRenderer())
часть важна здесь и используется для извлечения наследуемых свойств. Обратите внимание, что мы не задали много свойств для элемента table
, даже шрифта, но эта информация необходима, чтобы знать область, в которой этот элемент будет занимать. Таким образом, эта информация будет наследоваться от родительской цепочки во время layout
. Вы можете проверить это, изменив шрифт документа: document.setFont(newFont);
или размер шрифта: document.setFontSize(24);
и просмотрев результирующее изменение высоты Вы можете просто использовать FindControl
на Master
LinkButton lb = Master.FindControl("LinkButton1") as LinkButton;
lb.Text = "LinkButton Master";
Вы можете попытаться переместить код в событии Page_Load главной страницы в событие, которое вызывается после события button_click. Таким образом, изменения в сеансе происходят до обновления главной страницы. Вы можете попробовать событие Page_LoadComplete. Пожалуйста, проверьте документацию «жизненного цикла страницы asp.net» для последовательности, в которой вызываются различные события страницы.