How to draw a filled rectangle in PDFBox?
15,846
Solution 1
There is a method called fillRect in PDPageContentStream that does the trick.
Solution 2
This is how you can draw a rectangle in PDFBox 2:
void drawRect(PDPageContentStream content, Color color,
Rectangle rect, boolean fill) {
content.addRect(rect.x, rect.y, rect.width, rect.height);
if (fill) {
content.setNonStrokingColor(color);
content.fill();
} else {
content.setStrokingColor(color);
content.stroke();
}
}
Use it like this:
int startX = 20;
int startY = 30;
int width = 40;
int height = 50;
var color = Color.BLUE;
var rect = new java.awt.Rectangle(startX, startY, width, height);
// Draw a blue filled rectangle
drawRect(content, color, rect , true);
Comments
-
Matti Kiviharju almost 2 years
How to draw a filled rectangle using PDFBox?
I just can't find the right function of the PDFBox API documentation.
I want to draw a filled rectangle under the first row of a table:
public static void drawTable(PDPage page, PDPageContentStream contentStream, float y, float margin, String[][] content) throws IOException { final int rows = content.length; final int cols = content[0].length; final float firstRowHeight = 160f; final float rowHeight = 20f; final float colWidth = 15f; //tableWidth/(float)cols; final float tableWidth = colWidth * cols; //page.findMediaBox().getWidth()-(2*margin); final float tableHeight = rowHeight * rows + firstRowHeight - rowHeight; final float cellMargin= 5f; /*PDRectangle rectangle = new PDRectangle(); rectangle.setLowerLeftX(10); rectangle.setLowerLeftY(10); rectangle.setUpperRightX(10); rectangle.setUpperRightY(10); page.setMediaBox(rectangle); page.setCropBox(rectangle);*/ //draw the rows float nexty = y ; for (int i = 0; i <= rows; i++) { contentStream.drawLine(margin,nexty,margin+tableWidth,nexty); if (i<=0) { nexty-= firstRowHeight; } else { nexty-= rowHeight; } } //draw the columns float nextx = margin; for (int i = 0; i <= cols; i++) { contentStream.drawLine(nextx,y,nextx,y-tableHeight); nextx += colWidth; } //now add the text contentStream.setFont(PDType1Font.HELVETICA_BOLD,8); float textx = margin+cellMargin; float texty = y-15; //int o = content.length; for(int i = 0; i < content.length; i++){ for(int j = 0 ; j < content[i].length; j++){ String text = content[i][j]; contentStream.beginText(); if (i<=0) { contentStream.moveTextPositionByAmount(textx,texty-140); contentStream.setTextRotation(90*Math.PI*0.25,textx+5,texty-140); } else { contentStream.moveTextPositionByAmount(textx,texty); contentStream.setTextRotation(90*Math.PI*0.25,textx+5,texty-3); } contentStream.drawString(text); contentStream.endText(); textx += colWidth; } if (i<=0) { texty-=firstRowHeight; } else { texty-=rowHeight; } textx = margin+cellMargin; } }