You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2014/09/21 22:51:09 UTC
svn commit: r1626630 - in
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox:
pdmodel/font/PDType1CFont.java pdmodel/font/PDType1Font.java
rendering/font/TTFGlyph2D.java
Author: jahewson
Date: Sun Sep 21 20:51:09 2014
New Revision: 1626630
URL: http://svn.apache.org/r1626630
Log:
PDFBOX-2372: Standard 14 simple fonts should have empty .notdef glyph
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java?rev=1626630&r1=1626629&r2=1626630&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java Sun Sep 21 20:51:09 2014
@@ -127,7 +127,16 @@ public class PDType1CFont extends PDSimp
@Override
public GeneralPath getPath(String name) throws IOException
{
- return type1Equivalent.getPath(name);
+ // Adobe's Standard 14 fonts have an empty .notdef glyph, but Microsoft's don't
+ // so we need to fake this glyph otherwise we get unwanted rectangles, see PDFBOX-2372
+ if (".notdef".equals(name) && isStandard14())
+ {
+ return new GeneralPath();
+ }
+ else
+ {
+ return type1Equivalent.getPath(name);
+ }
}
@Override
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java?rev=1626630&r1=1626629&r2=1626630&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java Sun Sep 21 20:51:09 2014
@@ -440,6 +440,15 @@ public class PDType1Font extends PDSimpl
@Override
public GeneralPath getPath(String name) throws IOException
{
- return type1Equivalent.getPath(name);
+ // Adobe's Standard 14 fonts have an empty .notdef glyph, but Microsoft's don't
+ // so we need to fake this glyph otherwise we get unwanted rectangles, see PDFBOX-2372
+ if (".notdef".equals(name) && isStandard14())
+ {
+ return new GeneralPath();
+ }
+ else
+ {
+ return type1Equivalent.getPath(name);
+ }
}
}
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java?rev=1626630&r1=1626629&r2=1626630&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java Sun Sep 21 20:51:09 2014
@@ -21,9 +21,12 @@ package org.apache.pdfbox.rendering.font
import java.awt.geom.AffineTransform;
import java.awt.geom.GeneralPath;
import java.io.IOException;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.fontbox.ttf.GlyphData;
@@ -105,6 +108,25 @@ public class TTFGlyph2D implements Glyph
}
}
+ // todo: HACK!
+ private static Set<String> STANDARD_14 = new HashSet<String>();
+ static
+ {
+ // standard 14 names
+ STANDARD_14.addAll(Arrays.asList(
+ "Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique", "Helvetica",
+ "Helvetica-Bold", "Helvetica-Oblique", "Helvetica-BoldOblique", "Times-Roman",
+ "Times-Bold", "Times-Italic", "Times-BoldItalic", "Symbol", "ZapfDingbats"
+ ));
+ // alternative names from Adobe Supplement to the ISO 32000
+ STANDARD_14.addAll(Arrays.asList(
+ "CourierCourierNew", "CourierNew", "CourierNew,Italic", "CourierNew,Bold",
+ "CourierNew,BoldItalic", "Arial", "Arial,Italic", "Arial,Bold", "Arial,BoldItalic",
+ "TimesNewRoman", "TimesNewRoman,Italic", "TimesNewRoman,Bold", "TimesNewRoman,BoldItalic"
+ ));
+ }
+
+
/**
* Returns the path describing the glyph for the given glyphId.
*
@@ -122,7 +144,31 @@ public class TTFGlyph2D implements Glyph
}
else
{
+ if (gid == 0 || gid >= ttf.getMaximumProfile().getNumGlyphs())
+ {
+ if (isCIDFont)
+ {
+ int cid = ((PDType0Font) font).codeToCID(code);
+ String cidHex = String.format("%04x", cid);
+ LOG.warn("No glyph for " + code + " (CID " + cidHex + ") in font " +
+ font.getName());
+ }
+ else
+ {
+ LOG.warn("No glyph for " + code + " in font " + font.getName());
+ }
+ }
+
+ // ------
+
GlyphData glyph = ttf.getGlyph().getGlyph(gid);
+
+ // todo: MEGA HACK! (for CIDFont "known") - sort of works (width issues?)
+ if (gid == 0 && !font.isEmbedded() && STANDARD_14.contains(font.getName()))
+ {
+ glyph = null;
+ }
+
if (glyph == null)
{
// empty glyph (e.g. space, newline)
@@ -131,21 +177,6 @@ public class TTFGlyph2D implements Glyph
}
else
{
- if (gid == 0 || gid >= ttf.getMaximumProfile().getNumGlyphs())
- {
- if (isCIDFont)
- {
- int cid = ((PDType0Font) font).codeToCID(code);
- String cidHex = String.format("%04x", cid);
- LOG.warn("No glyph for " + code + " (CID " + cidHex + ") in font " +
- font.getName());
- }
- else
- {
- LOG.warn("No glyph for " + code + " in font " + font.getName());
- }
- }
-
glyphPath = glyph.getPath();
if (hasScaling)
{