Created
February 6, 2020 17:03
-
-
Save vandeseer/5023d55b67c455596b2703e4a65df2d9 to your computer and use it in GitHub Desktop.
Using easytable to draw rectangles within cells
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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