FOP-2754: Error when merging True Type font with CFF PDF font

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop-pdf-images/trunk@1814217 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java b/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java
index d11439d..df24f73 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java
@@ -44,6 +44,7 @@
 import org.apache.pdfbox.cos.COSString;
 
 import org.apache.pdfbox.pdmodel.common.PDStream;
+import org.apache.pdfbox.pdmodel.font.PDCIDFont;
 import org.apache.pdfbox.pdmodel.font.PDCIDFontType0;
 import org.apache.pdfbox.pdmodel.font.PDCIDFontType2;
 import org.apache.pdfbox.pdmodel.font.PDFont;
@@ -164,22 +165,22 @@
         if (font.getName() != null) {
             String extra = "";
             String name = getName(font.getName()) + "_" + ((COSName)fontData.getItem(COSName.SUBTYPE)).getName();
-            if (font instanceof PDType0Font
-                    && ((PDType0Font) font).getDescendantFont() instanceof PDCIDFontType0) {
-                CFFFont cffFont = ((PDCIDFontType0) ((PDType0Font) font).getDescendantFont()).getCFFFont();
-                if (cffFont instanceof CFFCIDFont
-                        && ((CFFCIDFont)cffFont).getFdSelect().getClass().getName()
-                        .equals("org.apache.fontbox.cff.CFFParser$Format0FDSelect")) {
-                    extra += "format0";
+            if (font instanceof PDType0Font) {
+                PDCIDFont descendantFont = ((PDType0Font) font).getDescendantFont();
+                if (descendantFont instanceof PDCIDFontType0) {
+                    CFFFont cffFont = ((PDCIDFontType0) descendantFont).getCFFFont();
+                    if (cffFont instanceof CFFCIDFont
+                            && ((CFFCIDFont) cffFont).getFdSelect().getClass().getName()
+                            .equals("org.apache.fontbox.cff.CFFParser$Format0FDSelect")) {
+                        extra += "format0";
+                    }
+                    return name + extra + "cff";
+                } else if (descendantFont instanceof PDCIDFontType2 && fontContainer.getToUnicode() != null) {
+                    if (!isSubsetFont(font.getName())) {
+                        extra = "f3";
+                    }
+                    return name + extra;
                 }
-                return name + extra;
-            } else if (font instanceof PDType0Font
-                    && fontContainer.getToUnicode() != null
-                    && ((PDType0Font) font).getDescendantFont() instanceof PDCIDFontType2) {
-                if (!isSubsetFont(font.getName())) {
-                    extra = "f3";
-                }
-                return name + extra;
             } else if (font instanceof PDTrueTypeFont && isSubsetFont(font.getName())) {
                 TrueTypeFont tt = ((PDTrueTypeFont) font).getTrueTypeFont();
                 for (CmapSubtable c : tt.getCmap().getCmaps()) {
diff --git a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
index a8507cb..102cc0e 100644
--- a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
@@ -113,6 +113,8 @@
     private static final String ERROR = "test/resources/error.pdf";
     private static final String LIBREOFFICE = "test/resources/libreoffice.pdf";
     private static final String SMASK = "test/resources/smask.pdf";
+    private static final String TYPE0TT = "test/resources/type0tt.pdf";
+    private static final String TYPE0CFF = "test/resources/type0cff.pdf";
 
     private static PDFPage getPDFPage(PDFDocument doc) {
         final Rectangle2D r = new Rectangle2D.Double();
@@ -158,7 +160,18 @@
         Assert.assertTrue(msg, msg.contains("/URWChanceryL-MediItal_Type1 20 Tf"));
         msg = writeText(fi, Type1Subset4);
         Assert.assertTrue(msg, msg.contains("/F15-1521012718 40 Tf"));
+        parseFonts(fi);
+    }
 
+    @Test
+    public void testMergeTTCFF() throws IOException {
+        FontInfo fi = new FontInfo();
+        writeText(fi, TYPE0TT);
+        writeText(fi, TYPE0CFF);
+        parseFonts(fi);
+    }
+
+    private void parseFonts(FontInfo fi) throws IOException {
         for (Typeface font : fi.getUsedFonts().values()) {
             InputStream is = ((CustomFont) font).getInputStream();
             if (font.getFontType() == FontType.TYPE1C || font.getFontType() == FontType.CIDTYPE0) {
diff --git a/test/resources/type0cff.pdf b/test/resources/type0cff.pdf
new file mode 100644
index 0000000..ea3535d
--- /dev/null
+++ b/test/resources/type0cff.pdf
Binary files differ
diff --git a/test/resources/type0tt.pdf b/test/resources/type0tt.pdf
new file mode 100644
index 0000000..08bf94a
--- /dev/null
+++ b/test/resources/type0tt.pdf
Binary files differ