Bashar
Bashar

Reputation: 71

Gradient stroke in PDFBox

I'm trying to draw curves with gradient stroke color not fill color using JAVA PDFbox, anyone can help me with how to do that?

For filling shapes I'm using:

contentStream.clip();
contentStream.shadingFill(PdfUtils.createGradientColor(gradientFactors));

public static PDShadingType2 createGradientColor(GradientFactors gradientFactors) throws IOException {
    Color startColor = gradientFactors.getStartColor().getColor();
    Color endColor = gradientFactors.getEndColor().getColor();

    COSDictionary fdict = new COSDictionary();

    fdict.setInt(COSName.FUNCTION_TYPE, 2);

    COSArray domain = new COSArray();
    domain.add(COSInteger.get(0));
    domain.add(COSInteger.get(1));

    COSArray c0 = new COSArray();
    c0.add(new COSFloat(startColor.getRed() / 255f));
    c0.add(new COSFloat(startColor.getGreen() / 255f));
    c0.add(new COSFloat(startColor.getBlue() / 255f));

    COSArray c1 = new COSArray();
    c1.add(new COSFloat(endColor.getRed() / 255f));
    c1.add(new COSFloat(endColor.getGreen() / 255f));
    c1.add(new COSFloat(endColor.getBlue() / 255f));

    fdict.setItem(COSName.DOMAIN, domain);
    fdict.setItem(COSName.C0, c0);
    fdict.setItem(COSName.C1, c1);
    fdict.setInt(COSName.N, 1);

    PDFunctionType2 func = new PDFunctionType2(fdict);

    PDShadingType2 axialShading = new PDShadingType2(new COSDictionary());

    axialShading.setColorSpace(PDDeviceRGB.INSTANCE);
    axialShading.setShadingType(PDShading.SHADING_TYPE2);

    COSArray coords1 = new COSArray();
    coords1.add(new COSFloat(gradientFactors.getX1()));
    coords1.add(new COSFloat(gradientFactors.getY1()));
    coords1.add(new COSFloat(gradientFactors.getX2()));
    coords1.add(new COSFloat(gradientFactors.getY2()));

    axialShading.setCoords(coords1);
    axialShading.setFunction(func);

    return axialShading;
}

Could anyone please help me with this?

Upvotes: 0

Views: 318

Answers (1)

mkl
mkl

Reputation: 95918

As already indicated by Tilman, you create a PDColor from your shading:

PDShadingType2 shading = createGradientColor(...);
PDShadingPattern pattern = new PDShadingPattern();
pattern.setShading(shading);
COSName name = page.getResources().add(pattern);
PDColor color = new PDColor(name, new PDPattern(null));

Then you draw with that color, e.g.:

try (   PDPageContentStream canvas = new PDPageContentStream(document, page)) {
    canvas.setStrokingColor(color);
    canvas.setLineWidth(5);
    canvas.moveTo(0, 0);
    canvas.lineTo(500, 500);
    canvas.curveTo2(500, 250, 250, 250);
    canvas.curveTo1(0, 250, 0, 0);
    canvas.stroke();
}

Assuming that gradient goes from red to green from 0,0 to 500,500, the result looks like this:

screen shot

(DrawGradient test testDrawWithGradientColor)

Upvotes: 2

Related Questions