2013-05-09 2 views
3

Как нарисовать заполненный прямоугольник с помощью PDFBox?Как нарисовать заполненный прямоугольник в PDFBox?

Я просто не могу найти правильную функцию PDFBox API documentation.

Я хочу, чтобы нарисовать прямоугольник с заливкой под первой строки таблицы:

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; 
} 
} 

ответ

1

Существует метод, называемый fillRect в PDPageContentStream, что делает трюк.

4

Это, как вы можете нарисовать прямоугольник в 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(); 
    } 
} 

Используйте это так:

int startX = 20; 
int startY = 30; 
int width = 40; 
int height = 50; 
Color color = Color.BLUE; 
// Draw a blue filled rectangle 
drawRect(content, color, new java.awt.Rectangle(startX, startY, width, height), true);