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/06 19:58:46 UTC

svn commit: r1622898 - in /pdfbox/trunk: fontbox/src/main/java/org/apache/fontbox/ttf/ fontbox/src/test/java/org/apache/fontbox/ttf/ pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ pdfbox/src/test/java/org/apache/pdfbox/pdmodel/font/ preflight/src...

Author: jahewson
Date: Sat Sep  6 17:58:46 2014
New Revision: 1622898

URL: http://svn.apache.org/r1622898
Log:
PDFBOX-2322: Added basic support for OpenType fonts

Added:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/CFFTable.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OTFParser.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OTLTable.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OpenTypeFont.java
Modified:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFParser.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFTable.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TrueTypeFont.java
    pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/ttf/TestTTFParser.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ExternalFonts.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/FileSystemFontProvider.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFontEmbedder.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/font/TestTTFParser.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java

Added: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/CFFTable.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/CFFTable.java?rev=1622898&view=auto
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/CFFTable.java (added)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/CFFTable.java Sat Sep  6 17:58:46 2014
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.fontbox.ttf;
+
+import java.io.IOException;
+import org.apache.fontbox.cff.CFFFont;
+import org.apache.fontbox.cff.CFFParser;
+
+/**
+ * PostScript font program (compact font format).
+ */
+public class CFFTable extends TTFTable
+{
+    /**
+     * A tag that identifies this table type.
+     */
+    public static final String TAG = "CFF ";
+
+    private CFFFont cffFont;
+
+    /**
+     * This will read the required data from the stream.
+     *
+     * @param ttf The font that is being read.
+     * @param data The stream to read the data from.
+     * @throws java.io.IOException If there is an error reading the data.
+     */
+    public void read(TrueTypeFont ttf, TTFDataStream data) throws IOException
+    {
+        byte[] bytes = data.read((int)getLength());
+
+        CFFParser parser = new CFFParser();
+        cffFont = parser.parse(bytes).get(0);
+
+        initialized = true;
+    }
+
+    /**
+     * Returns the CFF font, which is a compact representation of a PostScript Type 1, or CIDFont
+     */
+    public CFFFont getFont()
+    {
+        return cffFont;
+    }
+}

