Author: tilman
Date: Wed Sep  2 18:01:42 2026
New Revision: 1937787

Log:
PDFBOX-2941: avoid exceptions

Modified:
   
pdfbox/branches/2.0/debugger/src/main/java/org/apache/pdfbox/debugger/flagbitspane/PanoseFlag.java

Modified: 
pdfbox/branches/2.0/debugger/src/main/java/org/apache/pdfbox/debugger/flagbitspane/PanoseFlag.java
==============================================================================
--- 
pdfbox/branches/2.0/debugger/src/main/java/org/apache/pdfbox/debugger/flagbitspane/PanoseFlag.java
  Wed Sep  2 17:57:33 2026        (r1937786)
+++ 
pdfbox/branches/2.0/debugger/src/main/java/org/apache/pdfbox/debugger/flagbitspane/PanoseFlag.java
  Wed Sep  2 18:01:42 2026        (r1937787)
@@ -17,11 +17,18 @@
 
 package org.apache.pdfbox.debugger.flagbitspane;
 
+import java.util.Arrays;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSString;
 import org.apache.pdfbox.pdmodel.font.PDPanose;
 import org.apache.pdfbox.pdmodel.font.PDPanoseClassification;
+import org.apache.pdfbox.util.Hex;
 
 /**
  * @author Khyrul Bashar
@@ -29,9 +36,9 @@ import org.apache.pdfbox.pdmodel.font.PD
  */
 class PanoseFlag extends Flag
 {
+    private static final Log LOG = LogFactory.getLog(PanoseFlag.class);
 
     private final byte[] bytes;
-    private final COSString byteValue;
 
     /**
      * Constructor.
@@ -39,8 +46,21 @@ class PanoseFlag extends Flag
      */
     PanoseFlag(COSDictionary dictionary)
     {
-        byteValue = (COSString) dictionary.getDictionaryObject(COSName.PANOSE);
-        bytes = byteValue.getBytes();
+        COSBase base = dictionary.getDictionaryObject(COSName.PANOSE);
+        if (base instanceof COSString)
+        {
+            byte[] tmp = ((COSString) base).getBytes();
+            if (tmp.length != PDPanose.LENGTH)
+            {
+                LOG.warn("Panose string length adjusted");
+            }
+            bytes = Arrays.copyOf(tmp, PDPanose.LENGTH);
+        }
+        else
+        {
+            LOG.error("Panose string missing");
+            bytes = new byte[PDPanose.LENGTH];
+        }
     }
 
     @Override
@@ -52,7 +72,7 @@ class PanoseFlag extends Flag
     @Override
     String getFlagValue()
     {
-        return "Panose byte :" + byteValue.toHexString();
+        return "Panose byte: " + Hex.getString(bytes);
     }
 
     @Override
@@ -93,29 +113,34 @@ class PanoseFlag extends Flag
 
     private String getSerifStyleValue(int index)
     {
-        return new String[]{
-                "Any",
-                "No Fit",
-                "Cove",
-                "Obtuse Cove",
-                "Square Cove",
-                "Obtuse Square Cove",
-                "Square",
-                "Thin",
-                "Oval",
-                "Exaggerated",
-                "Triangle",
-                "Normal Sans",
-                "Obtuse Sans",
-                "Perpendicular Sans",
-                "Flared",
-                "Rounded"
-        }[index];
+        String[] values = new String[]{
+            "Any",
+            "No Fit",
+            "Cove",
+            "Obtuse Cove",
+            "Square Cove",
+            "Obtuse Square Cove",
+            "Square",
+            "Thin",
+            "Oval",
+            "Exaggerated",
+            "Triangle",
+            "Normal Sans",
+            "Obtuse Sans",
+            "Perpendicular Sans",
+            "Flared",
+            "Rounded"
+        };
+        if (index >= values.length)
+        {
+            return "invalid value";
+        }
+        return values[index];
     }
 
     private String getWeightValue(int index)
     {
-        return new String[]{
+        String[] values = new String[]{
                 "Any",
                 "No Fit",
                 "Very Light",
@@ -128,12 +153,17 @@ class PanoseFlag extends Flag
                 "Heavy",
                 "Black",
                 "Extra Black"
-        }[index];
+        };
+        if (index >= values.length)
+        {
+            return "invalid value";
+        }
+        return values[index];
     }
 
     private String getProportionValue(int index)
     {
-        return new String[]{
+        String[] values = new String[]{
                 "Any",
                 "No fit",
                 "Old Style",
@@ -144,12 +174,17 @@ class PanoseFlag extends Flag
                 "Very Extended",
                 "Very Condensed",
                 "Monospaced"
-        }[index];
+        };
+        if (index >= values.length)
+        {
+            return "invalid value";
+        }
+        return values[index];
     }
 
     private String getContrastValue(int index)
     {
-        return new String[]{
+        String[] values = new String[]{
                 "Any",
                 "No Fit",
                 "None",
@@ -160,12 +195,17 @@ class PanoseFlag extends Flag
                 "Medium High",
                 "High",
                 "Very High"
-        }[index];
+        };
+        if (index >= values.length)
+        {
+            return "invalid value";
+        }
+        return values[index];
     }
 
     private String getStrokeVariationValue(int index)
     {
-        return new String[]{
+        String[] values = new String[]{
                 "Any",
                 "No Fit",
                 "No Variation",
@@ -177,12 +217,17 @@ class PanoseFlag extends Flag
                 "Rapid/Horizontal",
                 "Instant/Vertical",
                 "Instant/Horizontal",
-        }[index];
+        };
+        if (index >= values.length)
+        {
+            return "invalid value";
+        }
+        return values[index];
     }
 
     private String getArmStyleValue(int index)
     {
-        return new String[]{
+        String[] values = new String[]{
                 "Any",
                 "No Fit",
                 "Straight Arms/Horizontal",
@@ -195,12 +240,17 @@ class PanoseFlag extends Flag
                 "Non-Straight/Vertical",
                 "Non-Straight/Single Serif",
                 "Non-Straight/Double Serif",
-        }[index];
+        };
+        if (index >= values.length)
+        {
+            return "invalid value";
+        }
+        return values[index];
     }
 
     private String getLetterformValue(int index)
     {
-        return new String[]{
+        String[] values = new String[]{
                 "Any",
                 "No Fit",
                 "Normal/Contact",
@@ -217,12 +267,17 @@ class PanoseFlag extends Flag
                 "Oblique/Rounded",
                 "Oblique/Off Center",
                 "Oblique/Square",
-        }[index];
+        };
+        if (index >= values.length)
+        {
+            return "invalid value";
+        }
+        return values[index];
     }
 
     private String getMidlineValue(int index)
     {
-        return new String[]{
+        String[] values = new String[]{
                 "Any",
                 "No Fit",
                 "Standard/Trimmed",
@@ -237,12 +292,17 @@ class PanoseFlag extends Flag
                 "Low/Trimmed",
                 "Low/Pointed",
                 "Low/Serifed"
-        }[index];
+        };
+        if (index >= values.length)
+        {
+            return "invalid value";
+        }
+        return values[index];
     }
 
     private String getXHeightValue(int index)
     {
-        return new String[]{
+        String[] values = new String[]{
                 "Any",
                 "No Fit",
                 "Constant/Small",
@@ -251,6 +311,11 @@ class PanoseFlag extends Flag
                 "Ducking/Small",
                 "Ducking/Standard",
                 "Ducking/Large",
-        }[index];
+        };
+        if (index >= values.length)
+        {
+            return "invalid value";
+        }
+        return values[index];
     }
 }

Reply via email to