Author: jahewson Date: Mon Aug 18 21:09:03 2014 New Revision: 1618738 URL: http://svn.apache.org/r1618738 Log: PDFBOX-2262: Fix font loading NPEs
Modified: pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/HorizontalMetricsTable.java pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/TTFSubsetter.java pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/TrueTypeFont.java pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/Type1Equivalent.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/FileSystemFontProvider.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFontEmbedder.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Equivalent.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/Glyph2D.java pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java pdfbox/branches/no-awt/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType2Container.java pdfbox/branches/no-awt/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java pdfbox/branches/no-awt/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/TrueTypeContainer.java Modified: pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/HorizontalMetricsTable.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/HorizontalMetricsTable.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/HorizontalMetricsTable.java (original) +++ pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/HorizontalMetricsTable.java Mon Aug 18 21:09:03 2014 @@ -46,21 +46,27 @@ public class HorizontalMetricsTable exte HorizontalHeaderTable hHeader = ttf.getHorizontalHeader(); int numHMetrics = hHeader.getNumberOfHMetrics(); int numGlyphs = ttf.getNumberOfGlyphs(); - + + int bytesRead = 0; advanceWidth = new int[ numHMetrics ]; leftSideBearing = new short[ numHMetrics ]; for( int i=0; i<numHMetrics; i++ ) { advanceWidth[i] = data.readUnsignedShort(); leftSideBearing[i] = data.readSignedShort(); + bytesRead += 4; } - - int numberNonHorizontal = numGlyphs - numHMetrics; - nonHorizontalLeftSideBearing = new short[ numberNonHorizontal ]; - for( int i=0; i<numberNonHorizontal; i++ ) + + if (bytesRead < getLength()) { - nonHorizontalLeftSideBearing[i] = data.readSignedShort(); + int numberNonHorizontal = numGlyphs - numHMetrics; + nonHorizontalLeftSideBearing = new short[ numberNonHorizontal ]; + for( int i=0; i<numberNonHorizontal; i++ ) + { + nonHorizontalLeftSideBearing[i] = data.readSignedShort(); + } } + initialized = true; } /** Modified: pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/TTFSubsetter.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/TTFSubsetter.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/TTFSubsetter.java (original) +++ pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/TTFSubsetter.java Mon Aug 18 21:09:03 2014 @@ -70,7 +70,7 @@ public class TTFSubsetter * @param suffix suffix used for the naming * */ - public TTFSubsetter(TrueTypeFont baseFont, String suffix) + public TTFSubsetter(TrueTypeFont baseFont, String suffix) throws IOException { baseTTF = baseFont; nameSuffix = suffix; Modified: pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/TrueTypeFont.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/TrueTypeFont.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/TrueTypeFont.java (original) +++ pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/TrueTypeFont.java Mon Aug 18 21:09:03 2014 @@ -118,7 +118,7 @@ public class TrueTypeFont implements Typ * * @return The naming table. */ - public NamingTable getNaming() + public NamingTable getNaming() throws IOException { NamingTable naming = (NamingTable)tables.get( NamingTable.TAG ); if (naming != null && !naming.getInitialized()) @@ -133,7 +133,7 @@ public class TrueTypeFont implements Typ * * @return The postscript table. */ - public PostScriptTable getPostScript() + public PostScriptTable getPostScript() throws IOException { PostScriptTable postscript = (PostScriptTable)tables.get( PostScriptTable.TAG ); if (postscript != null && !postscript.getInitialized()) @@ -148,7 +148,7 @@ public class TrueTypeFont implements Typ * * @return The OS/2 table. */ - public OS2WindowsMetricsTable getOS2Windows() + public OS2WindowsMetricsTable getOS2Windows() throws IOException { OS2WindowsMetricsTable os2WindowsMetrics = (OS2WindowsMetricsTable)tables.get( OS2WindowsMetricsTable.TAG ); if (os2WindowsMetrics != null && !os2WindowsMetrics.getInitialized()) @@ -163,7 +163,7 @@ public class TrueTypeFont implements Typ * * @return The maxp table. */ - public MaximumProfileTable getMaximumProfile() + public MaximumProfileTable getMaximumProfile() throws IOException { MaximumProfileTable maximumProfile = (MaximumProfileTable)tables.get( MaximumProfileTable.TAG ); if (maximumProfile != null && !maximumProfile.getInitialized()) @@ -178,7 +178,7 @@ public class TrueTypeFont implements Typ * * @return The head table. */ - public HeaderTable getHeader() + public HeaderTable getHeader() throws IOException { HeaderTable header = (HeaderTable)tables.get( HeaderTable.TAG ); if (header != null && !header.getInitialized()) @@ -193,7 +193,7 @@ public class TrueTypeFont implements Typ * * @return The hhea table. */ - public HorizontalHeaderTable getHorizontalHeader() + public HorizontalHeaderTable getHorizontalHeader() throws IOException { HorizontalHeaderTable horizontalHeader = (HorizontalHeaderTable)tables.get( HorizontalHeaderTable.TAG ); if (horizontalHeader != null && !horizontalHeader.getInitialized()) @@ -208,7 +208,7 @@ public class TrueTypeFont implements Typ * * @return The hmtx table. */ - public HorizontalMetricsTable getHorizontalMetrics() + public HorizontalMetricsTable getHorizontalMetrics() throws IOException { HorizontalMetricsTable horizontalMetrics = (HorizontalMetricsTable)tables.get( HorizontalMetricsTable.TAG ); if (horizontalMetrics != null && !horizontalMetrics.getInitialized()) @@ -223,7 +223,7 @@ public class TrueTypeFont implements Typ * * @return The loca table. */ - public IndexToLocationTable getIndexToLocation() + public IndexToLocationTable getIndexToLocation() throws IOException { IndexToLocationTable indexToLocation = (IndexToLocationTable)tables.get( IndexToLocationTable.TAG ); if (indexToLocation != null && !indexToLocation.getInitialized()) @@ -238,7 +238,7 @@ public class TrueTypeFont implements Typ * * @return The glyf table. */ - public GlyphTable getGlyph() + public GlyphTable getGlyph() throws IOException { GlyphTable glyph = (GlyphTable)tables.get( GlyphTable.TAG ); if (glyph != null && !glyph.getInitialized()) @@ -253,7 +253,7 @@ public class TrueTypeFont implements Typ * * @return The cmap table. */ - public CMAPTable getCMAP() + public CMAPTable getCMAP() throws IOException { CMAPTable cmap = (CMAPTable)tables.get( CMAPTable.TAG ); if (cmap != null && !cmap.getInitialized()) @@ -282,21 +282,14 @@ public class TrueTypeFont implements Typ * * @param table the table to be initialized */ - void readTable(TTFTable table) + void readTable(TTFTable table) throws IOException { - try - { - // save current position - long currentPosition = data.getCurrentPosition(); - data.seek(table.getOffset()); - table.read(this, data); - // restore current position - data.seek(currentPosition); - } - catch (IOException exception) - { - log.error("An error occured when reading table " + table.getTag(), exception); - } + // save current position + long currentPosition = data.getCurrentPosition(); + data.seek(table.getOffset()); + table.read(this, data); + // restore current position + data.seek(currentPosition); } /** @@ -304,7 +297,7 @@ public class TrueTypeFont implements Typ * * @return the number of glyphs */ - public int getNumberOfGlyphs() + public int getNumberOfGlyphs() throws IOException { if (numberOfGlyphs == -1) { @@ -327,7 +320,7 @@ public class TrueTypeFont implements Typ * * @return units per EM */ - public int getUnitsPerEm() + public int getUnitsPerEm() throws IOException { if (unitsPerEm == -1) { @@ -351,7 +344,7 @@ public class TrueTypeFont implements Typ * @param code the glyph code * @return the width */ - public int getAdvanceWidth(int code) + public int getAdvanceWidth(int code) throws IOException { if (advanceWidths == null) { @@ -379,12 +372,12 @@ public class TrueTypeFont implements Typ } @Override - public String getFullName() + public String getFullName() throws IOException { return getNaming().getPostScriptName(); } - private void readPostScriptNames() + private void readPostScriptNames() throws IOException { if (postScriptNames == null) { @@ -435,7 +428,7 @@ public class TrueTypeFont implements Typ } @Override - public boolean hasGlyph(String name) + public boolean hasGlyph(String name) throws IOException { readPostScriptNames(); @@ -455,6 +448,13 @@ public class TrueTypeFont implements Typ @Override public String toString() { - return getNaming().getPostScriptName(); + try + { + return getNaming().getPostScriptName(); + } + catch (IOException e) + { + return "(null)"; + } } } Modified: pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/Type1Equivalent.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/Type1Equivalent.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/Type1Equivalent.java (original) +++ pdfbox/branches/no-awt/fontbox/src/main/java/org/apache/fontbox/ttf/Type1Equivalent.java Mon Aug 18 21:09:03 2014 @@ -16,7 +16,7 @@ public interface Type1Equivalent /** * The PostScript name of the font. */ - public String getFullName(); + public String getFullName() throws IOException; /** * Returns the Type 1 CharString for the character with the given name. @@ -30,7 +30,7 @@ public interface Type1Equivalent * Returns true if the font contains the given glyph. * @param name PostScript glyph name */ - public boolean hasGlyph(String name); + public boolean hasGlyph(String name) throws IOException; /** * Returns the PostScript Encoding vector for the font. Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/FileSystemFontProvider.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/FileSystemFontProvider.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/FileSystemFontProvider.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/FileSystemFontProvider.java Mon Aug 18 21:09:03 2014 @@ -109,36 +109,38 @@ final class FileSystemFontProvider imple NamingTable nameTable = ttf.getNaming(); if (nameTable == null) { - throw new IOException("Missing 'name' table"); + LOG.warn("Missing 'name' table in font " + otfFile); } - - // read PostScript name, if any - if (nameTable.getPostScriptName() != null) + else { - String psName = nameTable.getPostScriptName(); - - String format; - if (ttf.getTableMap().get("CFF ") != null) + // read PostScript name, if any + if (nameTable.getPostScriptName() != null) { - format = "OTF"; - cffFontFiles.put(psName, otfFile); + String psName = nameTable.getPostScriptName(); + + String format; + if (ttf.getTableMap().get("CFF ") != null) + { + format = "OTF"; + cffFontFiles.put(psName, otfFile); + } + else + { + format = "TTF"; + ttfFontFiles.put(psName, otfFile); + } + + if (LOG.isTraceEnabled()) + { + LOG.trace(format +": '" + psName + "' / '" + nameTable.getFontFamily() + + "' / '" + nameTable.getFontSubFamily() + "'"); + } } else { - format = "TTF"; - ttfFontFiles.put(psName, otfFile); - } - - if (LOG.isTraceEnabled()) - { - LOG.trace(format +": '" + psName + "' / '" + nameTable.getFontFamily() + - "' / '" + nameTable.getFontSubFamily() + "'"); + LOG.warn("Missing 'name' entry for PostScript name in font " + otfFile); } } - else - { - throw new IOException("Missing 'name' entry for PostScript name"); - } } finally { Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFont.java Mon Aug 18 21:09:03 2014 @@ -69,18 +69,6 @@ public abstract class PDCIDFont extends } /** - * This will get the fonts bounding box. - * - * @return The fonts bounding box. - * @throws IOException If there is an error getting the font bounding box. - */ - @Override - public PDRectangle getFontBoundingBox() throws IOException - { - throw new RuntimeException("getFontBoundingBox(): Not yet implemented"); - } - - /** * This will get the default width. The default value for the default width is 1000. * * @return The default width for the glyphs in this font. Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType0.java Mon Aug 18 21:09:03 2014 @@ -50,7 +50,6 @@ public class PDCIDFontType0 extends PDCI private final Map<Integer, Float> glyphWidths = new HashMap<Integer, Float>(); private final Map<Integer, Float> glyphHeights = new HashMap<Integer, Float>(); private Float avgWidth = null; - private PDRectangle fontBBox = null; /** * Constructor. @@ -219,16 +218,6 @@ public class PDCIDFontType0 extends PDCI } @Override - public PDRectangle getFontBoundingBox() throws IOException - { - if (fontBBox == null) - { - fontBBox = new PDRectangle(cffFont.getFontBBox()); - } - return fontBBox; - } - - @Override public PDMatrix getFontMatrix() { if (fontMatrix == null) Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java Mon Aug 18 21:09:03 2014 @@ -38,6 +38,8 @@ import org.apache.pdfbox.cos.COSNumber; import org.apache.pdfbox.cos.COSStream; import org.apache.pdfbox.encoding.DictionaryEncoding; import org.apache.pdfbox.encoding.Encoding; +import org.apache.pdfbox.encoding.MacRomanEncoding; +import org.apache.pdfbox.encoding.WinAnsiEncoding; import org.apache.pdfbox.io.IOUtils; import org.apache.pdfbox.pdmodel.common.COSArrayList; import org.apache.pdfbox.pdmodel.common.COSObjectable; @@ -293,7 +295,7 @@ public abstract class PDFont implements * @param length The length of the data. * @return The width is in 1000 unit of text space, ie 333 or 777 */ - public float getFontWidth(byte[] c, int offset, int length) + public float getFontWidth(byte[] c, int offset, int length) throws IOException { int code = getCodeFromArray(c, offset, length); Float fontWidth = fontSizes.get(code); @@ -615,7 +617,22 @@ public abstract class PDFont implements */ public boolean isSymbolicFont() { - return getFontDescriptor().isSymbolic(); + if (getFontDescriptor() != null) + { + // fixme: isSymbolic() defaults to false if the flag is missing, which isn't useful! + // todo: what about isNonSymbolic()? + if (getFontDescriptor().isSymbolic()) // we can trust "true", but not "false" + { + return true; + } + } + + // fixme: this heuristic is a starting point only + if (fontEncoding instanceof MacRomanEncoding || fontEncoding instanceof WinAnsiEncoding) + { + return false; + } + return true; } /** @@ -700,23 +717,12 @@ public abstract class PDFont implements } /** - * This will get the fonts bounding box. - * - * @return The fonts bounding box. - * @throws IOException If there is an error getting the bounding box. - */ - public PDRectangle getFontBoundingBox() throws IOException - { - return getFontDescriptor().getFontBoundingBox(); - } - - /** * Determines the width of the given character. * * @param charCode the code of the given character * @return the width of the character */ - public float getFontWidth(int charCode) + public float getFontWidth(int charCode) throws IOException { float width = -1; int firstChar = getFirstChar(); Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java Mon Aug 18 21:09:03 2014 @@ -129,7 +129,7 @@ public class PDTrueTypeFont extends PDFo } @Override - public float getFontWidth(int charCode) + public float getFontWidth(int charCode) throws IOException { float width = super.getFontWidth(charCode); if (width <= 0) @@ -160,7 +160,7 @@ public class PDTrueTypeFont extends PDFo * @param code character code * @return GID (glyph index) */ - public int getGIDForCharacterCode(int code) + public int getGIDForCharacterCode(int code) throws IOException { extractCmapTable(); int result = 0; @@ -254,7 +254,7 @@ public class PDTrueTypeFont extends PDFo /** * extract all useful "cmap" subtables. */ - private void extractCmapTable() + private void extractCmapTable() throws IOException { if (cmapInitialized) { Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFontEmbedder.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFontEmbedder.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFontEmbedder.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFontEmbedder.java Mon Aug 18 21:09:03 2014 @@ -97,6 +97,7 @@ class PDTrueTypeFontEmbedder // creates a new font descriptor dictionary for the given TTF private PDFontDescriptorDictionary createFontDescriptor(COSDictionary dict, TrueTypeFont ttf) + throws IOException { PDFontDescriptorDictionary fd = new PDFontDescriptorDictionary(); Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java Mon Aug 18 21:09:03 2014 @@ -78,12 +78,6 @@ public class PDType0Font extends PDFont } @Override - public PDRectangle getFontBoundingBox() throws IOException - { - throw new RuntimeException("Not yet implemented"); - } - - @Override public float getFontWidth(byte[] c, int offset, int length) { return descendantFont.getFontWidth(c, offset, length); Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java Mon Aug 18 21:09:03 2014 @@ -131,7 +131,7 @@ public class PDType1CFont extends PDFont } @Override - public boolean hasGlyph(String name) + public boolean hasGlyph(String name) throws IOException { return type1Equivalent.hasGlyph(name); } @@ -174,7 +174,8 @@ public class PDType1CFont extends PDFont String character = getUnicode(bytes, offset, length); if (character == null) { - LOG.error("No character for code " + (bytes[offset] & 0xff) + " in " + fontName); + // todo: message is for debugging, remove in long term + LOG.warn("No character for code " + (bytes[offset] & 0xff) + " in " + fontName); return null; } return character; @@ -202,7 +203,8 @@ public class PDType1CFont extends PDFont String character = getFontEncoding().getCharacter(code); if (character == null) { - LOG.error("Could not get character " + code); + // todo: message is for debugging, remove in long term + LOG.warn("Could not get character " + code); } return character; } @@ -215,7 +217,8 @@ public class PDType1CFont extends PDFont if (isNotDef(name) && !Arrays.equals(SPACE_BYTES, bytes)) { - LOG.error("No name for code " + (bytes[offset] & 0xff) + " in " + fontName); + // todo: message is for debugging, remove in long term + LOG.warn("No name for code " + (bytes[offset] & 0xff) + " in " + fontName); return 0; } @@ -237,7 +240,8 @@ public class PDType1CFont extends PDFont if (isNotDef(name)) { - LOG.error("No name for code " + (bytes[offset] & 0xff) + " in " + fontName); + // todo: message is for debugging, remove in long term + LOG.warn("No name for code " + (bytes[offset] & 0xff) + " in " + fontName); return 0; } @@ -260,7 +264,8 @@ public class PDType1CFont extends PDFont String name = getFontEncoding().getNameForCharacter(character.charAt(0)); if (isNotDef(name)) { - LOG.error("No code for character " + character); + // todo: message is for debugging, remove in long term + LOG.warn("No code for character " + character); return 0; } width += getCharacterWidth(name); @@ -279,16 +284,6 @@ public class PDType1CFont extends PDFont } @Override - public PDRectangle getFontBoundingBox() throws IOException - { - if (fontBBox == null) - { - fontBBox = new PDRectangle(cffFont.getFontBBox()); // todo: cffFont could be null - } - return fontBBox; - } - - @Override public PDMatrix getFontMatrix() { if (fontMatrix == null) @@ -332,6 +327,7 @@ public class PDType1CFont extends PDFont Type1CharString charstring = cffFont.getType1CharString(name); if (charstring == notdef) { + // todo: message is for debugging, remove in long term LOG.warn("No width for character " + name + ", using .notdef"); } return charstring.getWidth(); Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Equivalent.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Equivalent.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Equivalent.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Equivalent.java Mon Aug 18 21:09:03 2014 @@ -19,7 +19,7 @@ public interface PDType1Equivalent /** * Returns true if the font contains a glyph with the given name. */ - public boolean hasGlyph(String name); + public boolean hasGlyph(String name) throws IOException; /** * Returns the glyph name for the given character code. Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java Mon Aug 18 21:09:03 2014 @@ -41,6 +41,7 @@ import org.apache.pdfbox.encoding.Type1E import org.apache.pdfbox.encoding.WinAnsiEncoding; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.common.PDMatrix; +import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.common.PDStream; import org.apache.pdfbox.util.ResourceLoader; @@ -348,7 +349,7 @@ public class PDType1Font extends PDFont } @Override - public float getFontWidth(int charCode) + public float getFontWidth(int charCode) throws IOException { float width = super.getFontWidth(charCode); if (width <= 0) @@ -422,7 +423,7 @@ public class PDType1Font extends PDFont } @Override - public boolean hasGlyph(String name) + public boolean hasGlyph(String name) throws IOException { return type1Equivalent.hasGlyph(name); } Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java Mon Aug 18 21:09:03 2014 @@ -70,8 +70,7 @@ public class PDType3Font extends PDFont * @return The fonts bounding box. * @throws IOException If there is an error getting the bounding box. */ - @Override - public PDRectangle getFontBoundingBox() throws IOException + public PDRectangle getBoundingBox() throws IOException { COSArray rect = (COSArray) dict.getDictionaryObject(COSName.FONT_BBOX); PDRectangle retval = null; Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/Glyph2D.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/Glyph2D.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/Glyph2D.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/Glyph2D.java Mon Aug 18 21:09:03 2014 @@ -20,6 +20,7 @@ package org.apache.pdfbox.rendering.font; import java.awt.geom.GeneralPath; +import java.io.IOException; /** * This interface is implemented by several font specific classes which is called to get the @@ -34,7 +35,7 @@ public interface Glyph2D * * @return the GeneralPath for the given character code */ - public GeneralPath getPathForCharacterCode(int code); + public GeneralPath getPathForCharacterCode(int code) throws IOException; /** * Remove all cached resources. Modified: pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java (original) +++ pdfbox/branches/no-awt/pdfbox/src/main/java/org/apache/pdfbox/rendering/font/TTFGlyph2D.java Mon Aug 18 21:09:03 2014 @@ -145,7 +145,7 @@ public class TTFGlyph2D implements Glyph } @Override - public GeneralPath getPathForCharacterCode(int code) + public GeneralPath getPathForCharacterCode(int code) throws IOException { int glyphId = getGIDForCharacterCode(code); @@ -167,7 +167,7 @@ public class TTFGlyph2D implements Glyph } // Try to map the given code to the corresponding glyph-ID - private int getGIDForCharacterCode(int code) + private int getGIDForCharacterCode(int code) throws IOException { if (isCIDFont) { @@ -186,17 +186,40 @@ public class TTFGlyph2D implements Glyph * * @return the GeneralPath for the given glyphId */ - public GeneralPath getPathForGlyphId(int glyphId) + public GeneralPath getPathForGlyphId(int glyphId) throws IOException { - GeneralPath glyphPath = null; + GeneralPath glyphPath; if (glyphs.containsKey(glyphId)) { glyphPath = glyphs.get(glyphId); } else { - GlyphData[] glyphData = ttf.getGlyph().getGlyphs(); - if (glyphId < glyphData.length && glyphData[glyphId] != null) + // fixme: TrueTypeFont is buggy so we have to catch RuntimeException for debugging + GlyphData[] glyphData; + try + { + glyphData = ttf.getGlyph().getGlyphs(); + } + catch (RuntimeException e) + { + throw new RuntimeException("Error in TTF:" + pdFont.getBaseFont() + " -> " + + ttf.getNaming().getPostScriptName(), e); + } + + if (glyphId >= glyphData.length) + { + LOG.warn(name + ": Glyph not found: " + glyphId); + glyphPath = new GeneralPath(); + glyphs.put(glyphId, glyphPath); + } + else if (glyphData[glyphId] == null) + { + // empty glyph (e.g. space, newline) + glyphPath = new GeneralPath(); + glyphs.put(glyphId, glyphPath); + } + else { GlyphData glyph = glyphData[glyphId]; glyphPath = glyph.getPath(); @@ -207,12 +230,8 @@ public class TTFGlyph2D implements Glyph } glyphs.put(glyphId, glyphPath); } - else - { - LOG.error(name + ": Glyph not found:" + glyphId); - } } - return glyphPath != null ? (GeneralPath) glyphPath.clone() : null; + return glyphPath != null ? (GeneralPath) glyphPath.clone() : null; // todo: expensive } @Override Modified: pdfbox/branches/no-awt/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType2Container.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType2Container.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType2Container.java (original) +++ pdfbox/branches/no-awt/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/CIDType2Container.java Mon Aug 18 21:09:03 2014 @@ -23,7 +23,11 @@ package org.apache.pdfbox.preflight.font import org.apache.fontbox.ttf.TrueTypeFont; import org.apache.pdfbox.pdmodel.font.PDFont; +import org.apache.pdfbox.preflight.PreflightConstants; import org.apache.pdfbox.preflight.font.util.CIDToGIDMap; +import org.apache.pdfbox.preflight.font.util.GlyphException; + +import java.io.IOException; public class CIDType2Container extends FontContainer { @@ -38,30 +42,37 @@ public class CIDType2Container extends F } @Override - protected float getFontProgramWidth(int cid) + protected float getFontProgramWidth(int cid) throws GlyphException { float foundWidth = -1; final int glyphIndex = getGlyphIndex(cid); - // if glyph exists we can check the width - if (this.ttf != null && this.ttf.getGlyph().getGlyphs().length > glyphIndex) + try { + // if glyph exists we can check the width + if (this.ttf != null && this.ttf.getGlyph().getGlyphs().length > glyphIndex) + { /* * In a Mono space font program, the length of the AdvanceWidth array must be one. According to the TrueType * font specification, the Last Value of the AdvanceWidth array is apply to the subsequent glyphs. So if the * GlyphId is greater than the length of the array the last entry is used. */ - int numberOfLongHorMetrics = ttf.getHorizontalHeader().getNumberOfHMetrics(); - int unitsPerEm = ttf.getHeader().getUnitsPerEm(); - int[] advanceGlyphWidths = ttf.getHorizontalMetrics().getAdvanceWidth(); - float glypdWidth = advanceGlyphWidths[numberOfLongHorMetrics - 1]; - if (glyphIndex < numberOfLongHorMetrics) - { - glypdWidth = advanceGlyphWidths[glyphIndex]; + int numberOfLongHorMetrics = ttf.getHorizontalHeader().getNumberOfHMetrics(); + int unitsPerEm = ttf.getHeader().getUnitsPerEm(); + int[] advanceGlyphWidths = ttf.getHorizontalMetrics().getAdvanceWidth(); + float glypdWidth = advanceGlyphWidths[numberOfLongHorMetrics - 1]; + if (glyphIndex < numberOfLongHorMetrics) + { + glypdWidth = advanceGlyphWidths[glyphIndex]; + } + foundWidth = ((glypdWidth * 1000) / unitsPerEm); } - foundWidth = ((glypdWidth * 1000) / unitsPerEm); + return foundWidth; + } + catch (IOException e) + { + throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH, cid, "Unexpected error during the width validtion for the character CID(" + cid+") : " + e.getMessage()); } - return foundWidth; } /** Modified: pdfbox/branches/no-awt/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java (original) +++ pdfbox/branches/no-awt/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/FontContainer.java Mon Aug 18 21:09:03 2014 @@ -21,6 +21,7 @@ package org.apache.pdfbox.preflight.font.container; +import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -110,10 +111,16 @@ public abstract class FontContainer { return; } - - final float expectedWidth = this.font.getFontWidth(cid); - final float foundWidth = getFontProgramWidth(cid); - checkWidthsConsistency(cid, expectedWidth, foundWidth); + try + { + final float expectedWidth = this.font.getFontWidth(cid); + final float foundWidth = getFontProgramWidth(cid); + checkWidthsConsistency(cid, expectedWidth, foundWidth); + } + catch (IOException e) + { + throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH, cid, "Unexpected error during the width validtion for the character CID(" + cid+") : " + e.getMessage()); + } } /** Modified: pdfbox/branches/no-awt/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/TrueTypeContainer.java URL: http://svn.apache.org/viewvc/pdfbox/branches/no-awt/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/TrueTypeContainer.java?rev=1618738&r1=1618737&r2=1618738&view=diff ============================================================================== --- pdfbox/branches/no-awt/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/TrueTypeContainer.java (original) +++ pdfbox/branches/no-awt/preflight/src/main/java/org/apache/pdfbox/preflight/font/container/TrueTypeContainer.java Mon Aug 18 21:09:03 2014 @@ -30,6 +30,8 @@ import org.apache.fontbox.ttf.CMAPTable; import org.apache.fontbox.ttf.TrueTypeFont; import org.apache.pdfbox.encoding.Encoding; import org.apache.pdfbox.pdmodel.font.PDFont; +import org.apache.pdfbox.preflight.PreflightConstants; +import org.apache.pdfbox.preflight.font.util.GlyphException; public class TrueTypeContainer extends FontContainer { @@ -65,14 +67,21 @@ public class TrueTypeContainer extends F if (this.cmapEncodingEntries != null) return; - CMAPTable cmap = this.ttFont.getCMAP(); - if (this.font.getFontDescriptor().isSymbolic()) + try { - this.cmapEncodingEntries = cmap.getCmaps(); + CMAPTable cmap = this.ttFont.getCMAP(); + if (this.font.getFontDescriptor().isSymbolic()) + { + this.cmapEncodingEntries = cmap.getCmaps(); + } + else + { + this.cmapEncodingEntries = orderCMapEntries(cmap); + } } - else + catch (IOException e) { - this.cmapEncodingEntries = orderCMapEntries(cmap); + return; } } @@ -111,22 +120,29 @@ public class TrueTypeContainer extends F } @Override - protected float getFontProgramWidth(int cid) + protected float getFontProgramWidth(int cid) throws GlyphException { - float result = -1f; - if (cmapEncodingEntries != null) + try { - for (CMAPEncodingEntry entry : cmapEncodingEntries) + float result = -1f; + if (cmapEncodingEntries != null) { - int glyphID = extractGlyphID(cid, entry); - if (glyphID > 0) + for (CMAPEncodingEntry entry : cmapEncodingEntries) { - result = extractGlyphWidth(glyphID); - break; + int glyphID = extractGlyphID(cid, entry); + if (glyphID > 0) + { + result = extractGlyphWidth(glyphID); + break; + } } } + return result; + } + catch (IOException e) + { + throw new GlyphException(PreflightConstants.ERROR_FONTS_GLYPH, cid, "Unexpected error during the width validtion for the character CID(" + cid+") : " + e.getMessage()); } - return result; } /** @@ -182,7 +198,7 @@ public class TrueTypeContainer extends F return cmap.getGlyphId(innerFontCid); } - private float extractGlyphWidth(int glyphID) + private float extractGlyphWidth(int glyphID) throws IOException { int unitsPerEm = this.ttFont.getHeader().getUnitsPerEm(); int[] glyphWidths = this.ttFont.getHorizontalMetrics().getAdvanceWidth();