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/09/02 01:48:16 UTC

svn commit: r1621900 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: pdmodel/font/ rendering/

Author: jahewson
Date: Mon Sep  1 23:48:16 2014
New Revision: 1621900

URL: http://svn.apache.org/r1621900
Log:
PDFBOX-870: Stretch external glyphs to match embedded widths

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java?rev=1621900&r1=1621899&r2=1621900&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java Mon Sep  1 23:48:16 2014
@@ -225,7 +225,7 @@ public abstract class PDFont implements 
      * @return width in glyph space
      * @throws IOException if the font could not be read
      */
-    protected abstract float getWidthFromFont(int code) throws IOException;
+    public abstract float getWidthFromFont(int code) throws IOException;
 
     /**
      * Returns true if the font file is embedded in the PDF.

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java?rev=1621900&r1=1621899&r2=1621900&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java Mon Sep  1 23:48:16 2014
@@ -174,7 +174,7 @@ public class PDTrueTypeFont extends PDSi
     }
 
     @Override
-    protected float getWidthFromFont(int code) throws IOException
+    public float getWidthFromFont(int code) throws IOException
     {
         int gid = codeToGID(code);
         float width = ttf.getAdvanceWidth(gid);

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java?rev=1621900&r1=1621899&r2=1621900&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java Mon Sep  1 23:48:16 2014
@@ -226,7 +226,7 @@ public class PDType0Font extends PDFont
     }
 
     @Override
-    protected float getWidthFromFont(int code) throws IOException
+    public float getWidthFromFont(int code) throws IOException
     {
         return descendantFont.getWidthFromFont(code);
     }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java?rev=1621900&r1=1621899&r2=1621900&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java Mon Sep  1 23:48:16 2014
@@ -182,10 +182,10 @@ public class PDType1CFont extends PDSimp
     }
 
     @Override
-    protected float getWidthFromFont(int code) throws IOException
+    public float getWidthFromFont(int code) throws IOException
     {
         String name = codeToName(code);
-        int width = cffFont.getType1CharString(name).getWidth();
+        float width = type1Equivalent.getWidth(name);
 
         Point2D p = new Point2D.Float(width, 0);
         fontMatrixTransform.transform(p, p);

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java?rev=1621900&r1=1621899&r2=1621900&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java Mon Sep  1 23:48:16 2014
@@ -285,7 +285,7 @@ public class PDType1Font extends PDSimpl
     }
 
     @Override
-    protected float getWidthFromFont(int code) throws IOException
+    public float getWidthFromFont(int code) throws IOException
     {
         String name = codeToName(code);
         if (afm != null)

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java?rev=1621900&r1=1621899&r2=1621900&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java Mon Sep  1 23:48:16 2014
@@ -106,7 +106,7 @@ public class PDType3Font extends PDSimpl
     }
 
     @Override
-    protected float getWidthFromFont(int code)
+    public float getWidthFromFont(int code)
     {
        // todo: could these be extracted from the font's stream?
        throw new UnsupportedOperationException("not suppported");

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java?rev=1621900&r1=1621899&r2=1621900&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java Mon Sep  1 23:48:16 2014
@@ -365,7 +365,7 @@ public class PageDrawer extends PDFGraph
         {
             // all other fonts use vectors
             Glyph2D glyph2D = createGlyph2D(font);
-            drawGlyph2D(glyph2D, code, at);
+            drawGlyph2D(glyph2D, font, code, displacement, at);
         }
     }
 
@@ -373,11 +373,14 @@ public class PageDrawer extends PDFGraph
      * Render the font using the Glyph2D interface.
      * 
      * @param glyph2D the Glyph2D implementation provided a GeneralPath for each glyph
+     * @param font the font
      * @param code character code
+     * @param displacement the glyph's displacement (advance)
      * @param at the transformation
      * @throws IOException if something went wrong
      */
-    private void drawGlyph2D(Glyph2D glyph2D, int code, AffineTransform at) throws IOException
+    private void drawGlyph2D(Glyph2D glyph2D, PDFont font, int code, Vector displacement,
+                             AffineTransform at) throws IOException
     {
         PDGraphicsState state = getGraphicsState();
         RenderingMode renderingMode = state.getTextState().getRenderingMode();
@@ -385,6 +388,19 @@ public class PageDrawer extends PDFGraph
         GeneralPath path = glyph2D.getPathForCharacterCode(code);
         if (path != null)
         {
+            // stretch non-embedded glyph if it does not match the width contained in the PDF
+            if (!font.isEmbedded())
+            {
+                float fontWidth = font.getWidthFromFont(code);
+                if (fontWidth > 0 && // ignore spaces
+                        Math.abs(fontWidth - displacement.getX() * 1000) > 0.0001)
+                {
+                    float pdfWidth = displacement.getX() * 1000;
+                    at.scale(pdfWidth / fontWidth, 1);
+                }
+            }
+
+            // render glyph
             Shape glyph = at.createTransformedShape(path);
 
             if (renderingMode.isFill())