过去在iText中使用了渐变而没有任何问题,我突然发现它没有工作的问题,并将其缩小到以下事实: 这次我在横向工作,(技术上是PageSize.A4.rotate())。 rotate()会阻止渐变按预期工作(由我)。
为了说明,我已经改编了粉红色 - 蓝色三角形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
答案 0 :(得分:0)
问题在于,当迭代内容添加功能执行时,会考虑页面旋转(它们会转换给定的坐标,以便在旋转的页面中 x 向右移动< em> 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();
}