You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ms...@apache.org on 2020/10/25 18:12:28 UTC

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

Author: msahyoun
Date: Sun Oct 25 18:12:28 2020
New Revision: 1882847

URL: http://svn.apache.org/viewvc?rev=1882847&view=rev
Log:
PDFBOX-4985: add font resources to AcroForm default resources if they are missing

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

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java?rev=1882847&r1=1882846&r2=1882847&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java Sun Oct 25 18:12:28 2020
@@ -31,6 +31,7 @@ import java.util.Set;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.fontbox.ttf.TrueTypeFont;
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
@@ -48,6 +49,10 @@ import org.apache.pdfbox.pdmodel.fdf.FDF
 import org.apache.pdfbox.pdmodel.fdf.FDFDictionary;
 import org.apache.pdfbox.pdmodel.fdf.FDFDocument;
 import org.apache.pdfbox.pdmodel.fdf.FDFField;
+import org.apache.pdfbox.pdmodel.font.FontMapper;
+import org.apache.pdfbox.pdmodel.font.FontMappers;
+import org.apache.pdfbox.pdmodel.font.FontMapping;
+import org.apache.pdfbox.pdmodel.font.PDType0Font;
 import org.apache.pdfbox.pdmodel.font.PDType1Font;
 import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
@@ -788,6 +793,7 @@ public final class PDAcroForm implements
 
     private void resolveFieldsFromWidgets(PDAcroForm acroForm)
     {
+
         LOG.debug("rebuilding fields from widgets");
         List<PDField> fields = acroForm.getFields();
         for (PDPage page : document.getPages())
@@ -800,6 +806,10 @@ public final class PDAcroForm implements
                     if (annot instanceof PDAnnotationWidget)
                     {
                         PDField field = PDFieldFactory.createField(acroForm, annot.getCOSObject(), null);
+                        if (field instanceof PDVariableText)
+                        {
+                            ensureFontResources((PDVariableText) field);
+                        }
                         fields.add(field);
                     }
                 }
@@ -812,6 +822,46 @@ public final class PDAcroForm implements
         acroForm.setFields(fields);
     }
 
+    /*
+     *  Lookup the font used in the default appearance and if this is 
+     *  not available try to find a suitable font and use that.
+     *  This may not be the original font but a similar font replacement
+     * 
+     *  TODO: implement a font lookup similar as discussed in PDFBOX-2661 so that already existing
+     *        font resources might be accepatble.
+     *        In such case this must be implemented in PDDefaultAppearanceString too!
+     */
+    private void ensureFontResources(PDVariableText field)
+    {
+        String daString = field.getDefaultAppearance();
+        if (daString.startsWith("/") && daString.length() > 1)
+        {
+            COSName fontName = COSName.getPDFName(daString.substring(1, daString.indexOf(" ")));
+            try{
+                if (getDefaultResources() != null && getDefaultResources().getFont(fontName) == null)
+                {
+                    LOG.debug("trying to add missing font resource for field " + field.getFullyQualifiedName());
+                    FontMapper mapper = FontMappers.instance();
+                    FontMapping<TrueTypeFont> fontMapping = mapper.getTrueTypeFont(fontName.getName() , null);
+                    if (fontMapping != null)
+                    {
+                        PDType0Font pdFont = PDType0Font.load(getDocument(), fontMapping.getFont(), false);
+                        LOG.debug("looked up font for " + fontName.getName() + " - found " + fontMapping.getFont().getName());
+                        getDefaultResources().put(fontName, pdFont);
+                    }
+                    else
+                    {
+                        LOG.debug("no suitable font found for field " + field.getFullyQualifiedName() + " for font name " + fontName.getName());
+                    }
+                }
+            }
+            catch (IOException ioe)
+            {
+                LOG.debug("Unable to handle font resources for field " + field.getFullyQualifiedName() + ": " + ioe.getMessage());
+            }
+        }
+    }
+
     private Matrix resolveTransformationMatrix(PDAnnotation annotation, PDAppearanceStream appearanceStream)
     {
         // 1st step transform appearance stream bbox with appearance stream matrix