Skip to content

Instantly share code, notes, and snippets.

@vandeseer
Created February 6, 2020 17:03
Show Gist options
  • Save vandeseer/5023d55b67c455596b2703e4a65df2d9 to your computer and use it in GitHub Desktop.
Save vandeseer/5023d55b67c455596b2703e4a65df2d9 to your computer and use it in GitHub Desktop.
Using easytable to draw rectangles within cells
package org.vandeseer.integrationtest.custom;
import lombok.Getter;
import lombok.SneakyThrows;
import lombok.experimental.SuperBuilder;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.vandeseer.easytable.TableDrawer;
import org.vandeseer.easytable.drawing.Drawer;
import org.vandeseer.easytable.drawing.DrawingContext;
import org.vandeseer.easytable.drawing.DrawingUtil;
import org.vandeseer.easytable.drawing.PositionedRectangle;
import org.vandeseer.easytable.drawing.cell.AbstractCellDrawer;
import org.vandeseer.easytable.structure.Row;
import org.vandeseer.easytable.structure.Table;
import org.vandeseer.easytable.structure.cell.AbstractCell;
import org.vandeseer.easytable.structure.cell.TextCell;
import java.awt.*;
import java.awt.geom.Point2D;
import java.io.IOException;
import static org.apache.pdfbox.pdmodel.font.PDType1Font.HELVETICA;
public class CustomRectanglesCellDrawer {
public static final float COLUMN_WIDTH = 50f;
@SuperBuilder
@Getter
private static class RectanglesCell extends AbstractCell {
private static final float RECTANGLE_HEIGHT = 20f;
private float someValue;
private Color someColor;
private float someOtherValue;
private Color someOtherColor;
@Override
public float getMinHeight() {
return RECTANGLE_HEIGHT + getVerticalPadding();
}
@Override
protected Drawer createDefaultDrawer() {
return new RectanglesCellAbstractCellDrawer(this);
}
private class RectanglesCellAbstractCellDrawer extends AbstractCellDrawer<RectanglesCell> {
public RectanglesCellAbstractCellDrawer(RectanglesCell rectanglesCell) {
this.cell = rectanglesCell;
}
@SneakyThrows
@Override
public void drawContent(DrawingContext drawingContext) {
final PDPageContentStream contentStream = drawingContext.getContentStream();
final Point2D.Float start = drawingContext.getStartingPoint();
final float rowHeight = cell.getRow().getHeight();
final float y = rowHeight < cell.getHeight()
? start.y + rowHeight - cell.getHeight()
: start.y;
// Actual
DrawingUtil.drawRectangle(contentStream,
PositionedRectangle.builder()
.x(start.x + cell.getPaddingLeft())
.y(y + cell.getPaddingBottom())
.width(cell.getWidth() - cell.getHorizontalPadding())
.height(RECTANGLE_HEIGHT * someValue)
.color(cell.getSomeColor()).build()
);
// Unused
DrawingUtil.drawRectangle(contentStream,
PositionedRectangle.builder()
.x(start.x + cell.getPaddingLeft())
.y(y + cell.getPaddingBottom() + RECTANGLE_HEIGHT * someValue)
.width(cell.getWidth() - cell.getHorizontalPadding())
.height(RECTANGLE_HEIGHT * someOtherValue)
.color(cell.getSomeOtherColor()).build()
);
}
@Override
protected float calculateInnerHeight() {
return RECTANGLE_HEIGHT;
}
}
}
public static void main(String[] args) throws IOException {
try(final PDDocument document = new PDDocument()) {
final PDPage page = new PDPage(PDRectangle.A4);
document.addPage(page);
try (final PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
TableDrawer.builder()
.contentStream(contentStream)
.table(createSimpleTable())
.startX(50)
.startY(page.getMediaBox().getHeight() - 50)
.build()
.draw();
}
document.save("target/customCellDrawerWithRectangles.pdf");
}
}
private static Table createSimpleTable() {
return Table.builder()
.addColumnsOfWidth(COLUMN_WIDTH, COLUMN_WIDTH, COLUMN_WIDTH, COLUMN_WIDTH, COLUMN_WIDTH, COLUMN_WIDTH, COLUMN_WIDTH)
.fontSize(8)
.font(HELVETICA)
.addRow(Row.builder()
.add(TextCell.builder().borderWidth(1).text("MON").build())
.add(TextCell.builder().borderWidth(1).text("TUE").build())
.add(TextCell.builder().borderWidth(1).text("WED").build())
.add(TextCell.builder().borderWidth(1).text("THU").build())
.add(TextCell.builder().borderWidth(1).text("FRI").build())
.add(TextCell.builder().borderWidth(1).text("SAT").build())
.add(TextCell.builder().borderWidth(1).text("SUN").build())
.build())
.addRow(Row.builder()
.add(RectanglesCell.builder().borderWidth(1).someColor(Color.GRAY).someValue(0.2f).someOtherColor(Color.BLUE).someOtherValue(0.8f).build())
.add(RectanglesCell.builder().borderWidth(1).someColor(Color.GRAY).someValue(0.3f).someOtherColor(Color.BLUE).someOtherValue(0.7f).build())
.add(RectanglesCell.builder().borderWidth(1).someColor(Color.GRAY).someValue(0.1f).someOtherColor(Color.BLUE).someOtherValue(0.9f).build())
.add(RectanglesCell.builder().borderWidth(1).someColor(Color.GRAY).someValue(0.45f).someOtherColor(Color.BLUE).someOtherValue(0.55f).build())
.add(RectanglesCell.builder().borderWidth(1).someColor(Color.GRAY).someValue(0.45f).someOtherColor(Color.BLUE).someOtherValue(0.55f).build())
.add(RectanglesCell.builder().borderWidth(1).someColor(Color.GRAY).someValue(0.45f).someOtherColor(Color.BLUE).someOtherValue(0.55f).build())
.add(RectanglesCell.builder().borderWidth(1).someColor(Color.GRAY).someValue(0.2f).someOtherColor(Color.BLUE).someOtherValue(0.8f).build())
.build())
.build();
}
}
@vikramtambe
Copy link

Thanks for quick response. When I am trying to create the same class in my env. I am getting below errors.

Implicit super constructor AbstractCell() is undefined for default constructor. Must define an explicit constructor

The method builder() is undefined for the type CustomRectanglesCellDrawer.RectanglesCell

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment