Skip to content

Commit 34efacb

Browse files
introfogiText-CI
authored andcommitted
Fix NullPointerException in AbstractRenderer class and update createXObject method
DEVSIX-4138
1 parent fffd9ce commit 34efacb

File tree

2 files changed

+70
-14
lines changed

2 files changed

+70
-14
lines changed

layout/src/main/java/com/itextpdf/layout/renderer/AbstractRenderer.java

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ This file is part of the iText (R) project.
4949
import com.itextpdf.kernel.PdfException;
5050
import com.itextpdf.kernel.colors.Color;
5151
import com.itextpdf.kernel.colors.gradients.AbstractLinearGradientBuilder;
52-
import com.itextpdf.kernel.colors.gradients.StrategyBasedLinearGradientBuilder;
5352
import com.itextpdf.kernel.font.PdfFont;
5453
import com.itextpdf.kernel.geom.AffineTransform;
5554
import com.itextpdf.kernel.geom.Point;
@@ -538,7 +537,8 @@ public void drawBackground(DrawContext drawContext) {
538537
// for gradient uses width and height = 1. For all othe cases the logic left as it was.
539538
Rectangle imageRectangle;
540539
if (backgroundXObject == null) {
541-
backgroundXObject = createXObject(backgroundImage.getLinearGradientBuilder(), backgroundArea, drawContext.getDocument());
540+
backgroundXObject = AbstractRenderer.createXObject(backgroundImage.getLinearGradientBuilder(),
541+
backgroundArea, drawContext.getDocument());
542542
imageRectangle = new Rectangle(backgroundArea.getX(), backgroundArea.getTop() - backgroundXObject.getHeight(),1, 1);
543543
} else {
544544
imageRectangle = new Rectangle(backgroundArea.getX(), backgroundArea.getTop() - backgroundXObject.getHeight(),
@@ -575,20 +575,26 @@ public void drawBackground(DrawContext drawContext) {
575575
}
576576
}
577577

578-
public PdfFormXObject createXObject(AbstractLinearGradientBuilder linearGradientBuilder,
578+
/**
579+
* Create a {@link PdfFormXObject} with the given area and containing a linear gradient inside.
580+
*
581+
* @param linearGradientBuilder the linear gradient builder
582+
* @param xObjectArea the result object area
583+
* @param document the pdf document
584+
* @return the xObject with a specified area and a linear gradient
585+
*/
586+
public static PdfFormXObject createXObject(AbstractLinearGradientBuilder linearGradientBuilder,
579587
Rectangle xObjectArea, PdfDocument document) {
580-
if (linearGradientBuilder == null) {
581-
return null;
582-
}
583588
Rectangle formBBox = new Rectangle(0, 0, xObjectArea.getWidth(), xObjectArea.getHeight());
584-
PdfFormXObject xObject = null;
585-
Color gradientColor = linearGradientBuilder.buildColor(formBBox, null);
586-
if (gradientColor != null) {
587-
xObject = new PdfFormXObject(formBBox);
588-
new PdfCanvas(xObject, document)
589-
.setColor(gradientColor, true)
590-
.rectangle(formBBox)
591-
.fill();
589+
PdfFormXObject xObject = new PdfFormXObject(formBBox);
590+
if (linearGradientBuilder != null) {
591+
Color gradientColor = linearGradientBuilder.buildColor(formBBox, null);
592+
if (gradientColor != null) {
593+
new PdfCanvas(xObject, document)
594+
.setColor(gradientColor, true)
595+
.rectangle(formBBox)
596+
.fill();
597+
}
592598
}
593599
return xObject;
594600
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.itextpdf.layout.renderer;
2+
3+
import com.itextpdf.io.source.ByteArrayOutputStream;
4+
import com.itextpdf.kernel.colors.ColorConstants;
5+
import com.itextpdf.kernel.colors.gradients.AbstractLinearGradientBuilder;
6+
import com.itextpdf.kernel.colors.gradients.GradientColorStop;
7+
import com.itextpdf.kernel.colors.gradients.GradientColorStop.OffsetType;
8+
import com.itextpdf.kernel.colors.gradients.StrategyBasedLinearGradientBuilder;
9+
import com.itextpdf.kernel.geom.Rectangle;
10+
import com.itextpdf.kernel.pdf.PdfDocument;
11+
import com.itextpdf.kernel.pdf.PdfName;
12+
import com.itextpdf.kernel.pdf.PdfWriter;
13+
import com.itextpdf.kernel.pdf.xobject.PdfXObject;
14+
import com.itextpdf.test.ExtendedITextTest;
15+
import com.itextpdf.test.annotations.type.UnitTest;
16+
17+
import org.junit.Assert;
18+
import org.junit.Test;
19+
import org.junit.experimental.categories.Category;
20+
21+
@Category(UnitTest.class)
22+
public class AbstractRendererTest extends ExtendedITextTest {
23+
@Test
24+
public void createXObjectTest() {
25+
AbstractLinearGradientBuilder gradientBuilder = new StrategyBasedLinearGradientBuilder()
26+
.setGradientDirectionAsStrategy(StrategyBasedLinearGradientBuilder.GradientStrategy.TO_BOTTOM_LEFT)
27+
.addColorStop(new GradientColorStop(ColorConstants.RED.getColorValue(), 0d, OffsetType.RELATIVE))
28+
.addColorStop(new GradientColorStop(ColorConstants.GREEN.getColorValue(), 0.5, OffsetType.RELATIVE));
29+
30+
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
31+
PdfXObject pdfXObject = AbstractRenderer.createXObject(gradientBuilder, new Rectangle(0, 0, 20, 20), pdfDocument);
32+
Assert.assertNotNull(pdfXObject.getPdfObject().get(PdfName.Resources));
33+
}
34+
35+
@Test
36+
public void createXObjectWithNullLinearGradientTest() {
37+
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
38+
PdfXObject pdfXObject = AbstractRenderer.createXObject(null, new Rectangle(0, 0, 20, 20), pdfDocument);
39+
Assert.assertNull(pdfXObject.getPdfObject().get(PdfName.Resources));
40+
}
41+
42+
@Test
43+
public void createXObjectWithInvalidColorTest() {
44+
AbstractLinearGradientBuilder gradientBuilder = new StrategyBasedLinearGradientBuilder();
45+
46+
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
47+
PdfXObject pdfXObject = AbstractRenderer.createXObject(gradientBuilder, new Rectangle(0, 0, 20, 20), pdfDocument);
48+
Assert.assertNull(pdfXObject.getPdfObject().get(PdfName.Resources));
49+
}
50+
}

0 commit comments

Comments
 (0)