[英]How to draw a filled rectangle in PDFBox?
如何使用 PDFBox 繪制實心矩形?
我只是找不到PDFBox API 文檔的正確功能。
我想在表格的第一行下繪制一個實心矩形:
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;
}
}
這是在 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;
var color = Color.BLUE;
var rect = new java.awt.Rectangle(startX, startY, width, height);
// Draw a blue filled rectangle
drawRect(content, color, rect , true);
在 PDPageContentStream 中有一個叫做fillRect的方法可以解決這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.