Как установить и/или получить заполнение ячеек по умолчанию в iText 7

Когда вы создаете таблицу в iText 7, используя классы Table и Cell, ячейки таблицы по умолчанию имеют встроенные отступы. Насколько я могу судить по сгенерированному документу, он составляет около 2 единиц PDF.

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


person Dan King    schedule 17.08.2016    source источник


Ответы (3)


Ознакомьтесь с руководством по iText 7: Building Blocks.

В разделе прежде чем мы начнем мы видим, что каждый стандартный блок является производным от класса с именем ElementPropertyContainer. Этот класс является контейнером свойств.

В случае класса Cell существует набор свойств, определяющих заполнение. Вы можете получить эти свойства общим способом (используя метод класса AbstractElement) следующим образом:

System.out.println(cell.getProperty(Property.PADDING_LEFT));
System.out.println(cell.getProperty(Property.PADDING_RIGHT));
System.out.println(cell.getProperty(Property.PADDING_TOP));
System.out.println(cell.getProperty(Property.PADDING_BOTTOM));

Но зачем усложнять, если можно просто использовать удобные методы, доступные в классе BlockElement:

System.out.println(cell.getPaddingLeft());
System.out.println(cell.getPaddingRight());
System.out.println(cell.getPaddingTop());
System.out.println(cell.getPaddingBottom());

Как вы можете видеть в учебнике, класс Cell является подклассом класса BlockElement. BlockElement является подклассом класса AbstractElement. Класс AbstractElement является подклассом класса ElementPropertyContainer.

Если вы хотите изменить отступы (или поля, если хотите), прочтите глава 5 этого руководства. В нем есть пример с именем CellMarginPadding. :

public void createPdf(String dest) throws IOException {
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    Document document = new Document(pdf);
    Table table = new Table(new float[]{2, 1, 1});
    table.setBackgroundColor(Color.ORANGE);
    table.setWidthPercent(80);
    table.setHorizontalAlignment(HorizontalAlignment.CENTER);
    table.addCell(
        new Cell(1, 3).add("Cell with colspan 3")
            .setPadding(10).setMargin(5).setBackgroundColor(Color.GREEN));
    table.addCell(new Cell(2, 1).add("Cell with rowspan 2")
        .setMarginTop(5).setMarginBottom(5).setPaddingLeft(30)
        .setFontColor(Color.WHITE).setBackgroundColor(Color.BLUE));
    table.addCell(new Cell().add("row 1; cell 1")
        .setFontColor(Color.WHITE).setBackgroundColor(Color.RED));
    table.addCell(new Cell().add("row 1; cell 2"));
    table.addCell(new Cell().add("row 2; cell 1").setMargin(10)
        .setFontColor(Color.WHITE).setBackgroundColor(Color.RED));
    table.addCell(new Cell().add("row 2; cell 2").setPadding(10)
        .setFontColor(Color.WHITE).setBackgroundColor(Color.RED));
    document.add(table);
    document.close();
}

Вот как это выглядит:

введите описание изображения здесь

Извините, если это немного режет глаза, но использование этих цветов показалось мне лучшим способом объяснить разницу между полем и отступом.

Большинство свойств передается по наследству. Например: если вы установите шрифт для Div, этот шрифт будет шрифтом по умолчанию для всех элементов, добавленных к этому Div. Однако есть некоторые исключения. Прокладка — одна из них. Вот как были определены значения по умолчанию для свойств, специфичных для класса Cell:

@Override
public <T1> T1 getDefaultProperty(int property) {
    switch (property) {
        case Property.BORDER:
            return (T1) (Object) DEFAULT_BORDER;
        case Property.PADDING_BOTTOM:
        case Property.PADDING_LEFT:
        case Property.PADDING_RIGHT:
        case Property.PADDING_TOP:
            return (T1) (Object) 2f;
        default:
            return super.<T1>getDefaultProperty(property);
    }
}

Как видите, для всей ячейки нет значения заполнения; заполнение состоит из четырех значений, которые, кстати, идентичны по умолчанию.

Если вы не хотите определять заполнение, отличное от значения по умолчанию для каждого Cell, просто создайте подкласс Cell и назовите его MyCustomCell. Сделайте его настраиваемым в том смысле, что он использует заполнение по вашему выбору, переопределив класс getDefaultProperty().

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

Я являюсь автором этой документации. Надеюсь, вам будет полезно ответить на эти и другие вопросы о Cell и других объектах в iText 7.

