iText渐变问题在景观中

时间:2016-08-22 06:06:54

标签: itext

过去在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()似乎是建议的方法,当我在可重复使用的表格或单元格事件内部有渐变代码时,我真的不知道页面是如何构建的(或者我可以,我只是穿上不知道怎么办?)

非常感谢任何提示或见解。

PS:尝试过iText 5.5.8和5.5.9

1 个答案:

答案 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();
}

DrawGradient.java