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);
Share:
15,846
Matti Kiviharju
Author by

Matti Kiviharju

Product Owner at I4ware Software.

Updated on July 08, 2022

Comments

  • Matti Kiviharju
    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;
    }
    }