You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2011/01/23 14:52:37 UTC

svn commit: r1062427 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font: PDCIDFont.java PDFont.java PDType0Font.java

Author: lehmi
Date: Sun Jan 23 13:52:36 2011
New Revision: 1062427

URL: http://svn.apache.org/viewvc?rev=1062427&view=rev
Log:
PDFBOX-925: improved the CID encoding

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java?rev=1062427&r1=1062426&r2=1062427&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java Sun Jan 23 13:52:36 2011
@@ -305,7 +305,14 @@ public abstract class PDCIDFont extends 
         String cidSystemInfo = getCIDSystemInfo();
         if (cidSystemInfo != null) 
         {
-            cidSystemInfo = CMapSubstitution.substituteCMap( cidSystemInfo );
+            if (cidSystemInfo.contains("Identity"))
+            {
+                cidSystemInfo = "Identity-H";
+            }
+            else
+            {
+                cidSystemInfo = cidSystemInfo.substring(0,cidSystemInfo.lastIndexOf("-"))+"-UCS2";
+            }
             cmap = cmapObjects.get( cidSystemInfo );
             if (cmap == null)
             {
@@ -335,18 +342,7 @@ public abstract class PDCIDFont extends 
         String result = null;
         if (cmap != null)
         {
-            if (length == 1 && cmap.hasOneByteMappings()) 
-            {
-                result = cmap.lookup(c, offset, length);
-            }
-            else if (length == 2 && cmap.hasTwoByteMappings())
-            {
-                result = cmap.lookup(c, offset, length);
-            }
-            if (result == null && cmap.hasCIDMappings())
-            {
-                result = cmap.lookupCID(getCodeFromArray(c, offset, length));
-            }
+            result = cmapEncoding(getCodeFromArray( c, offset, length ), length, true);
         }
         else
         {

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=1062427&r1=1062426&r2=1062427&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 Sun Jan 23 13:52:36 2011
@@ -433,6 +433,28 @@ public abstract class PDFont implements 
     }
     
     /**
+     * Encode the given value using the CMap of the font.
+     * 
+     * @param code the code to encode.
+     * @param length the byte length of the given code.
+     * @param isCIDFont indicates that the used font is a CID font.
+     * 
+     * @return The value of the encoded character.
+     */
+    protected String cmapEncoding( int code, int length, boolean isCIDFont ) throws IOException
+    {
+        String retval = null;
+        if (cmap != null)
+        {
+            retval = cmap.lookup(code, length);
+            if (retval == null && isCIDFont) 
+            {
+                retval = cmap.lookupCID(code);
+            }
+        }
+        return retval;
+    }
+    /**
      * This will perform the encoding of a character if needed.
      *
      * @param c The character to encode.
@@ -446,16 +468,10 @@ public abstract class PDFont implements 
     public String encode( byte[] c, int offset, int length ) throws IOException
     {
         String retval = null;
+        int code = getCodeFromArray( c, offset, length );
         if( cmap != null )
         {
-            if (length == 1 && cmap.hasOneByteMappings()) 
-            {
-                retval = cmap.lookup( c, offset, length );
-            }
-            else if (length == 2 && cmap.hasTwoByteMappings())
-            {
-                retval = cmap.lookup( c, offset, length );
-            }
+            retval = cmapEncoding(code, length, false);
         }
         
         // there is no cmap but probably an encoding with a suitable mapping
@@ -464,7 +480,7 @@ public abstract class PDFont implements 
             Encoding encoding = getFontEncoding();
             if( encoding != null )
             {
-                retval = encoding.getCharacter( getCodeFromArray( c, offset, length ) );
+                retval = encoding.getCharacter( code );
             }
             if( retval == null && (cmap == null || length == 2))
             {

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=1062427&r1=1062426&r2=1062427&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 Sun Jan 23 13:52:36 2011
@@ -179,8 +179,12 @@ public class PDType0Font extends PDSimpl
         }
         else
         {
-            // TODO additional mapping if not Identity
-            return descendentFont.encode(c, offset, length);
+            int result = cmap.lookupCID(c, offset, length);
+            if (result != -1) 
+            {
+                return descendentFont.cmapEncoding(result, 2, true);
+            }
+            return null;
         }
     }
 }