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 2010/05/21 19:53:29 UTC

svn commit: r947097 - in /pdfbox/trunk/pdfbox/src/main: java/org/apache/pdfbox/encoding/Encoding.java resources/Resources/additional_glyphlist.txt

Author: lehmi
Date: Fri May 21 17:53:29 2010
New Revision: 947097

URL: http://svn.apache.org/viewvc?rev=947097&view=rev
Log:
PDFBOX-728: added some more mappings and improved the character encoding used by tex/latex

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/encoding/Encoding.java
    pdfbox/trunk/pdfbox/src/main/resources/Resources/additional_glyphlist.txt

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/encoding/Encoding.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/encoding/Encoding.java?rev=947097&r1=947096&r2=947097&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/encoding/Encoding.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/encoding/Encoding.java Fri May 21 17:53:29 2010
@@ -275,76 +275,76 @@ public abstract class Encoding implement
      */
     public static String getCharacter( String name )
     {
-        String baseName = name;
-        String character = NAME_TO_CHARACTER.get( baseName );
+        String character = NAME_TO_CHARACTER.get( name );
         if( character == null )
         {
-            String nameStr = baseName;
+            // test if we have a suffix and if so remove it
+            if ( name.indexOf('.') > 0 ) 
+            {
+                character = getCharacter(name.substring( 0, name.indexOf('.') ));
+            }
             // test for Unicode name
             // (uniXXXX - XXXX must be a multiple of four;
             // each representing a hexadecimal Unicode code point)
-            if ( nameStr.startsWith( "uni" ) )
+            else if ( name.startsWith( "uni" ) )
             {
+                int nameLength = name.length();
                 StringBuilder uniStr = new StringBuilder();
-
-                for ( int chPos = 3; chPos + 4 <= nameStr.length(); chPos += 4 )
+                try 
                 {
-                    try 
+                    for ( int chPos = 3; chPos + 4 <= nameLength; chPos += 4 )
                     {
-                        int characterCode = Integer.parseInt( nameStr.substring( chPos, chPos + 4), 16 );
+                        int characterCode = Integer.parseInt( name.substring( chPos, chPos + 4), 16 );
 
                         if ( ( characterCode > 0xD7FF ) && ( characterCode < 0xE000 ) )
                         {
-                            log.warn( "Unicode character name with not allowed code area: " + nameStr );
+                            log.warn( "Unicode character name with not allowed code area: " + name );
                         }
                         else
                         {
                             uniStr.append( (char) characterCode );
                         }
                     } 
-                    catch (NumberFormatException nfe) 
-                    {
-                        log.warn( "Not a number in Unicode character name: " + nameStr );
-                    }
-                }
-                character = uniStr.toString();
-                NAME_TO_CHARACTER.put(name, character);
-            }
-            // this hexadecimal encoding is used in pdfs generated by TeX/LateX 
-            else if (nameStr.startsWith("x")) 
-            {
-                try {
-                    int value = Integer.parseInt(nameStr.substring(1), 16);
-                    character = ""+(char)value;
+                    character = uniStr.toString();
                     NAME_TO_CHARACTER.put(name, character);
                 }
-                catch(NumberFormatException exception) {
-                    log.warn( "Not a number in hexadecimal character name: " + nameStr );
+                catch (NumberFormatException nfe) 
+                {
+                    log.warn( "Not a number in Unicode character name: " + name );
+                    character = name;
                 }
             }
-            // this decimal encoding is used in pdfs generated by TeX/LateX 
-            else if (nameStr.startsWith("a")) 
+            // this encoding is used in pdfs generated with TeX/LateX 
+            else if (name.length() <= 4 && (name.startsWith("x") || name.startsWith("a")) ) 
             {
-                try {
-                    int value = Integer.parseInt(nameStr.substring(1));
-                    character = ""+(char)value;
+                try 
+                {
+                    int value = Integer.parseInt(name.substring(1), (name.startsWith("x") ? 16 : 10));
+                    // add some additional mapping for values < 32 and = 127
+                    if (value >=0 && value <= 9) 
+                    {
+                        value += 161;
+                    }
+                    else if (value >= 10 && value < 32) 
+                    {
+                        value += 163;
+                    }
+                    else if ( value == 127)
+                    {
+                        value = 196;
+                    }
+                    character = Character.toString((char)value);
                     NAME_TO_CHARACTER.put(name, character);
                 }
-                catch(NumberFormatException exception) {
-                    log.warn( "Not a number in dezimal character name: " + nameStr );
+                catch(NumberFormatException exception) 
+                {
+                    log.warn( "Not a number in character name: " + name );
+                    character = name;
                 }
             }
             else 
             {
-                // test if we have a suffix and if so remove it
-                if ( nameStr.indexOf('.') > 0 ) 
-                {
-                    nameStr = nameStr.substring( 0, nameStr.indexOf('.') );
-                    baseName = nameStr;
-                    getCharacter(baseName);
-                }
-
-               character = nameStr;
+                character = name;
             }
         }
         return character;

Modified: pdfbox/trunk/pdfbox/src/main/resources/Resources/additional_glyphlist.txt
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/resources/Resources/additional_glyphlist.txt?rev=947097&r1=947096&r2=947097&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/resources/Resources/additional_glyphlist.txt (original)
+++ pdfbox/trunk/pdfbox/src/main/resources/Resources/additional_glyphlist.txt Fri May 21 17:53:29 2010
@@ -25,7 +25,7 @@ angbracketright;3009
 circlecopyrt;00A9
 controlNULL;0000
 #
-# TeX-related mappings
+# TeX-related mappings using named values
 #
 angbracketleftbig;2329
 angbracketleftBig;2329
@@ -35,6 +35,16 @@ angbracketrightBig;232A
 angbracketrightbig;232A
 angbracketrightBigg;232A
 angbracketrightbigg;232A
+arrowhookleft;21AA
+arrowhookright;21A9
+arrowlefttophalf;21BC
+arrowleftbothalf;21BD
+arrownortheast;2197
+arrownorthwest;2196
+arrowrighttophalf;21C0
+arrowrightbothalf;21C1
+arrowsoutheast;2198
+arrowsouthwest;2199
 backslashbig;2216
 backslashBig;2216
 backslashBigg;2216
@@ -89,6 +99,7 @@ floorrightbigg;230B
 hatwide;0302
 hatwider;0302
 hatwidest;0302
+intercal;1D40
 integraldisplay;222B
 integraltext;222B
 intersectiondisplay;22C2
@@ -132,3 +143,18 @@ unionsqtext;2294
 uniontext;22C3
 vextenddouble;2225
 vextendsingle;2223
+#
+# TeX-related mappings using hexadecimal or decimal values
+#
+x1b;FB00
+x1c;FB01
+x1d;FB02
+x1e;FB03
+x8a;0141
+xff;00DF
+a27;FB00
+a28;FB01
+a29;FB02
+a30;FB03
+a138;0141
+a255;00DF
\ No newline at end of file