Author: vfed
Date: Sun Mar 14 20:49:00 2010
New Revision: 922955

URL: http://svn.apache.org/viewvc?rev=922955&view=rev
Log:
PDFBOX-660: applying FontMatrix scale factors to PDFont drawing operations

Modified:
    pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
    pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java

Modified: pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java?rev=922955&r1=922954&r2=922955&view=diff
==============================================================================
--- pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java 
(original)
+++ pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java Sun 
Mar 14 20:49:00 2010
@@ -33,6 +33,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDResources;
+import org.apache.pdfbox.pdmodel.common.PDMatrix;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.font.PDFont;
 import org.apache.pdfbox.pdmodel.graphics.PDGraphicsState;
@@ -176,6 +177,8 @@ public class PageDrawer extends PDFStrea
             textPos.setValue(0, 1, (-1)*textPos.getValue(0, 1));
             textPos.setValue(1, 0, (-1)*textPos.getValue(1, 0));
             AffineTransform at = textPos.createAffineTransform();
+            PDMatrix fontMatrix = font.getFontMatrix();
+            at.scale(fontMatrix.getValue(0, 0) * 1000f, fontMatrix.getValue(1, 
0) * 1000f);
             graphics.setClip(getGraphicsState().getCurrentClippingPath());
             font.drawString( text.getCharacter(), graphics, 
text.getFontSize(), at, x, y );
         }

Modified: 
pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java?rev=922955&r1=922954&r2=922955&view=diff
==============================================================================
--- pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java 
(original)
+++ pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java 
Sun Mar 14 20:49:00 2010
@@ -49,16 +49,19 @@ import org.apache.fontbox.cff.encoding.C
 import org.apache.fontbox.cff.CFFFont;
 import org.apache.fontbox.cff.CFFParser;
 import org.apache.fontbox.cff.Type1FontFormatter;
+import org.apache.fontbox.util.BoundingBox;
 
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSFloat;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSNumber;
 import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.encoding.Encoding;
 import org.apache.pdfbox.encoding.EncodingManager;
 import org.apache.pdfbox.exceptions.WrappedIOException;
+import org.apache.pdfbox.pdmodel.common.PDMatrix;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 
 /**
@@ -88,6 +91,8 @@ public class PDType1CFont extends PDSimp
 
     private PDRectangle fontBBox = null;
 
+    private PDMatrix fontMatrix = null;
+
     private static final Log log = LogFactory.getLog(PDType1CFont.class);
 
     private static final byte[] SPACE_BYTES = {(byte)32};
@@ -255,7 +260,33 @@ public class PDType1CFont extends PDSimp
     /**
      * {...@inheritdoc}
      */
-    public void drawString( String string, Graphics g, float fontSize, 
AffineTransform at, float x, float y ) 
+    public PDMatrix getFontMatrix()
+    {
+        if( this.fontMatrix == null )
+        {
+            List<Number> numbers = 
(List<Number>)this.cffFont.getProperty("FontMatrix");
+            if( numbers != null && numbers.size() == 6 )
+            {
+                COSArray array = new COSArray();
+                for(Number number : numbers)
+                {
+                    array.add(new COSFloat(number.floatValue()));
+                }
+                this.fontMatrix = new PDMatrix(array);
+            }
+            else
+            {
+                this.fontMatrix = super.getFontMatrix();
+            }
+        }
+
+        return this.fontMatrix;
+    }
+
+    /**
+     * {...@inheritdoc}
+     */
+    public void drawString( String string, Graphics g, float fontSize, 
AffineTransform at, float x, float y )
         throws IOException
     {
         Graphics2D g2d = (Graphics2D)g;
@@ -482,7 +513,19 @@ public class PDType1CFont extends PDSimp
             AFMParser afmParser = new AFMParser(is);
             afmParser.parse();
 
-           return afmParser.getResult();
+            FontMetric result = afmParser.getResult();
+
+            // Replace default FontBBox value with a newly computed one
+            BoundingBox bounds = result.getFontBBox();
+            List<Integer> numbers = Arrays.asList(
+                    Integer.valueOf((int)bounds.getLowerLeftX()),
+                    Integer.valueOf((int)bounds.getLowerLeftY()),
+                    Integer.valueOf((int)bounds.getUpperRightX()),
+                    Integer.valueOf((int)bounds.getUpperRightY())
+                );
+            font.addValueToTopDict("FontBBox", numbers);
+
+            return result;
         }
         finally
         {


Reply via email to