Index: pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java
===================================================================
--- pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java	(revision 1467802)
+++ pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java	(working copy)
@@ -21,14 +21,14 @@
 import java.awt.FontFormatException;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -36,17 +36,15 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-
 import org.apache.fontbox.afm.AFMParser;
 import org.apache.fontbox.afm.FontMetric;
 import org.apache.fontbox.cff.AFMFormatter;
-import org.apache.fontbox.cff.charset.CFFCharset;
-import org.apache.fontbox.cff.encoding.CFFEncoding;
 import org.apache.fontbox.cff.CFFFont;
 import org.apache.fontbox.cff.CFFParser;
 import org.apache.fontbox.cff.Type1FontFormatter;
+import org.apache.fontbox.cff.charset.CFFCharset;
+import org.apache.fontbox.cff.encoding.CFFEncoding;
 import org.apache.fontbox.util.BoundingBox;
-
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
@@ -92,7 +90,9 @@
     private static final byte[] SPACE_BYTES = {(byte)32};
 
     private COSDictionary fontDict = null;
-    
+
+    private Map<Integer, Integer> codeToGlyph = new HashMap<Integer, Integer>();
+
     /**
      * Constructor.
      * @param fontDictionary the corresponding dictionary
@@ -234,6 +234,9 @@
         return (Integer)this.characterToCode.get(character);
     }
 
+    protected Integer getGlyphIndex(int code) {
+        return codeToGlyph.get(code);
+    }
 
     /**
      * {@inheritDoc}
@@ -339,10 +342,10 @@
         }
 
         CFFEncoding encoding = this.cffFont.getEncoding();
-        PDFEncoding pdfEncoding = new PDFEncoding(encoding);
+        PDFEncoding pdfEncoding = new PDFEncoding();
 
         CFFCharset charset = this.cffFont.getCharset();
-        PDFCharset pdfCharset = new PDFCharset(charset);
+        PDFCharset pdfCharset = new PDFCharset();
 
         Map<String,byte[]> charStringsDict = this.cffFont.getCharStringsDict();
         Map<String,byte[]> pdfCharStringsDict = new LinkedHashMap<String,byte[]>();
@@ -369,6 +372,14 @@
             String name = (String)entry.getValue();
             if(knownNames.contains(name))
             {
+                for (Iterator<Map.Entry<Integer, String>> iter = codeToNameMap.entrySet().iterator(); iter
+                        .hasNext();) {
+                    Map.Entry<Integer, String> existingEntry = iter.next();
+                    if (existingEntry.getValue().equals(name)) {
+                        iter.remove();
+                        break;
+                    }
+                }
                 codeToNameMap.put(code, name);
             }
         }
@@ -386,30 +397,20 @@
             throw new RuntimeException(e);
         }
 
+        int glyphIndex = 0;
         for( Iterator<Map.Entry<Integer,String>> it = (codeToNameMap.entrySet()).iterator(); it.hasNext();)
         {
             Map.Entry<Integer,String> entry = it.next();
             Integer code = (Integer)entry.getKey();
             String name = (String)entry.getValue();
-            String uniName = "uni";
-            String character = (String)nameToCharacter.get(name);
-            if( character != null )
-            {
-                for( int j = 0; j < character.length(); j++ )
-                {
-                    uniName += hexString(character.charAt(j), 4);
-                }
-            }
-            else
-            {
-                uniName += hexString(code.intValue(), 4);
-                character = String.valueOf((char)code.intValue());
-            }
+            String uniName = "uni" + hexString(code.intValue(), 4);
+            String character = String.valueOf((char) code.intValue());
             pdfEncoding.register(code.intValue(), code.intValue());
             pdfCharset.register(code.intValue(), uniName);
             this.codeToName.put(code, uniName);
             this.codeToCharacter.put(code, character);
             this.characterToCode.put(character, code);
+            this.codeToGlyph.put(code, glyphIndex++);
             pdfCharStringsDict.put(uniName, charStringsDict.get(name));
         }
 
@@ -477,7 +478,29 @@
             COSArray differences = (COSArray)encodingDic.getDictionaryObject(COSName.DIFFERENCES);
             if( differences != null )
             {
-                result.putAll(loadDifferences(differences));
+                Map<Integer, String> diffs = loadDifferences(differences);
+                if (baseName == null) {
+                    result.putAll(diffs);
+                } else {
+                    Set<String> knownNames = new HashSet<String>(result.values());
+                    for (Iterator<Map.Entry<Integer, String>> it = (diffs.entrySet()).iterator(); it
+                            .hasNext();) {
+                        Map.Entry<Integer, String> entry = it.next();
+                        Integer code = (Integer) entry.getKey();
+                        String name = (String) entry.getValue();
+                        if (knownNames.contains(name)) {
+                            for (Iterator<Map.Entry<Integer, String>> iter = result.entrySet()
+                                    .iterator(); iter.hasNext();) {
+                                Map.Entry<Integer, String> existingEntry = iter.next();
+                                if (existingEntry.getValue().equals(name)) {
+                                    iter.remove();
+                                    break;
+                                }
+                            }
+                        }
+                        result.put(code, name);
+                    }
+                }
             }
         }
 
@@ -526,7 +549,7 @@
     
     private static String hexString( int code, int length )
     {
-        String string = Integer.toHexString(code);
+        String string = Integer.toHexString(code).toUpperCase();
         while(string.length() < length)
         {
             string = ("0" + string);
@@ -600,6 +623,9 @@
             }
         }
 
+        private PDFEncoding() {
+        }
+
         public boolean isFontSpecific()
         {
             return true;
@@ -622,11 +648,13 @@
             }
         }
 
+        private PDFCharset() {
+        }
+
         public boolean isFontSpecific()
         {
             return true;
         }
 
     }
-
 }
Index: pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java
===================================================================
--- pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java	(revision 1467802)
+++ pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java	(working copy)
@@ -23,17 +23,14 @@
 import java.awt.font.FontRenderContext;
 import java.awt.font.GlyphVector;
 import java.awt.geom.AffineTransform;
-import java.awt.geom.Point2D;
 import java.awt.geom.NoninvertibleTransformException;
+import java.awt.geom.Point2D;
 import java.io.IOException;
-
 import java.util.HashMap;
 
-import org.apache.fontbox.afm.FontMetric;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-
+import org.apache.fontbox.afm.FontMetric;
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
@@ -43,7 +40,6 @@
 import org.apache.pdfbox.encoding.DictionaryEncoding;
 import org.apache.pdfbox.encoding.Encoding;
 import org.apache.pdfbox.encoding.EncodingManager;
-
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.util.ResourceLoader;
 
@@ -141,6 +137,9 @@
                 awtFont = Font.decode(null).deriveFont(1f);
             }
             glyphs = awtFont.createGlyphVector(frc, string);
+            if (isType1Font()) {
+                glyphs = remapGlyphs(glyphs, string);
+            }
         }
         Graphics2D g2d = (Graphics2D)g;
         g2d.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
@@ -547,4 +546,7 @@
         return fontWidthOfSpace;
     }
 
+    protected GlyphVector remapGlyphs(GlyphVector gv, String s) {
+        return gv;
+    }
 }
Index: pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java
===================================================================
--- pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java	(revision 1467802)
+++ pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java	(working copy)
@@ -18,9 +18,11 @@
 
 import java.awt.Font;
 import java.awt.FontFormatException;
+import java.awt.font.GlyphVector;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.lang.reflect.Field;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.StringTokenizer;
@@ -419,7 +421,7 @@
     @Override
     public String encode(byte[] c, int offset, int length) throws IOException
     {
-        if (type1CFont != null && getFontEncoding() == null)
+        if (type1CFont != null /* && getFontEncoding() == null */)
         {
             return type1CFont.encode(c, offset, length);
         }
@@ -454,4 +456,32 @@
             return super.getFontMatrix();
         }
     }
+
+    // this is used to fix an apparent bug with the sun jdk where the mapping of
+    // character code to glyph index done by native code is wrong; this does not happen with openjdk
+    protected GlyphVector remapGlyphs(GlyphVector gv, String s) {
+        try {
+            Field fGlyphs = gv.getClass().getDeclaredField("glyphs");
+            fGlyphs.setAccessible(true);
+            int[] glyphs = (int[]) fGlyphs.get(gv);
+            Field fuserGlyphs = gv.getClass().getDeclaredField("userGlyphs");
+            fuserGlyphs.setAccessible(true);
+            int[] userGlyphs = (int[]) fuserGlyphs.get(gv);
+            if (glyphs.length == 1 && glyphs[0] != 65535) {
+                return gv;
+            }
+            for (int j = 0; j < glyphs.length; j++) {
+                if (glyphs[j] == 65535) {
+                    if (type1CFont != null) {
+                        int c = (int) s.charAt(j);
+                        glyphs[j] = type1CFont.getGlyphIndex(c);
+                        userGlyphs[j] = type1CFont.getGlyphIndex(c);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return gv;
+    }
 }