Added: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OTFParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OTFParser.java?rev=1622898&view=auto
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OTFParser.java (added)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OTFParser.java Sat Sep  6 17:58:46 2014
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.fontbox.ttf;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * OpenType font file parser.
+ */
+public class OTFParser extends TTFParser
+{
+    /**
+     * Constructor.
+     */
+    public OTFParser()
+    {
+        super();
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param isEmbedded true if the font is embedded in PDF
+     */
+    public OTFParser(boolean isEmbedded)
+    {
+        this(isEmbedded, false);
+    }
+
+    /**
+     *  Constructor.
+     *
+     * @param isEmbedded true if the font is embedded in PDF
+     * @param parseOnDemand true if the tables of the font should be parsed on demand
+     */
+    public OTFParser(boolean isEmbedded, boolean parseOnDemand)
+    {
+        super(isEmbedded, parseOnDemand);
+    }
+
+    @Override
+    public OpenTypeFont parse(String file) throws IOException
+    {
+        return (OpenTypeFont)super.parse(file);
+    }
+
+    @Override
+    public OpenTypeFont parse(File file) throws IOException
+    {
+        return (OpenTypeFont)super.parse(file);
+    }
+
+    @Override
+    public OpenTypeFont parse(InputStream data) throws IOException
+    {
+        return (OpenTypeFont)super.parse(data);
+    }
+
+    @Override
+    public OpenTypeFont parse(TTFDataStream raf) throws IOException
+    {
+        return (OpenTypeFont)super.parse(raf);
+    }
+
+    @Override
+    protected OpenTypeFont newFont(TTFDataStream raf)
+    {
+        return new OpenTypeFont(raf);
+    }
+
+    @Override
+    protected TTFTable readTable(String tag)
+    {
+        // todo: this is a stub, a full implementation is needed
+
+        if (tag.equals("BASE") || tag.equals("GDEF") || tag.equals("GPOS") ||
+            tag.equals("GSUB") || tag.equals("JSTF"))
+        {
+            return new OTLTable();
+        }
+        else if (tag.equals("CFF "))
+        {
+            return new CFFTable();
+        }
+        else
+        {
+            return super.readTable(tag);
+        }
+    }
+}

Added: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OTLTable.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OTLTable.java?rev=1622898&view=auto
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OTLTable.java (added)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OTLTable.java Sat Sep  6 17:58:46 2014
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.fontbox.ttf;
+
+/**
+ * OpenType Layout (OTL) table. Uses the OpenType Layout Common Table Format.
+ */
+public class OTLTable extends TTFTable
+{
+    // todo: this is a stub, a full implementation is needed
+}

Added: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OpenTypeFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OpenTypeFont.java?rev=1622898&view=auto
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OpenTypeFont.java (added)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/OpenTypeFont.java Sat Sep  6 17:58:46 2014
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.fontbox.ttf;
+
+import java.io.IOException;
+
+/**
+ * An OpenType font.
+ */
+public class OpenTypeFont extends TrueTypeFont
+{
+    /**
+     * Constructor. Clients should use the OTFParser to create a new OpenTypeFont object.
+     *
+     * @param fontData The font data.
+     */
+    OpenTypeFont(TTFDataStream fontData)
+    {
+        super(fontData);
+    }
+
+    /**
+     * Get the "cmap" table for this TTF.
+     *
+     * @return The "cmap" table.
+     */
+    public synchronized CFFTable getCFF() throws IOException
+    {
+        CFFTable cmap = (CFFTable)tables.get(CFFTable.TAG);
+        if (cmap != null && !cmap.getInitialized())
+        {
+            readTable(cmap);
+        }
+        return cmap;
+    }
+
+    /**
+     * Returns true if this font is a PostScript outline font.
+     */
+    public boolean isPostScript()
+    {
+        return tables.containsKey(CFFTable.TAG);
+    }
+
+    /**
+     * Returns true if this font uses OpenType Layout (Advanced Typographic) tables.
+     */
+    public boolean hasLayoutTables()
+    {
+        return tables.containsKey("BASE") ||
+               tables.containsKey("GDEF") ||
+               tables.containsKey("GPOS") ||
+               tables.containsKey("GSUB") ||
+               tables.containsKey("JSTF");
+    }
+}

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFParser.java?rev=1622898&r1=1622897&r2=1622898&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFParser.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFParser.java Sat Sep  6 17:58:46 2014
@@ -67,9 +67,9 @@ public class TTFParser
      * @return A true type font.
      * @throws IOException If there is an error parsing the true type font.
      */
-    public TrueTypeFont parseTTF(String ttfFile) throws IOException
+    public TrueTypeFont parse(String ttfFile) throws IOException
     {
-        return parseTTF(new File(ttfFile));
+        return parse(new File(ttfFile));
     }
 
     /**
@@ -79,9 +79,9 @@ public class TTFParser
      * @return A true type font.
      * @throws IOException If there is an error parsing the true type font.
      */
-    public TrueTypeFont parseTTF(File ttfFile) throws IOException
+    public TrueTypeFont parse(File ttfFile) throws IOException
     {
-        return parseTTF(new RAFDataStream(ttfFile, "r"));
+        return parse(new RAFDataStream(ttfFile, "r"));
     }
 
     /**
@@ -91,9 +91,9 @@ public class TTFParser
      * @return A true type font.
      * @throws IOException If there is an error parsing the true type font.
      */
-    public TrueTypeFont parseTTF(InputStream ttfData) throws IOException
+    public TrueTypeFont parse(InputStream ttfData) throws IOException
     {
-        return parseTTF(new MemoryTTFDataStream(ttfData));
+        return parse(new MemoryTTFDataStream(ttfData));
     }
 
     /**
@@ -103,9 +103,9 @@ public class TTFParser
      * @return A true type font.
      * @throws IOException If there is an error parsing the true type font.
      */
-    public TrueTypeFont parseTTF(TTFDataStream raf) throws IOException
+    public TrueTypeFont parse(TTFDataStream raf) throws IOException
     {
-        TrueTypeFont font = new TrueTypeFont(raf);
+        TrueTypeFont font = newFont(raf);
         font.setVersion(raf.read32Fixed());
         int numberOfTables = raf.readUnsignedShort();
         int searchRange = raf.readUnsignedShort();
@@ -125,6 +125,11 @@ public class TTFParser
         return font;
     }
 
+    protected TrueTypeFont newFont(TTFDataStream raf)
+    {
+        return new TrueTypeFont(raf);
+    }
+
     /**
      * Parse all tables and check if all needed tables are present.
      *
@@ -195,61 +200,66 @@ public class TTFParser
 
     private TTFTable readTableDirectory(TTFDataStream raf) throws IOException
     {
-        TTFTable retval = null;
+        TTFTable table = null;
         String tag = raf.readString(4);
         if (tag.equals(CmapTable.TAG))
         {
-            retval = new CmapTable();
+            table = new CmapTable();
         }
         else if (tag.equals(GlyphTable.TAG))
         {
-            retval = new GlyphTable();
+            table = new GlyphTable();
         }
         else if (tag.equals(HeaderTable.TAG))
         {
-            retval = new HeaderTable();
+            table = new HeaderTable();
         }
         else if (tag.equals(HorizontalHeaderTable.TAG))
         {
-            retval = new HorizontalHeaderTable();
+            table = new HorizontalHeaderTable();
         }
         else if (tag.equals(HorizontalMetricsTable.TAG))
         {
-            retval = new HorizontalMetricsTable();
+            table = new HorizontalMetricsTable();
         }
         else if (tag.equals(IndexToLocationTable.TAG))
         {
-            retval = new IndexToLocationTable();
+            table = new IndexToLocationTable();
         }
         else if (tag.equals(MaximumProfileTable.TAG))
         {
-            retval = new MaximumProfileTable();
+            table = new MaximumProfileTable();
         }
         else if (tag.equals(NamingTable.TAG))
         {
-            retval = new NamingTable();
+            table = new NamingTable();
         }
         else if (tag.equals(OS2WindowsMetricsTable.TAG))
         {
-            retval = new OS2WindowsMetricsTable();
+            table = new OS2WindowsMetricsTable();
         }
         else if (tag.equals(PostScriptTable.TAG))
         {
-            retval = new PostScriptTable();
+            table = new PostScriptTable();
         }
         else if (tag.equals(DigitalSignatureTable.TAG))
         {
-            retval = new DigitalSignatureTable();
+            table = new DigitalSignatureTable();
         }
         else
         {
-            // unknown table type but read it anyway.
-            retval = new TTFTable();
+            table = readTable(tag);
         }
-        retval.setTag(tag);
-        retval.setCheckSum(raf.readUnsignedInt());
-        retval.setOffset(raf.readUnsignedInt());
-        retval.setLength(raf.readUnsignedInt());
-        return retval;
+        table.setTag(tag);
+        table.setCheckSum(raf.readUnsignedInt());
+        table.setOffset(raf.readUnsignedInt());
+        table.setLength(raf.readUnsignedInt());
+        return table;
+    }
+
+    protected TTFTable readTable(String tag)
+    {
+        // unknown table type but read it anyway.
+        return new TTFTable();
     }
 }

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFTable.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFTable.java?rev=1622898&r1=1622897&r2=1622898&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFTable.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFTable.java Sat Sep  6 17:58:46 2014
@@ -23,7 +23,7 @@ import java.io.IOException;
  * 
  * @author Ben Litchfield (ben@benlitchfield.com)
  */
-public class TTFTable 
+public class TTFTable
 {
     private String tag;
     private long checkSum;

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TrueTypeFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TrueTypeFont.java?rev=1622898&r1=1622897&r2=1622898&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TrueTypeFont.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TrueTypeFont.java Sat Sep  6 17:58:46 2014
@@ -38,7 +38,7 @@ public class TrueTypeFont implements Typ
     private int numberOfGlyphs = -1;
     private int unitsPerEm = -1;
     private int[] advanceWidths = null;
-    private Map<String,TTFTable> tables = new HashMap<String,TTFTable>();
+    protected Map<String,TTFTable> tables = new HashMap<String,TTFTable>();
     private TTFDataStream data;
     private Map<String, Integer> postScriptNames;
     

Modified: pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/ttf/TestTTFParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/ttf/TestTTFParser.java?rev=1622898&r1=1622897&r2=1622898&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/ttf/TestTTFParser.java (original)
+++ pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/ttf/TestTTFParser.java Sat Sep  6 17:58:46 2014
@@ -45,7 +45,7 @@ public class TestTTFParser extends TestC
         //Set the default to something not UTC and see if a UTC timeZone is returned
         TimeZone.setDefault(TimeZone.getTimeZone("America/Los Angeles"));
         TTFParser parser = new TTFParser();
-        TrueTypeFont ttf = parser.parseTTF(testFile);
+        TrueTypeFont ttf = parser.parse(testFile);
         Calendar created = ttf.getHeader().getCreated();
         assertEquals(created.getTimeZone(), utc);
 

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ExternalFonts.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ExternalFonts.java?rev=1622898&r1=1622897&r2=1622898&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ExternalFonts.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/ExternalFonts.java Sat Sep  6 17:58:46 2014
@@ -70,7 +70,7 @@ public final class ExternalFonts
                 throw new IOException("Error loading resource: " + ttfName);
             }
             TTFParser ttfParser = new TTFParser();
-            ttfFallbackFont = ttfParser.parseTTF(ttfStream);
+            ttfFallbackFont = ttfParser.parse(ttfStream);
 
             // cff
             String cffName = "org/apache/pdfbox/resources/otf/AdobeBlank.otf";

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/FileSystemFontProvider.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/FileSystemFontProvider.java?rev=1622898&r1=1622897&r2=1622898&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/FileSystemFontProvider.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/FileSystemFontProvider.java Sat Sep  6 17:58:46 2014
@@ -105,7 +105,7 @@ final class FileSystemFontProvider imple
         TrueTypeFont ttf = null;
         try
         {
-            ttf = ttfParser.parseTTF(otfFile);
+            ttf = ttfParser.parse(otfFile);
         }
         catch (NullPointerException e) // TTF parser is buggy
         {
@@ -204,7 +204,7 @@ final class FileSystemFontProvider imple
             TTFParser ttfParser = new TTFParser(false, true);
             try
             {
-                ttf = ttfParser.parseTTF(file);
+                ttf = ttfParser.parse(file);
 
                 ttfFonts.put(postScriptName, ttf);
                 if (LOG.isDebugEnabled())

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java?rev=1622898&r1=1622897&r2=1622898&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java Sat Sep  6 17:58:46 2014
@@ -24,6 +24,8 @@ import org.apache.commons.logging.LogFac
 import org.apache.fontbox.cmap.CMap;
 import org.apache.fontbox.ttf.CmapSubtable;
 import org.apache.fontbox.ttf.CmapTable;
+import org.apache.fontbox.ttf.OTFParser;
+import org.apache.fontbox.ttf.OpenTypeFont;
 import org.apache.fontbox.ttf.TTFParser;
 import org.apache.fontbox.ttf.TrueTypeFont;
 import org.apache.fontbox.util.BoundingBox;
@@ -63,16 +65,7 @@ public class PDCIDFontType2 extends PDCI
 
         PDFontDescriptorDictionary fd = (PDFontDescriptorDictionary) getFontDescriptor();
         PDStream ff2Stream = fd.getFontFile2();
-        
-        if (ff2Stream == null)
-        {
-            PDStream ff3Stream = fd.getFontFile3();
-            if (ff3Stream != null)
-            {
-                LOG.info("fontfile3 not supported yet, subType is " + 
-                        ff3Stream.getStream().getNameAsString(COSName.SUBTYPE));
-            }
-        }
+        PDStream ff3Stream = fd.getFontFile3();
 
         if (ff2Stream != null)
         {
@@ -80,7 +73,7 @@ public class PDCIDFontType2 extends PDCI
             {
                 // embedded
                 TTFParser ttfParser = new TTFParser(true);
-                ttf = ttfParser.parseTTF(ff2Stream.createInputStream());
+                ttf = ttfParser.parse(ff2Stream.createInputStream());
                 isEmbedded = true;
             }
             catch (NullPointerException e) // TTF parser is buggy
@@ -92,6 +85,38 @@ public class PDCIDFontType2 extends PDCI
                 throw new IOException("Could not read embedded TTF for font " + getBaseFont(), e);
             }
         }
+        else if (ff3Stream != null)
+        {
+            try
+            {
+                // embedded
+                OTFParser otfParser = new OTFParser(true);
+                OpenTypeFont otf = otfParser.parse(ff3Stream.createInputStream());
+                ttf = otf;
+                isEmbedded = true;
+
+                if (otf.isPostScript())
+                {
+                    // todo: we need more abstraction to support CFF fonts here
+                    throw new IOException("Not implemented: OpenType font with CFF table " +
+                                          getBaseFont());
+                }
+
+                if (otf.hasLayoutTables())
+                {
+                    LOG.error("OpenType Layout tables used in font " + getBaseFont() +
+                              " are not implemented in PDFBox and will be ignored");
+                }
+            }
+            catch (NullPointerException e) // TTF parser is buggy
+            {
+                throw new IOException("Could not read embedded OTF for font " + getBaseFont(), e);
+            }
+            catch (IOException e)
+            {
+                throw new IOException("Could not read embedded OTF for font " + getBaseFont(), e);
+            }
+        }
         else
         {
             // substitute

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java?rev=1622898&r1=1622897&r2=1622898&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java Sat Sep  6 17:58:46 2014
@@ -105,7 +105,7 @@ public class PDTrueTypeFont extends PDSi
                 {
                     // embedded
                     TTFParser ttfParser = new TTFParser(true);
-                    ttfFont = ttfParser.parseTTF(ff2Stream.createInputStream());
+                    ttfFont = ttfParser.parse(ff2Stream.createInputStream());
                 }
                 catch (NullPointerException e) // TTF parser is buggy
                 {

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFontEmbedder.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFontEmbedder.java?rev=1622898&r1=1622897&r2=1622898&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFontEmbedder.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFontEmbedder.java Sat Sep  6 17:58:46 2014
@@ -84,7 +84,7 @@ class PDTrueTypeFontEmbedder
         try
         {
             stream2 = stream.createInputStream();
-            ttf = new TTFParser().parseTTF(stream2);
+            ttf = new TTFParser().parse(stream2);
             fd = createFontDescriptor(dict, ttf);
         }
         finally

Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/font/TestTTFParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/font/TestTTFParser.java?rev=1622898&r1=1622897&r2=1622898&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/font/TestTTFParser.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/font/TestTTFParser.java Sat Sep  6 17:58:46 2014
@@ -50,7 +50,7 @@ public class TestTTFParser
 
         TTFParser parser = new TTFParser();
 
-        TrueTypeFont arial = parser.parseTTF(arialIs);
+        TrueTypeFont arial = parser.parse(arialIs);
 
         CmapTable cmap = arial.getCmap();
         Assert.assertNotNull(cmap);

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java?rev=1622898&r1=1622897&r2=1622898&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/CIDType2DescriptorHelper.java Sat Sep  6 17:58:46 2014
@@ -106,7 +106,7 @@ public class CIDType2DescriptorHelper ex
              * According to PDF Reference, CIDFontType2 is a TrueType font. Remark : Java.awt.Font throws exception when
              * a CIDFontType2 is parsed even if it is valid.
              */
-            ttf = new TTFParser(true).parseTTF(new ByteArrayInputStream(fontFile.getByteArray()));
+            ttf = new TTFParser(true).parse(new ByteArrayInputStream(fontFile.getByteArray()));
             this.fContainer.setTtf(ttf);
         }
         catch (Exception e)

Modified: pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java?rev=1622898&r1=1622897&r2=1622898&view=diff
==============================================================================
--- pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java (original)
+++ pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/descriptor/TrueTypeDescriptorHelper.java Sat Sep  6 17:58:46 2014
@@ -81,7 +81,7 @@ public class TrueTypeDescriptorHelper ex
         {
 
             bis = new ByteArrayInputStream(fontFile.getByteArray());
-            TrueTypeFont ttf = new TTFParser(true).parseTTF(bis);
+            TrueTypeFont ttf = new TTFParser(true).parse(bis);
 
             if (fontDescriptor.isSymbolic() && ttf.getCmap().getCmaps().length != 1)
             {