Skip to content

Commit 8f806dd

Browse files
committed
PDFBOX-4627, PDFBOX-5054: ignore color operators in type3 charprocs with d1 or uncolored tiling patterns
git-svn-id: https://svn.apache.org/repos/asf/pdfbox/trunk@1922853 13f79535-47bb-0310-9956-ffa450edef68
1 parent 3b8fdb7 commit 8f806dd

File tree

9 files changed

+73
-10
lines changed

9 files changed

+73
-10
lines changed

pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import org.apache.pdfbox.util.Matrix;
6565
import org.apache.pdfbox.util.Vector;
6666
import org.apache.pdfbox.contentstream.operator.Operator;
67+
import org.apache.pdfbox.contentstream.operator.OperatorName;
6768
import org.apache.pdfbox.contentstream.operator.OperatorProcessor;
6869
import org.apache.pdfbox.pdmodel.graphics.blend.BlendMode;
6970

@@ -91,7 +92,10 @@ public abstract class PDFStreamEngine
9192

9293
// default font, used if there isn't any font available
9394
private PDFont defaultFont;
94-
95+
96+
// false in certain cases, e.g. type3 charprocs with d1 or uncolored tiling patterns
97+
private boolean shouldProcessColorOperators;
98+
9599
/**
96100
* Creates a new PDFStreamEngine.
97101
*/
@@ -524,18 +528,40 @@ private void processStreamOperators(PDContentStream contentStream) throws IOExce
524528
List<COSBase> arguments = new ArrayList<>();
525529
PDFStreamParser parser = new PDFStreamParser(contentStream);
526530
Object token = parser.parseNextToken();
527-
while (token != null)
531+
532+
boolean isFirstOperator = true;
533+
boolean oldShouldProcessColorOperators = shouldProcessColorOperators;
534+
shouldProcessColorOperators = true;
535+
if (contentStream instanceof PDTilingPattern &&
536+
((PDTilingPattern) contentStream).getPaintType() == PDTilingPattern.PAINT_UNCOLORED)
528537
{
529-
if (token instanceof Operator)
530-
{
531-
processOperator((Operator) token, arguments);
532-
arguments.clear();
533-
}
534-
else
538+
shouldProcessColorOperators = false;
539+
}
540+
try
541+
{
542+
while (token != null)
535543
{
536-
arguments.add((COSBase) token);
544+
if (token instanceof Operator)
545+
{
546+
if (isFirstOperator && contentStream instanceof PDType3CharProc &&
547+
OperatorName.TYPE3_D1.equals(((Operator) token).getName()))
548+
{
549+
shouldProcessColorOperators = false;
550+
}
551+
isFirstOperator = false;
552+
processOperator((Operator) token, arguments);
553+
arguments.clear();
554+
}
555+
else
556+
{
557+
arguments.add((COSBase) token);
558+
}
559+
token = parser.parseNextToken();
537560
}
538-
token = parser.parseNextToken();
561+
}
562+
finally
563+
{
564+
shouldProcessColorOperators = oldShouldProcessColorOperators;
539565
}
540566
}
541567

@@ -1144,4 +1170,9 @@ public void decreaseLevel()
11441170
LOG.error("level is {}", level);
11451171
}
11461172
}
1173+
1174+
public boolean isShouldProcessColorOperators()
1175+
{
1176+
return shouldProcessColorOperators;
1177+
}
11471178
}

pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/color/SetNonStrokingColorSpace.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ public void process(Operator operator, List<COSBase> arguments) throws IOExcepti
5353
return;
5454
}
5555
PDFStreamEngine context = getContext();
56+
if (!context.isShouldProcessColorOperators())
57+
{
58+
return;
59+
}
5660
PDColorSpace cs = context.getResources().getColorSpace((COSName) base);
5761
context.getGraphicsState().setNonStrokingColorSpace(cs);
5862
context.getGraphicsState().setNonStrokingColor(cs.getInitialColor());

pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/color/SetNonStrokingDeviceCMYKColor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ public SetNonStrokingDeviceCMYKColor(PDFStreamEngine context)
4343
public void process(Operator operator, List<COSBase> arguments) throws IOException
4444
{
4545
PDFStreamEngine context = getContext();
46+
if (!context.isShouldProcessColorOperators())
47+
{
48+
return;
49+
}
4650
PDColorSpace cs = context.getResources().getColorSpace(COSName.DEVICECMYK);
4751
context.getGraphicsState().setNonStrokingColorSpace(cs);
4852
super.process(operator, arguments);

pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/color/SetNonStrokingDeviceGrayColor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ public SetNonStrokingDeviceGrayColor(PDFStreamEngine context)
4343
public void process(Operator operator, List<COSBase> arguments) throws IOException
4444
{
4545
PDFStreamEngine context = getContext();
46+
if (!context.isShouldProcessColorOperators())
47+
{
48+
return;
49+
}
4650
PDColorSpace cs = context.getResources().getColorSpace(COSName.DEVICEGRAY);
4751
context.getGraphicsState().setNonStrokingColorSpace(cs);
4852
super.process(operator, arguments);

pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/color/SetNonStrokingDeviceRGBColor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ public SetNonStrokingDeviceRGBColor(PDFStreamEngine context)
4343
public void process(Operator operator, List<COSBase> arguments) throws IOException
4444
{
4545
PDFStreamEngine context = getContext();
46+
if (!context.isShouldProcessColorOperators())
47+
{
48+
return;
49+
}
4650
PDColorSpace cs = context.getResources().getColorSpace(COSName.DEVICERGB);
4751
context.getGraphicsState().setNonStrokingColorSpace(cs);
4852
super.process(operator, arguments);

pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/color/SetStrokingColorSpace.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ public void process(Operator operator, List<COSBase> arguments) throws IOExcepti
5353
return;
5454
}
5555
PDFStreamEngine context = getContext();
56+
if (!context.isShouldProcessColorOperators())
57+
{
58+
return;
59+
}
5660
PDColorSpace cs = context.getResources().getColorSpace((COSName) base);
5761
context.getGraphicsState().setStrokingColorSpace(cs);
5862
context.getGraphicsState().setStrokingColor(cs.getInitialColor());

pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/color/SetStrokingDeviceCMYKColor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ public SetStrokingDeviceCMYKColor(PDFStreamEngine context)
4242
public void process(Operator operator, List<COSBase> arguments) throws IOException
4343
{
4444
PDFStreamEngine context = getContext();
45+
if (!context.isShouldProcessColorOperators())
46+
{
47+
return;
48+
}
4549
PDColorSpace cs = context.getResources().getColorSpace(COSName.DEVICECMYK);
4650
context.getGraphicsState().setStrokingColorSpace(cs);
4751
super.process(operator, arguments);

pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/color/SetStrokingDeviceGrayColor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ public SetStrokingDeviceGrayColor(PDFStreamEngine context)
4343
public void process(Operator operator, List<COSBase> arguments) throws IOException
4444
{
4545
PDFStreamEngine context = getContext();
46+
if (!context.isShouldProcessColorOperators())
47+
{
48+
return;
49+
}
4650
PDColorSpace cs = context.getResources().getColorSpace(COSName.DEVICEGRAY);
4751
context.getGraphicsState().setStrokingColorSpace(cs);
4852
super.process(operator, arguments);

pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/color/SetStrokingDeviceRGBColor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ public SetStrokingDeviceRGBColor(PDFStreamEngine context)
5050
public void process(Operator operator, List<COSBase> arguments) throws IOException
5151
{
5252
PDFStreamEngine context = getContext();
53+
if (!context.isShouldProcessColorOperators())
54+
{
55+
return;
56+
}
5357
PDColorSpace cs = context.getResources().getColorSpace(COSName.DEVICERGB);
5458
context.getGraphicsState().setStrokingColorSpace(cs);
5559
super.process(operator, arguments);

0 commit comments

Comments
 (0)