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:23 UTC
svn commit: r1865252 -
/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDFreeTextAppearanceHandler.java
Author: tilman
Date: Thu Aug 15 19:02:23 2019
New Revision: 1865252
URL: http://svn.apache.org/viewvc?rev=1865252&view=rev
Log:
PDFBOX-3353: try to get font from default resources
Modified:
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDFreeTextAppearanceHandler.java
Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDFreeTextAppearanceHandler.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDFreeTextAppearanceHandler.java?rev=1865252&r1=1865251&r2=1865252&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDFreeTextAppearanceHandler.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/handlers/PDFreeTextAppearanceHandler.java Thu Aug 15 19:02:23 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;
@@ -31,6 +32,7 @@ import org.apache.pdfbox.io.IOUtils;
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;
@@ -55,6 +57,9 @@ 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);
@@ -238,7 +243,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.
@@ -375,7 +394,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;
@@ -390,15 +411,15 @@ public class PDFreeTextAppearanceHandler
if (graphicOp != null)
{
String graphicOpName = graphicOp.getName();
- if ("g".equals(graphicOpName))
+ if (OperatorName.NON_STROKING_GRAY.equals(graphicOpName))
{
strokingColor = new PDColor(colors, PDDeviceGray.INSTANCE);
}
- else if ("rg".equals(graphicOpName))
+ else if (OperatorName.NON_STROKING_RGB.equals(graphicOpName))
{
strokingColor = new PDColor(colors, PDDeviceRGB.INSTANCE);
}
- else if ("k".equals(graphicOpName))
+ else if (OperatorName.NON_STROKING_CMYK.equals(graphicOpName))
{
strokingColor = new PDColor(colors, PDDeviceCMYK.INSTANCE);
}
@@ -411,15 +432,19 @@ public class PDFreeTextAppearanceHandler
return strokingColor;
}
- //TODO extractNonStrokingColor and extractFontSize
- // might somehow be replaced with PDDefaultAppearanceString,
- // which is quite similar.
- private float extractFontSize(PDAnnotationMarkup annotation)
+ //TODO extractNonStrokingColor and extractFontDetails
+ // might somehow be replaced with PDDefaultAppearanceString, which is quite similar.
+ private void extractFontDetails(PDAnnotationMarkup 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
@@ -438,7 +463,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;
}
@@ -451,18 +476,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