过去在iText中使用渐变没有问题,突然我遇到了问题,即它无法正常工作,并将范围缩小到这次我在横向环境中工作(实际上是PageSize.A4.rotate())。rotation()会发生某些事情,导致渐变无法按预期工作(对我来说)。
为了说明,我改编了粉红色蓝色三角形的示例http://developers.itextpdf.com/question/how-add-shading-pattern-custom-shape
public class GradientProblem {
public static void main(String[] args) throws FileNotFoundException, DocumentException {
Document doc = new Document(PageSize.A4);
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(new File("gradientProblem.pdf")));
doc.open();
drawSexyTriangle(writer);
doc.setPageSize(PageSize.A4.rotate());
doc.newPage();
drawSexyTriangle(writer);
doc.close();
}
private static void drawSexyTriangle(PdfWriter writer) {
PdfContentByte canvas = writer.getDirectContent();
float x = 36;
float y = 400;
float side = 70;
PdfShading axial = PdfShading.simpleAxial(writer, x, y, x + side, y, BaseColor.PINK, BaseColor.BLUE);
PdfShadingPattern shading = new PdfShadingPattern(axial);
canvas.setShadingFill(shading);
canvas.moveTo(x,y);
canvas.lineTo(x + side, y);
canvas.lineTo(x + (side / 2), (float)(y + (side * Math.sin(Math.PI / 3))));
canvas.closePathFillStroke();
}
}
请注意,第一页上三角形的阴影为粉红色-蓝色,而第二张旋转页上的阴影为蓝色。
显而易见的解决方法是构造适当的页面大小而无需旋转。
但是,使用rotate()似乎是建议的方法,当我在可重复使用的表或单元格事件中深入使用渐变代码时,我真的不知道页面的构造方式(或者我不知道该如何构造)如何?)
任何提示或见解将不胜感激。
PS:尝试过iText 5.5.8和5.5.9
问题是,尽管itext内容添加功能确实考虑了页面旋转(它们平移给定坐标,以便在旋转的页面中x右移,y向上并且原点在左下方),阴影图案定义(这是不是页面内容的一部分,但外部定义)没有。
因此,您必须使明暗定义旋转可见,例如,如下所示:
Document doc = new Document(PageSize.A4);
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(new File(RESULT_FOLDER, "gradientProblem.pdf")));
doc.open();
drawSexyTriangle(writer, false);
doc.setPageSize(PageSize.A4.rotate());
doc.newPage();
drawSexyTriangle(writer, true);
doc.close();
和
private static void drawSexyTriangle(PdfWriter writer, boolean rotated)
{
PdfContentByte canvas = writer.getDirectContent();
float x = 36;
float y = 400;
float side = 70;
PdfShading axial = rotated ?
PdfShading.simpleAxial(writer, PageSize.A4.getRight() - y, x, PageSize.A4.getRight() - y, x + side, BaseColor.PINK, BaseColor.BLUE)
: PdfShading.simpleAxial(writer, x, y, x + side, y, BaseColor.PINK, BaseColor.BLUE);
PdfShadingPattern shading = new PdfShadingPattern(axial);
canvas.setShadingFill(shading);
canvas.moveTo(x,y);
canvas.lineTo(x + side, y);
canvas.lineTo(x + (side / 2), (float)(y + (side * Math.sin(Math.PI / 3))));
canvas.closePathFillStroke();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句