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