Что касается вашего второго вопроса, пожалуйста, рассмотрите возможность использования setKeepTogether
или setKeepWithNext
методов.
Давайте рассмотрим любой из подходов:
1) setKeepTogether
был разработан, чтобы сохранитьдети контейнера вместе как можно больше.Это означает, что iText не будет разбивать контейнер и переместит весь контейнер на сетевую страницу, если контейнер не может быть размещен и там.
for (int i = 0; i < 28; i++) {
doc.add(new Paragraph("\n"));
}
Div div = new Div();
div.add(new Paragraph("Please, keep me with the next element").setKeepWithNext(true));
div.add(new Paragraph("I don't want to be alone!"));
div.setKeepTogether(true);
doc.add(div);
Результат pdf выглядит следующим образом (обратите внимание, что тамдостаточно места для параграфа «пожалуйста» на первой странице):
2) setKeepWithNext
предназначен для сохранения конца первого элемента и началаего следующий брат на том же месте.(!) Обратите внимание, что это будет работать только для элементов высокого уровня, то есть элементов, добавленных к корневому элементу.
for (int i = 0; i < 28; i++) {
doc.add(new Paragraph("\n"));
}
doc.add(new Paragraph("Please, keep me with the next element").setKeepWithNext(true));
doc.add(new Paragraph("I don't want to be alone!"));
Результат тот же.
Что касается вашего первого вопроса,Я действительно хочу увидеть, что вы написали.Я верю, что используя события, вы сможете достичь желаемого.Пожалуйста, обратите внимание на следующие образцы iText: https://github.com/itext/i7js-examples/tree/develop/src/test/java/com/itextpdf/samples/sandbox/events и https://github.com/itext/i7js-examples/blob/develop/src/test/java/com/itextpdf/samples/sandbox/events/VariableHeader.java в частности.
Также для более разумного макета я могу предложить вам использовать Canvas
(и, следовательно, высокий уровеньapi), а не PdfCanvas
(как в упомянутых образцах).Тем не менее, это похоже на другой вопрос.