Как избежать размещения определенного контента на странице с iText7?

В конце последней страницы я хочу напечатать подпись. Бывают ситуации, когда длина документа делает подпись и только подпись печатается на следующей странице. Нехорошо иметь целую страницу только с подписью, в то время как весь отчет находится на предыдущих страницах.

Кто-нибудь сталкивался с этими проблемами раньше и нашел рабочее решение?

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

Тутудакис Михаил

Пожалуйста, не могли бы вы показать, что вы уже написали? Не могли бы вы немного расширить «Я пытался сделать это с помощью заголовков, но не смог заставить его работать правильно. Я исправил это для определенного отчета, но в разных отчетах с разной длиной смещение было ужасным»?

Uladzimir Asipchuk 24.01.2019 11:49

Что касается вашей второй проблемы: какое поведение было бы для вас желательным? Если вы не можете разместить подпись на последней странице (и вам нужно создать новую), хотите ли вы переместить некоторый контент на следующую страницу вместе с подписью?

Uladzimir Asipchuk 24.01.2019 11:49

Да, перемещение некоторого контента было бы самым простым решением, но как я могу узнать, что на последней странице существуют только подписи?

mixtou 24.01.2019 12:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
386
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что касается вашего второго вопроса, рассмотрите возможность использования методов 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 (как в упомянутых примерах). Тем не менее, это похоже на другой вопрос.

Div с setKeepTogether(true) работал как шарм, не позволяя печатать подписи в одиночку на пустой странице. Однако я все еще борюсь с первой из своих проблем... Я опубликую дополнительную информацию, как только попробую образцы, которые вы упомянули выше. Большое спасибо.

mixtou 28.01.2019 14:08

Я прочитал примеры, которые вы упомянули, но мой заголовок представляет собой абзац с графикой или контейнер Div с текстом и изображениями. Примеры относятся только к тексту, и я еще не понял, как можно импортировать Div или Paragraph в pdfCanvas. Какие-либо предложения??

mixtou 29.01.2019 11:27

Поскольку это отдельный вопрос, не могли бы вы создать новый тикет для этой проблемы? У меня тоже есть решение, но я просто не хочу, чтобы этот ответ запутался.

Uladzimir Asipchuk 29.01.2019 13:15

Я уже ответил на него. Что касается этого вопроса: пожалуйста, примите ответ, если он вас устраивает

Uladzimir Asipchuk 30.01.2019 14:29

Другие вопросы по теме