Search code examples
itext7

How to set and/or retrieve default cell padding in iText 7


When you create a table in iText 7 using the Table and Cell classes, the table cells come with some padding built in by default. As far as I can tell by looking at a generated document, it appears to be about 2 PDF units.

Is there any way I can retrieve this value for use in calculations? Also, is there any way I can change this default, so that I can set my own padding to be used in all cells in all tables, instead of having to set it individually on every cell?


Solution

  • Please take a look at the iText 7: Building Blocks tutorial.

    In the Before we start section, we see that every building block is derived from a class named ElementPropertyContainer. This class is a container of properties.

    In the case of the Cell class, there is a set of properties that define the padding. You can get these properties the generic way (using a method of the AbstractElement class) like this:

    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));
    

    But why make it difficult if you can also simply use convenience methods that is available in the BlockElement class:

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

    As you can see in the tutorial, the Cell class is a subclass of the BlockElement class. The BlockElement is a subclass of the AbstractElement class. The AbstractElement class is a subclass of the ElementPropertyContainer class.

    If you want to change the padding (or the margin if you are so inclined), please read chapter 5 of that tutorial. It has an example, named 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();
    }
    

    This is what it looks like:

    enter image description here

    I'm sorry if it hurts the eyes a bit, but using those colors seemed like the best way to explain the difference between the margin and the padding to me.

    Most of the properties are inherited. For instance: if you set the font for a Div, that font will be the default font for all the elements added to that Div. There are some exceptions though. The padding is one of them. This is how the default values for the properties specific to the Cell class were defined:

    @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);
        }
    }
    

    As you can see, there is no padding value for the complete cell; the padding consists of four values that incidentally are identical by default.

    If you don't like to define a padding different from the default for each Cell, just create a subclass of Cell and call it MyCustomCell. Make it custom in the sense that it uses the padding of your choice by overriding the getDefaultProperty() class.

    In the tutorial, you'll find an example of a subclass that draws cells with borders that have rounded corners so that we don't have to set declare a renderer every time we want to introduce rounder corners.

    I am the original author of that documentation. I hope you find it useful to answer these and other questions about the Cell and other objects in iText 7.