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/12/15 03:44:30 UTC

svn commit: r1645553 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ToUnicodeWriter.java

Author: jahewson
Date: Mon Dec 15 02:44:30 2014
New Revision: 1645553

URL: http://svn.apache.org/r1645553
Log:
PDFBOX-2524: Adobe Reader requires well-formed CMaps

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ToUnicodeWriter.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ToUnicodeWriter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ToUnicodeWriter.java?rev=1645553&r1=1645552&r2=1645553&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ToUnicodeWriter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ToUnicodeWriter.java Mon Dec 15 02:44:30 2014
@@ -63,7 +63,7 @@ final class ToUnicodeWriter
      */
     public void add(int cid, String text)
     {
-        if ( cid < 0 || cid > 0xFFFF)
+        if (cid < 0 || cid > 0xFFFF)
         {
             throw new IllegalArgumentException("CID is not valid");
         }
@@ -117,14 +117,17 @@ final class ToUnicodeWriter
         int srcPrev = -1;
         String dstPrev = null;
 
+        int srcCode1 = -1;
+
         for (Map.Entry<Integer, String> entry : cidToUnicode.entrySet())
         {
             int cid = entry.getKey();
             String text = entry.getValue();
 
-            if (cid == srcPrev + 1 &&
-                dstPrev.codePointCount(0, dstPrev.length()) == 1 &&
-                text.codePointAt(0) == dstPrev.codePointAt(0) + 1)
+            if (cid == srcPrev + 1 &&                                 // CID must be last CID + 1
+                dstPrev.codePointCount(0, dstPrev.length()) == 1 &&   // no UTF-16 surrogates
+                text.codePointAt(0) == dstPrev.codePointAt(0) + 1 &&  // dstString must be prev + 1
+                dstPrev.codePointAt(0) + 1 <= 255 - (cid - srcCode1)) // increment last byte only
             {
                 // extend range
                 srcTo.set(srcTo.size() - 1, cid);
@@ -132,6 +135,7 @@ final class ToUnicodeWriter
             else
             {
                 // begin range
+                srcCode1 = cid;
                 srcFrom.add(cid);
                 srcTo.add(cid);
                 dstString.add(text);