IText 7: Как разрешить переполнение в Div?

У меня Div определенной высоты:

Div div = new Div();
div.setHeight(100);

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

WARN com.itextpdf.layout.renderer.BlockRenderer - Element content was clipped because some height properties are set.

Кроме того, опускаются строки абзаца. Хотя абзац может выходить за нижнюю границу Div, он заканчивается над рамкой.

Но, несмотря на предупреждение, мне все равно, и мне даже нужно, чтобы абзац скрытно переполнялся под нижней границей Div.

Как мне добиться такого поведения?

(CSS-эквивалент нужного мне поведения может быть достигнут установкой overflow: hidden на HTML <div>.)

«Мне даже нужно, чтобы абзац скрытно переполнялся под нижней границей Div». - что именно вы подразумеваете под «скрытым переполнением»? Следует ли продолжать печатать абзац незаметно? (Но, вероятно, с возможностью поиска?)
mkl 01.04.2018 22:14

Пользователь, вероятно, ожидал, что он будет доступен для поиска. Но это не самое главное: главная цель - чтобы пользователь увидел, что абзац находится слишком высоко. Они могут увидеть это только с первого взгляда, если абзац не усечен до целых строк. Пользователь должен видеть, что абзац пересекает нижнюю границу и продолжается ниже этой границы, хотя и незаметно. Div должен «обрезать» абзац так же, как я бы обрезал изображение в графическом редакторе. Я добавил к своему вопросу эквивалент CSS (overflow: hidden). Это то поведение, которое мне нужно.

ideaboxer 01.04.2018 23:09
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
2
1 310
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Можно ли наложить градиент с альфой на нижнюю часть div? Тогда, даже если текст обрезается на целой строке, ясно, что текст обрезается, а не только заканчивается.

Возможно, есть способ для этого, но может быть проще просто сохранить изображение для этой цели и выровнять его по нижней части div, поскольку кажется, что размер div фиксирован. Как то так (но с альфой)

Если он не исправлен, его должно быть достаточно легко для динамического создания.

Хотя это и не технический ответ, мне действительно нравится это предложение. (И да: технически возможно создать такую ​​реализацию DivRenderer.)

Bruno Lowagie 04.04.2018 09:35
Ответ принят как подходящий

Вы можете рассмотреть возможность использования специального DivRenderer для этих DIV.

Доказательство концепции:

public class OverflowHiddenDivRenderer extends DivRenderer {
    public OverflowHiddenDivRenderer(Div modelElement) {
        super(modelElement);
    }

    @Override
    public Rectangle getOccupiedAreaBBox() {
        Rectangle rectangle = super.getOccupiedAreaBBox();
        if (height != null) {
            if (rectangle.getHeight() > height.getValue()) {
                rectangle.moveUp(rectangle.getHeight() - height.getValue()).setHeight(height.getValue());
            }
        }
        return rectangle;
    }

    @Override
    public LayoutResult layout(LayoutContext layoutContext) {
        height = getPropertyAsUnitValue(Property.HEIGHT);
        deleteProperty(Property.HEIGHT);
        LayoutResult layoutResult = super.layout(layoutContext);
        LayoutArea layoutArea = layoutResult.getOccupiedArea();
        if (layoutArea != null) {
            layoutArea.setBBox(getOccupiedAreaBBox());
        }
        return layoutResult;
    }

    UnitValue height;
}

(OverflowHiddenDivRenderer)

Используя это так:

for (int height = 100; height < 150; height += 5) {
    Div div = new Div();
    div.setProperty(Property.OVERFLOW_Y, OverflowPropertyValue.HIDDEN);
    div.add(new Paragraph(height + " Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."));
    div.setHeight(height);
    div.setNextRenderer(new OverflowHiddenDivRenderer(div));
    document.add(div);
}

(RenderDivOverflowHidden тест testOverflowHiddenDivRenderer)

для Document document вы получаете

Screenshot

Будьте осторожны, хотя я уже довольно давно пользуюсь iText 7, это моя первая попытка создать собственный DivRenderer, и я, возможно, забыл о некоторых особых случаях. Я думаю, в частности, о проблемах в контексте повернутого контента (который в super.getOccupiedAreaBBox() имеет влияние) или разрывов областей (я не устанавливаю следующий рендерер в OverflowHiddenDivRenderer с адаптированной высотой).

Некоторые люди, более опытные в этом деле, могут предложить некоторые улучшения ...

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