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 2014/11/01 14:57:11 UTC

svn commit: r1635948 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAppearanceString.java

Author: lehmi
Date: Sat Nov  1 13:57:10 2014
New Revision: 1635948

URL: http://svn.apache.org/r1635948
Log:
PDFBOX-1036: replace the first part of a multipart text only, reuse font size of an existing appearance stream

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAppearanceString.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAppearanceString.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAppearanceString.java?rev=1635948&r1=1635947&r2=1635948&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAppearanceString.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAppearanceString.java Sat Nov  1 13:57:10 2014
@@ -285,21 +285,38 @@ public final class PDAppearanceString
                         float fontSize = calculateFontSize(pdFont,
                                 appearanceStream.getBBox(), tokens, null);
                         boolean foundString = false;
+                        int indexOfString = -1;
                         for (Object token : tokens)
                         {
                             if (token instanceof COSString)
                             {
                                 foundString = true;
+                                indexOfString = tokens.indexOf(token);
                                 COSString drawnString = (COSString) token;
                                 drawnString.reset();
                                 drawnString.append(apValue.getBytes("ISO-8859-1"));
+                                // replace the first string only if the appearance stream 
+                                // consists of more than one text
+                                break;
                             }
                         }
                         int setFontIndex = tokens.indexOf(Operator.getOperator("Tf"));
                         tokens.set(setFontIndex - 1, new COSFloat(fontSize));
                         if (foundString)
                         {
-                            writer.writeTokens(tokens);
+                            int indexOfET = tokens.indexOf(Operator.getOperator("ET"));
+                            // the existing appearance stream may contain more than one text
+                            // so that we shall replace the first with the new value 
+                            // and skip the remaining parts
+                            if (indexOfString+2 != indexOfET)
+                            {
+                                writer.writeTokens(tokens, 0, indexOfString+2);
+                                writer.writeTokens(tokens, indexOfET, tokens.size());
+                            }
+                            else
+                            {
+                                writer.writeTokens(tokens);
+                            }
                         }
                         else
                         {
@@ -550,9 +567,19 @@ public final class PDAppearanceString
             List<Object> daTokens) throws IOException
     {
         float fontSize = 0;
-        if (daTokens != null)
+        if (tokens != null)
+        {
+            // reuse the fontsize of an existing apperance stream
+            int fontIndex = tokens.indexOf(Operator.getOperator("Tf"));
+            if (fontIndex != -1)
+            {
+                fontSize = ((COSNumber) tokens.get(fontIndex - 1)).floatValue();
+            }
+        }
+        else if (daTokens != null)
         {
             // daString looks like "BMC /Helv 3.4 Tf EMC"
+            // use the fontsize of the default existing apperance stream
             int fontIndex = daTokens.indexOf(Operator.getOperator("Tf"));
             if (fontIndex != -1)
             {