You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2019/08/15 19:02:28 UTC

svn commit: r1865253 - /pdfbox/branches/issue4569/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDFreeTextAppearanceHandler.java

Author: tilman
Date: Thu Aug 15 19:02:28 2019
New Revision: 1865253

URL: http://svn.apache.org/viewvc?rev=1865253&view=rev
Log:
PDFBOX-3353: try to get font from default resources

Modified:
    pdfbox/branches/issue4569/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDFreeTextAppearanceHandler.java

Modified: pdfbox/branches/issue4569/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDFreeTextAppearanceHandler.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/issue4569/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDFreeTextAppearanceHandler.java?rev=1865253&r1=1865252&r2=1865253&view=diff
==============================================================================
--- pdfbox/branches/issue4569/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDFreeTextAppearanceHandler.java (original)
+++ pdfbox/branches/issue4569/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDFreeTextAppearanceHandler.java Thu Aug 15 19:02:28 2019
@@ -22,6 +22,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.fontbox.util.Charsets;
 import org.apache.pdfbox.contentstream.operator.Operator;
+import org.apache.pdfbox.contentstream.operator.OperatorName;
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSName;
@@ -30,6 +31,7 @@ import org.apache.pdfbox.cos.COSObject;
 import org.apache.pdfbox.pdfparser.PDFStreamParser;
 import org.apache.pdfbox.pdmodel.PDAppearanceContentStream;
 import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDResources;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.font.PDFont;
 import org.apache.pdfbox.pdmodel.font.PDType1Font;
@@ -54,7 +56,10 @@ public class PDFreeTextAppearanceHandler
 
     private static final Pattern COLOR_PATTERN =
             Pattern.compile(".*color\\:\\s*\\#([0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]).*");
-    
+
+    private float fontSize = 10;
+    private COSName fontName = COSName.HELV;
+
     public PDFreeTextAppearanceHandler(PDAnnotation annotation)
     {
         super(annotation);
@@ -234,7 +239,21 @@ public class PDFreeTextAppearanceHandler
             float clipWidth = width - ab.width * 4;
             float clipHeight = rotation == 90 || rotation == 270 ? 
                                 borderBox.getWidth() - ab.width * 4 : borderBox.getHeight() - ab.width * 4;
-            float fontSize = extractFontSize(annotation);
+            extractFontDetails(annotation);
+            if (document != null && document.getDocumentCatalog().getAcroForm() != null)
+            {
+                // Try to get font from AcroForm default resources
+                // Sample file: https://gitlab.freedesktop.org/poppler/poppler/issues/6
+                PDResources defaultResources = document.getDocumentCatalog().getAcroForm().getDefaultResources();
+                if (defaultResources != null)
+                {
+                    PDFont defaultResourcesFont = defaultResources.getFont(fontName);
+                    if (defaultResourcesFont != null)
+                    {
+                        font = defaultResourcesFont;
+                    }
+                }
+            }
 
             // value used by Adobe, no idea where it comes from, actual font bbox max y is 0.931
             // gathered by creating an annotation with width 0.
@@ -367,7 +386,9 @@ public class PDFreeTextAppearanceHandler
                 {
                     Operator op = (Operator) token;
                     String name = op.getName();
-                    if ("g".equals(name) || "rg".equals(name) || "k".equals(name))
+                    if (OperatorName.NON_STROKING_GRAY.equals(name) ||
+                        OperatorName.NON_STROKING_RGB.equals(name) ||
+                        OperatorName.NON_STROKING_CMYK.equals(name))
                     {
                         graphicOp = op;
                         colors = arguments;
@@ -383,13 +404,13 @@ public class PDFreeTextAppearanceHandler
             {
                 switch (graphicOp.getName())
                 {
-                    case "g":
+                    case OperatorName.NON_STROKING_GRAY:
                         strokingColor = new PDColor(colors, PDDeviceGray.INSTANCE);
                         break;
-                    case "rg":
+                    case OperatorName.NON_STROKING_RGB:
                         strokingColor = new PDColor(colors, PDDeviceRGB.INSTANCE);
                         break;
-                    case "k":
+                    case OperatorName.NON_STROKING_CMYK:
                         strokingColor = new PDColor(colors, PDDeviceCMYK.INSTANCE);
                         break;
                     default:
@@ -404,15 +425,19 @@ public class PDFreeTextAppearanceHandler
         return strokingColor;
     }
 
-    //TODO extractNonStrokingColor and extractFontSize
-    // might somehow be replaced with PDDefaultAppearanceString,
-    // which is quite similar.
-    private float extractFontSize(PDAnnotationFreeText annotation)
+    //TODO extractNonStrokingColor and extractFontDetails
+    // might somehow be replaced with PDDefaultAppearanceString, which is quite similar.
+    private void extractFontDetails(PDAnnotationFreeText annotation)
     {
         String defaultAppearance = annotation.getDefaultAppearance();
+        if (defaultAppearance == null && document != null &&
+            document.getDocumentCatalog().getAcroForm() != null)
+        {
+            defaultAppearance = document.getDocumentCatalog().getAcroForm().getDefaultAppearance();
+        }
         if (defaultAppearance == null)
         {
-            return 10;
+            return;
         }
 
         try
@@ -431,7 +456,7 @@ public class PDFreeTextAppearanceHandler
                 {
                     Operator op = (Operator) token;
                     String name = op.getName();
-                    if ("Tf".equals(name))
+                    if (OperatorName.SET_FONT_AND_SIZE.equals(name))
                     {
                         fontArguments = arguments;
                     }
@@ -444,18 +469,22 @@ public class PDFreeTextAppearanceHandler
             }
             if (fontArguments.size() >= 2)
             {
-                COSBase base = fontArguments.get(1);
+                COSBase base = fontArguments.get(0);
+                if (base instanceof COSName)
+                {
+                    fontName = (COSName) base;
+                }
+                base = fontArguments.get(1);
                 if (base instanceof COSNumber)
                 {
-                    return ((COSNumber) base).floatValue();
+                    fontSize = ((COSNumber) base).floatValue();
                 }
             }
         }
         catch (IOException ex)
         {
-            LOG.warn("Problem parsing /DA, will use default 10", ex);
+            LOG.warn("Problem parsing /DA, will use default 'Helv 10'", ex);
         }
-        return 10;
     }
 
     @Override