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