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/21 22:51:09 UTC

svn commit: r1626630 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: pdmodel/font/PDType1CFont.java pdmodel/font/PDType1Font.java rendering/font/TTFGlyph2D.java

Author: jahewson
Date: Sun Sep 21 20:51:09 2014
New Revision: 1626630

URL: http://svn.apache.org/r1626630
Log:
PDFBOX-2372: Standard 14 simple fonts should have empty .notdef glyph

Modified:
    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/rendering/font/TTFGlyph2D.java

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=1626630&r1=1626629&r2=1626630&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 Sun Sep 21 20:51:09 2014
@@ -127,7 +127,16 @@ public class PDType1CFont extends PDSimp
     @Override
     public GeneralPath getPath(String name) throws IOException
     {
-        return type1Equivalent.getPath(name);
+        // Adobe's Standard 14 fonts have an empty .notdef glyph, but Microsoft's don't
+        // so we need to fake this glyph otherwise we get unwanted rectangles, see PDFBOX-2372
+        if (".notdef".equals(name) && isStandard14())
+        {
+            return new GeneralPath();
+        }
+        else
+        {
+            return type1Equivalent.getPath(name);
+        }
     }
 
     @Override

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=1626630&r1=1626629&r2=1626630&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 Sun Sep 21 20:51:09 2014
@@ -440,6 +440,15 @@ public class PDType1Font extends PDSimpl
     @Override
     public GeneralPath getPath(String name) throws IOException
     {
-        return type1Equivalent.getPath(name);
+        // Adobe's Standard 14 fonts have an empty .notdef glyph, but Microsoft's don't
+        // so we need to fake this glyph otherwise we get unwanted rectangles, see PDFBOX-2372
+        if (".notdef".equals(name) && isStandard14())
+        {
+            return new GeneralPath();
+        }
+        else
+        {
+            return type1Equivalent.getPath(name);
+        }
     }
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java?rev=1626630&r1=1626629&r2=1626630&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java Sun Sep 21 20:51:09 2014
@@ -21,9 +21,12 @@ package org.apache.pdfbox.rendering.font
 import java.awt.geom.AffineTransform;
 import java.awt.geom.GeneralPath;
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 
+import java.util.Set;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.fontbox.ttf.GlyphData;
@@ -105,6 +108,25 @@ public class TTFGlyph2D implements Glyph
         }
     }
 
+    // todo: HACK!
+    private static Set<String> STANDARD_14 = new HashSet<String>();
+    static
+    {
+        // standard 14 names
+        STANDARD_14.addAll(Arrays.asList(
+                "Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique", "Helvetica",
+                "Helvetica-Bold", "Helvetica-Oblique", "Helvetica-BoldOblique", "Times-Roman",
+                "Times-Bold", "Times-Italic", "Times-BoldItalic", "Symbol", "ZapfDingbats"
+        ));
+        // alternative names from Adobe Supplement to the ISO 32000
+        STANDARD_14.addAll(Arrays.asList(
+                "CourierCourierNew", "CourierNew", "CourierNew,Italic", "CourierNew,Bold",
+                "CourierNew,BoldItalic", "Arial", "Arial,Italic", "Arial,Bold", "Arial,BoldItalic",
+                "TimesNewRoman", "TimesNewRoman,Italic", "TimesNewRoman,Bold", "TimesNewRoman,BoldItalic"
+        ));
+    }
+
+
     /**
      * Returns the path describing the glyph for the given glyphId.
      *
@@ -122,7 +144,31 @@ public class TTFGlyph2D implements Glyph
         }
         else
         {
+            if (gid == 0 || gid >= ttf.getMaximumProfile().getNumGlyphs())
+            {
+                if (isCIDFont)
+                {
+                    int cid = ((PDType0Font) font).codeToCID(code);
+                    String cidHex = String.format("%04x", cid);
+                    LOG.warn("No glyph for " + code + " (CID " + cidHex + ") in font " +
+                            font.getName());
+                }
+                else
+                {
+                    LOG.warn("No glyph for " + code + " in font " + font.getName());
+                }
+            }
+
+            // ------
+
             GlyphData glyph = ttf.getGlyph().getGlyph(gid);
+
+            // todo: MEGA HACK! (for CIDFont "known") - sort of works (width issues?)
+            if (gid == 0 && !font.isEmbedded() && STANDARD_14.contains(font.getName()))
+            {
+                glyph = null;
+            }
+
             if (glyph == null)
             {
                 // empty glyph (e.g. space, newline)
@@ -131,21 +177,6 @@ public class TTFGlyph2D implements Glyph
             }
             else
             {
-                if (gid == 0 || gid >= ttf.getMaximumProfile().getNumGlyphs())
-                {
-                    if (isCIDFont)
-                    {
-                        int cid = ((PDType0Font) font).codeToCID(code);
-                        String cidHex = String.format("%04x", cid);
-                        LOG.warn("No glyph for " + code + " (CID " + cidHex + ") in font " +
-                                font.getName());
-                    }
-                    else
-                    {
-                        LOG.warn("No glyph for " + code + " in font " + font.getName());
-                    }
-                }
-
                 glyphPath = glyph.getPath();
                 if (hasScaling)
                 {