You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2015/11/19 20:04:50 UTC

svn commit: r1715241 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/state/SetLineDashPattern.java

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);
     }