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