You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2014/08/27 03:16:01 UTC

svn commit: r1620772 - in /pdfbox/branches/no-awt: fontbox/src/main/java/org/apache/fontbox/cff/ pdfbox/src/main/java/org/apache/pdfbox/util/

Author: jahewson
Date: Wed Aug 27 01:16:01 2014
New Revision: 1620772

URL: http://svn.apache.org/r1620772
Log:
PDFBOX-2262: Support CFF fonts with FontMatrix in wrong DICT

Modified:
    pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFCIDFont.java
    pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFFont.java
    pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFType1Font.java
    pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/util/PDFStreamEngine.java

Modified: pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFCIDFont.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFCIDFont.java?rev=1620772&r1=1620771&r2=1620772&view=diff
==============================================================================
--- pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFCIDFont.java (original)
+++ pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFCIDFont.java Wed Aug 27 01:16:01 2014
@@ -236,6 +236,21 @@ public class CFFCIDFont extends CFFFont
         return type2;
     }
 
+    @Override
+    public List<Number> getFontMatrix()
+    {
+        // some malformed CIDFonts have their FontMatrix in a Font DICT
+        if (fontDictionaries.size() > 0 && fontDictionaries.get(0).containsKey("FontMatrix"))
+        {
+            return (List<Number>)fontDictionaries.get(0).get("FontMatrix");
+        }
+        else
+        {
+            // but it should be in the Top DICT
+            return (List<Number>)topDict.get("FontMatrix");
+        }
+    }
+
     /**
      * Private implementation of Type1CharStringReader, because only CFFType1Font can
      * expose this publicly, as CIDFonts only support this for legacy 'seac' commands.

Modified: pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFFont.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFFont.java?rev=1620772&r1=1620771&r2=1620772&view=diff
==============================================================================
--- pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFFont.java (original)
+++ pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFFont.java Wed Aug 27 01:16:01 2014
@@ -31,7 +31,6 @@ import org.apache.fontbox.util.BoundingB
  */
 public abstract class CFFFont
 {
-    // todo: can we avoid protected variables and make some of these final?
     protected String fontName;
     protected final Map<String, Object> topDict = new LinkedHashMap<String, Object>();
     protected CFFCharset charset;
@@ -85,10 +84,7 @@ public abstract class CFFFont
     /**
      * Returns the FontMatrix.
      */
-    public List<Number> getFontMatrix()
-    {
-        return (List<Number>)topDict.get("FontMatrix");
-    }
+    public abstract List<Number> getFontMatrix();
 
     /**
      * Returns the FontBBox.

Modified: pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFType1Font.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFType1Font.java?rev=1620772&r1=1620771&r2=1620772&view=diff
==============================================================================
--- pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFType1Font.java (original)
+++ pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/cff/CFFType1Font.java Wed Aug 27 01:16:01 2014
@@ -78,6 +78,12 @@ public class CFFType1Font extends CFFFon
         return gid != 0;
     }
 
+    @Override
+    public List<Number> getFontMatrix()
+    {
+        return (List<Number>)topDict.get("FontMatrix");
+    }
+
     /**
      * Returns the Type 1 charstring for the given PostScript glyph name.
      *

Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/util/PDFStreamEngine.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/util/PDFStreamEngine.java?rev=1620772&r1=1620771&r2=1620772&view=diff
==============================================================================
--- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/util/PDFStreamEngine.java (original)
+++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/util/PDFStreamEngine.java Wed Aug 27 01:16:01 2014
@@ -364,20 +364,16 @@ public class PDFStreamEngine
         // Text or Disp to represent if the values are in text or disp units (no glyph units are
         // saved).
 
-        PDGraphicsState graphicsState = getGraphicsState();
+        PDGraphicsState state = getGraphicsState();
 
-        final float fontSizeText = graphicsState.getTextState().getFontSize();
-        final float horizontalScalingText = graphicsState.getTextState().getHorizontalScaling() / 100f;
-        final float riseText = graphicsState.getTextState().getRise();
-        final float wordSpacingText = graphicsState.getTextState().getWordSpacing();
-        final float characterSpacingText = graphicsState.getTextState().getCharacterSpacing();
-
-        // We won't know the actual number of characters until
-        // we process the byte data(could be two bytes each) but
-        // it won't ever be more than string.length*2(there are some cases
-        // were a single byte will result in two output characters "fi"
+        final float fontSizeText = state.getTextState().getFontSize();
+        final float horizontalScalingText = state.getTextState().getHorizontalScaling() / 100f;
+        final float riseText = state.getTextState().getRise();
+        final float wordSpacingText = state.getTextState().getWordSpacing();
+        final float characterSpacingText = state.getTextState().getCharacterSpacing();
 
-        PDFont font = graphicsState.getTextState().getFont();
+        // get the current font
+        PDFont font = state.getTextState().getFont();
         if (font == null)
         {
             LOG.warn("No current font, will use default");
@@ -387,7 +383,8 @@ public class PDFStreamEngine
         // all fonts have the width/height of a character in thousandths of a unit of text space
         float fontMatrixXScaling = 1 / 1000f;
         float fontMatrixYScaling = 1 / 1000f;
-        // expect Type3 fonts, those are providing the width of a character in glyph space units
+
+        // except Type 3 fonts, those provide the width of a character in glyph space units
         if (font instanceof PDType3Font)
         {
             Matrix fontMatrix = font.getFontMatrix();
@@ -400,7 +397,7 @@ public class PDFStreamEngine
         textStateParameters.setValue(1, 1, fontSizeText);
         textStateParameters.setValue(2, 1, riseText);
 
-        Matrix ctm = getGraphicsState().getCurrentTransformationMatrix();
+        Matrix ctm = state.getCurrentTransformationMatrix();
         Matrix textXctm = new Matrix();
         Matrix textMatrixEnd = new Matrix();
         Matrix td = new Matrix();