person Bruno Lowagie    schedule 17.08.2016
comment
Извините, Бруно, но это не ответ на мой вопрос. Я специально попросил способ установить заполнение ячейки по умолчанию без необходимости устанавливать его индивидуально для каждой ячейки. Я также попросил способ получить значение по умолчанию, но getPaddingLeft() (или что-то еще) не возвращает это - вместо этого он возвращает ноль, если я не установил его сам, хотя сгенерированный PDF ясно показывает, что заполнение по умолчанию что-то похожее на 2 единицы. Если я явно установлю его на 0, то это неявное заполнение исчезнет. - person Dan King; 17.08.2016
comment
Я только что видел ваше редактирование, которое пытается ответить на вторую часть моего вопроса, хотя я немного разочарован тем, что мне нужно создать подкласс Cell, чтобы сделать это, и что, похоже, нет никакого способа получить доступ или изменить неявное значение по умолчанию? - person Dan King; 17.08.2016
comment
И я привел пример подкласса Cell, в котором нет необходимости устанавливать средство визуализации для каждой ячейки. Вы также, кажется, не понимаете, что по умолчанию нет заполнения для поля. Заполнение состоит из четырех значений, которые могут быть идентичными (это то, что вы предполагаете), но не обязательно должны быть идентичными. - person Bruno Lowagie; 17.08.2016
comment
Вы говорите, что отступа по умолчанию нет, но если это так, не могли бы вы объяснить, откуда берется отступ вокруг ячейки, который я ясно вижу в своем сгенерированном документе и который исчезает, когда я явно устанавливаю отступ на ноль? - person Dan King; 17.08.2016
comment
Вы опять не прочитали то, что я сказал. Я сказал: по умолчанию для поля нет отступов. Существует четыре разных значения по умолчанию: по одному для каждой стороны коробки. Я обновлю свой ответ. - person Bruno Lowagie; 17.08.2016
comment
Ах, так это жестко закодировано в методе getDefaultProperty(), поэтому я не могу получить к нему доступ и не могу переопределить его для всех ячеек (только для моих собственных пользовательских подклассов ячеек)? - person Dan King; 17.08.2016
comment
Единственный другой вариант определения значения по умолчанию — использование переменной-члена static, но это опасно, не так ли? Когда вы меняете его в одном месте, он меняется везде. Это может вызвать нежелательные побочные эффекты. - person Bruno Lowagie; 17.08.2016
comment
Зная, насколько проще использовать iText 7 по сравнению с iText 5, я не понимаю, почему вы делаете из этого такую ​​проблему. - person Bruno Lowagie; 17.08.2016
comment
Когда вы меняете его в одном месте, он меняется везде - ну, это вообще точка дефолта, как бы вы его не реализовали! iText 7 имеет много хороших функций, и я не сравниваю его с iText 5 или чем-то еще. Я просто думаю, что это немного неприятно, что он устанавливает параметры в моем макете для меня, к которым у меня нет доступа или контроля, кроме как путем подкласса фреймворка. - person Dan King; 17.08.2016
comment
Ваше последнее редактирование ответило на один из моих вопросов - я могу получить доступ к этому значению, используя (например) getDefaultProperty(Property.PADDING_LEFT), что означает, что теперь я могу использовать это значение в своих расчетах - так что спасибо за это! - person Dan King; 18.08.2016

Я сделал это на С# для маршрута переопределения @Bruno Lowagie, чтобы установить значение по умолчанию без заполнения и без границы:

public class BorderlessCell : Cell
    {
        public BorderlessCell(int rowSpan, int colSpan) : base(rowSpan, colSpan) { }
        public BorderlessCell() : base() { }
        public override T1 GetDefaultProperty<T1>(int property) 
        {
            switch (property) 
            {
                case Property.BORDER:
                    return (T1)(Object)(Border.NO_BORDER);
                case Property.PADDING_BOTTOM:
                case Property.PADDING_LEFT:
                case Property.PADDING_RIGHT:
                case Property.PADDING_TOP:
                   return (T1)(Object)(0);
                default:
                    return base.GetDefaultProperty<T1>(property);
            }
        }
    }
person Daniel F. Salazar    schedule 23.09.2016

Для меня работает редактирование WidthPercentage, например:

table.setWidthPercentage(100)
person carlonchoboy    schedule 25.06.2021