iText 横向渐变问题
iText gradient issue in landscape
过去在 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();
}
}
请注意,第一页上三角形的阴影是粉蓝色,但在第二页上只是蓝色。
- 这是错误还是预期行为?
- 如果预期,坐标系统是如何工作的,即 simpleAxial 的 x0、y0、x1、y1 参数的真正含义是什么?
明显的解决方法是在不旋转的情况下构造适当的页面大小。
然而,使用 rotate() 似乎是建议的方法,当我在可重复使用的 table 或单元格事件中深入使用渐变代码时,我真的不知道页面是如何构建的(或可以吗,我只是不知道怎么办?)
任何提示或见解将不胜感激。
PS:试过 iText 5.5.8 和 5.5.9
问题是,虽然 itext 内容添加功能 do 考虑了页面旋转(它们转换给定的坐标,以便在旋转的页面中 x 向右,y 向上,原点在左下方),阴影图案定义(not 的一部分页面内容但在外部定义)不要.
因此,您必须使着色定义旋转感知,例如像这样:
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();
}
过去在 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();
}
}
请注意,第一页上三角形的阴影是粉蓝色,但在第二页上只是蓝色。
- 这是错误还是预期行为?
- 如果预期,坐标系统是如何工作的,即 simpleAxial 的 x0、y0、x1、y1 参数的真正含义是什么?
明显的解决方法是在不旋转的情况下构造适当的页面大小。
然而,使用 rotate() 似乎是建议的方法,当我在可重复使用的 table 或单元格事件中深入使用渐变代码时,我真的不知道页面是如何构建的(或可以吗,我只是不知道怎么办?)
任何提示或见解将不胜感激。
PS:试过 iText 5.5.8 和 5.5.9
问题是,虽然 itext 内容添加功能 do 考虑了页面旋转(它们转换给定的坐标,以便在旋转的页面中 x 向右,y 向上,原点在左下方),阴影图案定义(not 的一部分页面内容但在外部定义)不要.
因此,您必须使着色定义旋转感知,例如像这样:
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();
}