In this example you’ll see how to add Image
to a Table
when creating a PDF document using iText 8. We start by finding the image resource using getResource()
method and pass the absolute path to the resource name. The getResource()
method return a java.net.URL
object.
With this URL
object in hand we then create the ImageData
object using the ImageDataFactory.create()
method. To the create()
factory method we pass the URL
object as a parameter. Finally, we create the Image
object by calling the constructor of this class and passes the ImageData
object as a parameter.
Here is the complete code snippet. Below we create a Premier League Ladder table showing club current position from position 1 to 10.
package org.kodejava.itext;
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.colors.DeviceGray;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.borders.Border;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.properties.TextAlignment;
import com.itextpdf.layout.properties.UnitValue;
import com.itextpdf.layout.properties.VerticalAlignment;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import static com.itextpdf.kernel.colors.DeviceGray.makeLighter;
public class TableExample {
public static void main(String[] args) throws Exception {
TableExample demo = new TableExample();
demo.createTable();
}
private void createTable() throws Exception {
String destination = "premier-league-ladder.pdf";
PdfWriter writer = new PdfWriter(destination);
PdfDocument pdf = new PdfDocument(writer);
String[] headers = {"Position", "Club", "Played", "Won", "Drown", "Lost", "GF", "GA", "GD", "Points"};
try (Document document = new Document(pdf)) {
Table table = new Table(headers.length + 1);
// Set table width to span the entire page
table.setWidth(UnitValue.createPercentValue(100));
URL plLogoFile = TableExample.class.getResource("/epl/pl-main-logo.png");
ImageData plImageData = ImageDataFactory.create(Objects.requireNonNull(plLogoFile));
table.addHeaderCell(new Cell().setBorder(Border.NO_BORDER)
.add(new Image(plImageData).scaleToFit(50, 50)));
table.addHeaderCell(new Cell(1, 11).setBorder(Border.NO_BORDER)
.setVerticalAlignment(VerticalAlignment.MIDDLE)
.add(new Paragraph("Premier League Ladder").setFontSize(16).setBold()));
for (String header : headers) {
if (header.equals("Club")) {
table.addHeaderCell(new Cell(1, 2)
.setBackgroundColor(makeLighter(DeviceGray.GRAY))
.setBorderLeft(Border.NO_BORDER).setBorderRight(Border.NO_BORDER)
.setWidth(UnitValue.createPercentValue(28))
.add(new Paragraph(header)));
} else {
table.addHeaderCell(newCell()
.setBackgroundColor(makeLighter(DeviceGray.GRAY))
.setWidth(UnitValue.createPercentValue(8))
.add(new Paragraph(header).setTextAlignment(TextAlignment.CENTER)));
}
}
int position = 1;
for (Club club : getTableData()) {
String fileName = club.name().replace(' ', '_').toLowerCase() + ".png";
URL logoFile = TableExample.class.getResource("/epl/logo/" + fileName);
ImageData imageData = ImageDataFactory.create(Objects.requireNonNull(logoFile));
table.addCell(newCell().add(newCenteredParagraph(String.valueOf(position++))));
table.addCell(newCell().setWidth(UnitValue.createPercentValue(1))
.setVerticalAlignment(VerticalAlignment.MIDDLE)
.add(new Image(imageData).scaleAbsolute(16, 16)));
table.addCell(newCell().setWidth(UnitValue.createPercentValue(27))
.add(new Paragraph(club.name())));
table.addCell(newCell().add(newCenteredParagraph(String.valueOf(club.played()))));
table.addCell(newCell().add(newCenteredParagraph(String.valueOf(club.won()))));
table.addCell(newCell().add(newCenteredParagraph(String.valueOf(club.drawn()))));
table.addCell(newCell().add(newCenteredParagraph(String.valueOf(club.lost()))));
table.addCell(newCell().add(newCenteredParagraph(String.valueOf(club.goalsFor()))));
table.addCell(newCell().add(newCenteredParagraph(String.valueOf(club.goalsAgainst()))));
table.addCell(newCell().add(newCenteredParagraph(String.valueOf(club.goalDifference()))));
table.addCell(newCell().add(newCenteredParagraph(String.valueOf(club.points()))));
}
document.add(table);
} catch (Exception e) {
e.printStackTrace();
}
}
private Cell newCell() {
return new Cell().setBorderLeft(Border.NO_BORDER).setBorderRight(Border.NO_BORDER);
}
private Paragraph newCenteredParagraph(String text) {
return new Paragraph(text).setTextAlignment(TextAlignment.CENTER);
}
private List<Club> getTableData() {
List<Club> clubs = new ArrayList<>();
clubs.add(new Club("Arsenal", 20, 4, 4, 70, 24));
clubs.add(new Club("Liverpool", 19, 6, 2, 64, 25));
clubs.add(new Club("Man City", 19, 5, 3, 62, 27));
clubs.add(new Club("Aston Villa", 17, 4, 6, 59, 37));
clubs.add(new Club("Tottenham", 15, 5, 6, 55, 39));
clubs.add(new Club("Man United", 15, 2, 11, 39, 39));
clubs.add(new Club("West Ham", 12, 6, 9, 43, 47));
clubs.add(new Club("Wolves", 12, 5, 11, 42, 44));
clubs.add(new Club("Newcastle", 12, 4, 11, 57, 45));
clubs.add(new Club("Brighton", 10, 9, 8, 49, 44));
return clubs;
}
record Club(String name, int won, int drawn, int lost, int goalsFor, int goalsAgainst) {
public int played() {
return won + drawn + lost;
}
public int goalDifference() {
return goalsFor - goalsAgainst;
}
public int points() {
return (won * 3) + drawn;
}
}
}
And here is the output of the generated PDF table:
In the example above you can also see how to expand the width of the table to take the full width of the page.
table.setWidth(UnitValue.createPercentValue(100));
To span a table Cell
to take multiple columns you can create a Cell
object and specify the rowspan
and colspan
parameter.
table.addHeaderCell(new Cell(1, 2));
To remove the vertical border of the Cell
you can set the left and right border by calling the setBorderLeft()
and setBorderRight()
method and passes Border.NO_BORDER
as parameter.
new Cell().setBorderLeft(Border.NO_BORDER).setBorderRight(Border.NO_BORDER);
The data of the table is encapsulated using a record
, this feature is introduced in Java 14, prior to this version you will create a simple POJO, which is a Java object with properties and related getters and setters method.
public record Club(String name, int won, int drawn, int lost, int goalsFor, int goalsAgainst) {}
Maven Dependencies
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-core</artifactId>
<version>8.0.3</version>
<type>pom</type>
</dependency>