Author: tilman
Date: Thu Dec 31 12:32:44 2020
New Revision: 1884986
URL: http://svn.apache.org/viewvc?rev=1884986&view=rev
Log:
PDFBOX-5063: use AFM resource if the ZapfDingbats font isn't available; closes
#103
Modified:
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/interactive/form/CreateCheckBox.java
Modified:
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/interactive/form/CreateCheckBox.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/interactive/form/CreateCheckBox.java?rev=1884986&r1=1884985&r2=1884986&view=diff
==============================================================================
---
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/interactive/form/CreateCheckBox.java
(original)
+++
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/interactive/form/CreateCheckBox.java
Thu Dec 31 12:32:44 2020
@@ -18,6 +18,10 @@ package org.apache.pdfbox.examples.inter
import java.awt.geom.Rectangle2D;
import java.io.IOException;
+import org.apache.fontbox.afm.AFMParser;
+import org.apache.fontbox.afm.CharMetric;
+import org.apache.fontbox.afm.FontMetrics;
+import org.apache.fontbox.util.BoundingBox;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDAppearanceContentStream;
@@ -161,6 +165,28 @@ public class CreateCheckBox
String name =
PDType1Font.ZAPF_DINGBATS.codeToName(normalCaption.codePointAt(0));
String unicode =
PDType1Font.ZAPF_DINGBATS.getGlyphList().toUnicode(name);
Rectangle2D bounds =
PDType1Font.ZAPF_DINGBATS.getPath(name).getBounds2D();
+ if (bounds.isEmpty())
+ {
+ // ZapfDingbats font missing, let's use AFM resources
instead.
+ // You can remove this code block if you know that you
have the font.
+ AFMParser parser = new
AFMParser(PDType1Font.class.getResourceAsStream(
+
"/org/apache/pdfbox/resources/afm/ZapfDingbats.afm"));
+ FontMetrics metric = parser.parse();
+ for (CharMetric cm : metric.getCharMetrics())
+ {
+ if (normalCaption.codePointAt(0) ==
cm.getCharacterCode())
+ {
+ BoundingBox bb = cm.getBoundingBox();
+ bounds = new Rectangle2D.Float(bb.getLowerLeftX(),
bb.getLowerLeftY(),
+ bb.getWidth(),
bb.getHeight());
+ unicode =
PDType1Font.ZAPF_DINGBATS.getGlyphList().toUnicode(cm.getName());
+ }
+ }
+ }
+ if (bounds.isEmpty())
+ {
+ throw new IOException("Bounds rectangle for chosen glyph
is empty");
+ }
float size = (float) Math.min(bounds.getWidth(),
bounds.getHeight()) / 1000;
// assume that checkmark has square size
// the calculations approximate what Adobe is doing, i.e. put
the glyph in the middle