Author: lehmi
Date: Tue Mar 13 19:25:11 2012
New Revision: 1300296

URL: http://svn.apache.org/viewvc?rev=1300296&view=rev
Log:
PDFBOX-1252: avoid that the ToUnicode mapping overrides the encoding cmap

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/PDSimpleFont.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=1300296&r1=1300295&r2=1300296&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 
Tue Mar 13 19:25:11 2012
@@ -322,7 +322,7 @@ public abstract class PDCIDFont extends 
             {
                 String resourceName = resourceRootCMAP + cidSystemInfo;
                 try {
-                    parseCmap( resourceRootCMAP, ResourceLoader.loadResource( 
resourceName ) );
+                    cmap = parseCmap( resourceRootCMAP, 
ResourceLoader.loadResource( resourceName ));
                     if( cmap == null)
                     {
                         log.error("Error: Could not parse predefined CMAP file 
for '" + cidSystemInfo + "'" );
@@ -346,7 +346,7 @@ public abstract class PDCIDFont extends 
         String result = null;
         if (cmap != null)
         {
-            result = cmapEncoding(getCodeFromArray( c, offset, length ), 
length, true);
+            result = cmapEncoding(getCodeFromArray( c, offset, length ), 
length, true, cmap);
         }
         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=1300296&r1=1300295&r2=1300296&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 
Tue Mar 13 19:25:11 2012
@@ -85,6 +85,11 @@ public abstract class PDFont implements 
      */
     protected CMap cmap = null;
 
+    /**
+     * The CMap holding the ToUnicode mapping 
+     */
+    protected CMap toUnicodeCmap = null;
+    
     private boolean hasToUnicode = false;
 
     protected static Map<String, CMap> cmapObjects =
@@ -472,15 +477,15 @@ public abstract class PDFont implements 
      * @return The value of the encoded character.
      * @throws IOException if something went wrong
      */
-    protected String cmapEncoding( int code, int length, boolean isCIDFont ) 
throws IOException
+    protected String cmapEncoding( int code, int length, boolean isCIDFont, 
CMap sourceCmap ) throws IOException
     {
         String retval = null;
-        if (cmap != null)
+        if (sourceCmap != null)
         {
-            retval = cmap.lookup(code, length);
+            retval = sourceCmap.lookup(code, length);
             if (retval == null && isCIDFont)
             {
-                retval = cmap.lookupCID(code);
+                retval = sourceCmap.lookupCID(code);
             }
         }
         return retval;
@@ -500,9 +505,13 @@ public abstract class PDFont implements 
     {
         String retval = null;
         int code = getCodeFromArray( c, offset, length );
-        if( cmap != null )
+        if( toUnicodeCmap != null )
+        {
+            retval = cmapEncoding(code, length, false, toUnicodeCmap);
+        }
+        if( retval == null && cmap != null )
         {
-            retval = cmapEncoding(code, length, false);
+            retval = cmapEncoding(code, length, false, cmap);
         }
 
         // there is no cmap but probably an encoding with a suitable mapping
@@ -568,22 +577,24 @@ public abstract class PDFont implements 
         return retval;
     }
 
-    protected void parseCmap( String cmapRoot, InputStream cmapStream)
+    protected CMap parseCmap( String cmapRoot, InputStream cmapStream)
     {
+        CMap targetCmap = null;
         if( cmapStream != null )
         {
             CMapParser parser = new CMapParser();
             try
             {
-                cmap = parser.parse( cmapRoot, cmapStream );
+                targetCmap = parser.parse( cmapRoot, cmapStream );
                 // limit the cache to external CMaps
                 if (cmapRoot != null)
                 {
-                    cmapObjects.put( cmap.getName(), cmap );
+                    cmapObjects.put( targetCmap.getName(), targetCmap );
                 }
             }
             catch (IOException exception) {}
         }
+        return targetCmap;
     }
 
     /**

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java?rev=1300296&r1=1300295&r2=1300296&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java
 Tue Mar 13 19:25:11 2012
@@ -398,7 +398,7 @@ public abstract class PDSimpleFont exten
                     COSStream encodingStream = (COSStream)encoding;
                     try 
                     {
-                        parseCmap( null, encodingStream.getUnfilteredStream() 
);
+                        cmap = parseCmap( null, 
encodingStream.getUnfilteredStream() );
                     }
                     catch(IOException exception) 
                     {
@@ -426,7 +426,7 @@ public abstract class PDSimpleFont exten
             String resourceName = resourceRootCMAP + cmapName;
             try 
             {
-                parseCmap( resourceRootCMAP, ResourceLoader.loadResource( 
resourceName ) );
+                cmap = parseCmap( resourceRootCMAP, 
ResourceLoader.loadResource( resourceName ) );
                 if( cmap == null && encodingName == null)
                 {
                     LOG.error("Error: Could not parse predefined CMAP file for 
'" + cmapName + "'" );
@@ -451,32 +451,32 @@ public abstract class PDSimpleFont exten
             {
                 try 
                 {
-                    parseCmap(null, 
((COSStream)toUnicode).getUnfilteredStream());
+                    toUnicodeCmap = parseCmap(null, 
((COSStream)toUnicode).getUnfilteredStream());
                 }
                 catch(IOException exception) 
                 {
-                    LOG.error("Error: Could not load embedded CMAP" );
+                    LOG.error("Error: Could not load embedded ToUnicode CMap" 
);
                 }
             }
             else if ( toUnicode instanceof COSName)
             {
                 encodingName = (COSName)toUnicode;
-                cmap = cmapObjects.get( encodingName.getName() );
-                if (cmap == null) 
+                toUnicodeCmap = cmapObjects.get( encodingName.getName() );
+                if (toUnicodeCmap == null) 
                 {
                     cmapName = encodingName.getName();
                     String resourceName = resourceRootCMAP + cmapName;
                     try 
                     {
-                        parseCmap( resourceRootCMAP, 
ResourceLoader.loadResource( resourceName ));
+                        toUnicodeCmap = parseCmap( resourceRootCMAP, 
ResourceLoader.loadResource( resourceName ));
                     }
                     catch(IOException exception) 
                     {
-                        LOG.error("Error: Could not find predefined CMAP file 
for '" + cmapName + "'" );
+                        LOG.error("Error: Could not find predefined ToUnicode 
CMap file for '" + cmapName + "'" );
                     }
-                    if( cmap == null)
+                    if( toUnicodeCmap == null)
                     {
-                        LOG.error("Error: Could not parse predefined CMAP file 
for '" + cmapName + "'" );
+                        LOG.error("Error: Could not parse predefined ToUnicode 
CMap file for '" + cmapName + "'" );
                     }
                 }
             }

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=1300296&r1=1300295&r2=1300296&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
 Tue Mar 13 19:25:11 2012
@@ -184,7 +184,7 @@ public class PDType0Font extends PDSimpl
             int result = cmap.lookupCID(c, offset, length);
             if (result != -1) 
             {
-                return descendantFont.cmapEncoding(result, 2, true);
+                return descendantFont.cmapEncoding(result, 2, true, cmap);
             }
             return null;
         }


Reply via email to