Author: tilman
Date: Tue Apr 15 14:58:58 2025
New Revision: 1925095

URL: http://svn.apache.org/viewvc?rev=1925095&view=rev
Log:
PDFBOX-5987: preprocess DIV commands

Modified:
    
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/cff/CharStringCommand.java
    
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharString.java

Modified: 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/cff/CharStringCommand.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/cff/CharStringCommand.java?rev=1925095&r1=1925094&r2=1925095&view=diff
==============================================================================
--- 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/cff/CharStringCommand.java
 (original)
+++ 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/cff/CharStringCommand.java
 Tue Apr 15 14:58:58 2025
@@ -47,6 +47,8 @@ public class CharStringCommand
             .getInstance(Key.HSBW.hashValue);
     public static final CharStringCommand COMMAND_CALLOTHERSUBR = 
CharStringCommand
             .getInstance(Key.CALLOTHERSUBR.hashValue);
+    public static final CharStringCommand COMMAND_DIV = CharStringCommand
+            .getInstance(Key.DIV.hashValue);
 
     private static final int KEY_UNKNOWN = 99;
     private static final CharStringCommand COMMAND_UNKNOWN = new 
CharStringCommand(KEY_UNKNOWN, 0);

Modified: 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharString.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharString.java?rev=1925095&r1=1925094&r2=1925095&view=diff
==============================================================================
--- 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharString.java
 (original)
+++ 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharString.java
 Tue Apr 15 14:58:58 2025
@@ -75,8 +75,42 @@ public class Type2CharString extends Typ
     private void convertType1ToType2(List<Object> sequence)
     {
         pathCount = 0;
+
+        // PDFBOX-5987: the sequence contains several "num denom DIV" 
sequences whose results are used
+        // for further operations. However the converter only handles direct 
arguments properly,
+        // not arguments that are created at runtime on the stack. It's not 
possible to fix this
+        // by just copying the command codes because addAlternatingCurve / 
addCurve require
+        // switching the sequence of arguments.
+        // The solution below just replaces all "num denom DIV" sequences with 
its result.
+        // If more files with even more complex sequences appear we will have 
to get rid of the
+        // converter and implement a complete renderer like with type1 
charstrings.
+        List<Object> newSequence = new ArrayList<>(sequence.size());
+        for (int i = 0; i < sequence.size(); ++i)
+        {
+            if (CharStringCommand.COMMAND_DIV.equals(sequence.get(i)) && i >= 
2)
+            {
+                Object num = sequence.get(i - 2);
+                Object den = sequence.get(i - 1);
+                if (num instanceof Number && den instanceof Number)
+                {
+                    float f = ((Number) num).floatValue() / ((Number) 
den).floatValue();
+                    newSequence.remove(newSequence.size() - 1);
+                    newSequence.remove(newSequence.size() - 1);
+                    newSequence.add(f);
+                }
+                else
+                {
+                    newSequence.add(sequence.get(i)); // GIGO
+                }
+            }
+            else
+            {
+                newSequence.add(sequence.get(i));
+            }
+        }
+
         List<Number> numbers = new ArrayList<>();
-        sequence.forEach(obj -> {
+        newSequence.forEach(obj -> {
             if (obj instanceof CharStringCommand)
             {
                 List<Number> results = convertType2Command(numbers, 
(CharStringCommand) obj);


Reply via email to