Author: tilman Date: Thu Nov 19 19:04:50 2015 New Revision: 1715241 URL: http://svn.apache.org/viewvc?rev=1715241&view=rev Log: PDFBOX-3122: avoid IllegalArgumentException if dash lengths all zero
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/state/SetLineDashPattern.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/state/SetLineDashPattern.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/state/SetLineDashPattern.java?rev=1715241&r1=1715240&r2=1715241&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/state/SetLineDashPattern.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/state/SetLineDashPattern.java Thu Nov 19 19:04:50 2015 @@ -18,11 +18,15 @@ package org.apache.pdfbox.contentstream. import java.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.pdfbox.contentstream.operator.MissingOperandException; +import org.apache.pdfbox.contentstream.operator.Operator; +import org.apache.pdfbox.contentstream.operator.OperatorProcessor; import org.apache.pdfbox.cos.COSArray; import org.apache.pdfbox.cos.COSBase; import org.apache.pdfbox.cos.COSNumber; -import org.apache.pdfbox.contentstream.operator.Operator; -import org.apache.pdfbox.contentstream.operator.OperatorProcessor; /** * d: Set the line dash pattern. @@ -31,11 +35,52 @@ import org.apache.pdfbox.contentstream.o */ public class SetLineDashPattern extends OperatorProcessor { + private static final Log LOG = LogFactory.getLog(SetLineDashPattern.class); + @Override - public void process(Operator operator, List<COSBase> arguments) + public void process(Operator operator, List<COSBase> arguments) throws MissingOperandException { - COSArray dashArray = (COSArray) arguments.get(0); - int dashPhase = ((COSNumber) arguments.get(1)).intValue(); + if (arguments.size() < 2) + { + throw new MissingOperandException(operator, arguments); + } + COSBase base0 = arguments.get(0); + if (!(base0 instanceof COSArray)) + { + return; + } + COSBase base1 = arguments.get(1); + if (!(base1 instanceof COSNumber)) + { + return; + } + COSArray dashArray = (COSArray) base0; + int dashPhase = ((COSNumber) base1).intValue(); + + boolean allZero = true; + for (COSBase base : dashArray) + { + if (base instanceof COSNumber) + { + COSNumber num = (COSNumber) base; + if (num.floatValue() != 0) + { + allZero = false; + break; + } + } + else + { + LOG.error("dash array has non number element " + base + ", ignored"); + dashArray = new COSArray(); + break; + } + } + if (dashArray.size() > 0 && allZero) + { + LOG.error("dash lengths all zero, ignored"); + dashArray = new COSArray(); + } context.setLineDashPattern(dashArray, dashPhase); }