我在pdf中画了一个矩形。在里面我画了多行。我希望线条以不同的颜色显示。因为我已经编写了以下代码行,但它不起作用。
所有线条均以黑色显示,包括在pdf上绘制的recatngle
PdfContentByte cb = writer.getDirectContent();
try {
cb.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, true), 24);
cb.rectangle(0f,0f,842f,595f);
cb.saveState();
// Rectangle rect=new Rectangle(56.69f,56.69f,737f,510.23f);
final float bx=0f;
float bX=842f;
float by=0f;
float bY=595f;
float x=14.17f;
int count=0;
float bXX=14.17f+bx;
for(float k=0;k<842;k=k+x)
{
cb.moveTo(k+bx,by);
cb.lineTo(k+bx,bY+bx);
cb.setLineWidth(7);
cb.setColorStroke(new BaseColor(Color.BLUE));
}
for(float i=0;i<595;i=i+x)
{
cb.moveTo(bx,by+i);
cb.lineTo(bx+bX,i+by);
cb.setColorStroke(new BaseColor(Color.RED));
}
// ColumnText.showTextAligned(cb, Element.ALIGN_LEFT,new Phrase("LEAD I"), 0,(12*graphHeight), 0);
cb.restoreState();
cb.stroke();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
答案 0 :(得分:2)
在您调用stroke()
方法时,使用&#34;活动&#34;的颜色绘制所有行。在那个特定时刻。
所以,如果你这样做:
cb.setColorStroke(new BaseColor(Color.RED));
cb.moveTo(x1, y1);
cb.lineTo(x2, y2);
cb.setColorStroke(new BaseColor(Color.BLUE));
cb.moveTo(x3, y3);
cb.lineTo(x4, y4);
cb.stroke();
这是非法语法,因为一旦您开始构建路径,在更改状态之前,只允许其他路径构造操作,剪切操作和(最终)绘制操作。尽管如此,大多数PDF查看器都会容忍这样的语法错误:从x1, y1
到x2, y2
以及从x3, y3
到x4, y4
的行将以蓝色绘制,因为这样做了执行stroke
操作时的当前图形状态。
如果您希望从x1, y1
到x2, y2
的行以红色绘制,则需要插入另一个stroke()
操作:
cb.setColorStroke(new BaseColor(Color.RED));
cb.moveTo(x1, y1);
cb.lineTo(x2, y2);
cb.stroke();
cb.setColorStroke(new BaseColor(Color.BLUE));
cb.moveTo(x3, y3);
cb.lineTo(x4, y4);
cb.stroke();
在您的代码中,您的setColorStroke()
操作不会产生任何影响,因为您错误地使用了saveState()
和restoreState()
:
// you save the current graphics state: e.g. stroke color is black.
cb.saveState();
// you change the stroke color: it is now blue
cb.setColorStroke(new BaseColor(Color.BLUE));
// you return to the graphics state from before saveState:
cb.restoreState();
// the stroke color is now black again
// all changes to the graphics state after saveState() are rolled back
您应该重新组织保存和恢复图形状态的方式,并且应该在再次将这些颜色更改为其他颜色之前,以您刚刚定义的颜色绘制线条和形状。< / p>