blob: 987317b6d16413837be6d2d9b8ee2d02e1d7615b [file] [log] [blame]
/*
* 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.fop.render.pdf;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;
import org.junit.Assert;
import org.junit.Test;
import org.apache.commons.io.IOUtils;
import org.apache.fontbox.cff.CFFFont;
import org.apache.fontbox.cff.CFFParser;
import org.apache.fontbox.ttf.GlyphData;
import org.apache.fontbox.ttf.GlyphTable;
import org.apache.fontbox.type1.Type1Font;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.font.PDCIDFontType2;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.fop.render.pdf.pdfbox.FOPPDFMultiByteFont;
import org.apache.fop.render.pdf.pdfbox.FOPPDFSingleByteFont;
import org.apache.fop.render.pdf.pdfbox.FontContainer;
public class FOPPDFSingleMultiByteFontTestCase {
private COSDictionary getFont(PDDocument doc, String internalname) throws IOException {
PDPage page = doc.getDocumentCatalog().getPages().get(0);
PDResources sourcePageResources = page.getResources();
COSDictionary fonts = (COSDictionary)sourcePageResources.getCOSObject().getDictionaryObject(COSName.FONT);
return (COSDictionary) fonts.getDictionaryObject(internalname);
}
@Test
public void testCFF() throws Exception {
PDDocument doc = PDDocument.load(new File(PDFBoxAdapterTestCase.CFF1));
FOPPDFSingleByteFont sbfont = new FOPPDFSingleByteFont(getFont(doc, "R11"),
"MyriadPro-Regular_Type1f0encstdcs");
Assert.assertTrue(Arrays.asList(sbfont.getEncoding().getCharNameMap()).contains("bracketright"));
Assert.assertTrue(!Arrays.asList(sbfont.getEncoding().getCharNameMap()).contains("A"));
Assert.assertTrue(!Arrays.toString(sbfont.getEncoding().getUnicodeCharMap()).contains("A"));
Assert.assertEquals(sbfont.mapChar('A'), 0);
Assert.assertEquals(sbfont.getWidths().length, 28);
Assert.assertEquals(sbfont.getFirstChar(), 87);
Assert.assertEquals(sbfont.getLastChar(), 114);
PDDocument doc2 = PDDocument.load(new File(PDFBoxAdapterTestCase.CFF2));
String name = sbfont.addFont(getFont(doc2, "R11"));
Assert.assertTrue(name.contains("MyriadPro"));
Assert.assertEquals(sbfont.getFontName(), "MyriadPro-Regular_Type1f0encstdcs");
Assert.assertEquals(sbfont.getEncodingName(), "WinAnsiEncoding");
Assert.assertEquals(sbfont.mapChar('W'), 'W');
String x = IOUtils.toString(sbfont.getInputStream());
Assert.assertTrue(x, x.contains("Adobe Systems"));
Assert.assertEquals(sbfont.getEncoding().getName(), "FOPPDFEncoding");
Assert.assertTrue(Arrays.asList(sbfont.getEncoding().getCharNameMap()).contains("A"));
Assert.assertEquals(sbfont.getWidths().length, 65);
Assert.assertEquals(sbfont.getFirstChar(), 50);
Assert.assertEquals(sbfont.getLastChar(), 114);
Assert.assertEquals(sbfont.addFont(getFont(doc2, "R13")), null);
doc.close();
doc2.close();
}
@Test
public void testCFF2() throws Exception {
PDDocument doc = PDDocument.load(new File(PDFBoxAdapterTestCase.CFF3));
FOPPDFSingleByteFont sbfont = new FOPPDFSingleByteFont(getFont(doc, "T1_0"),
"Myriad_Pro_Type1f0encf1cs");
Assert.assertTrue(Arrays.asList(sbfont.getEncoding().getCharNameMap()).contains("uni004E"));
Assert.assertEquals(sbfont.getFontName(), "Myriad_Pro_Type1f0encf1cs");
Assert.assertEquals(sbfont.getEncodingName(), null);
byte[] is = IOUtils.toByteArray(sbfont.getInputStream());
CFFParser p = new CFFParser();
CFFFont ff = p.parse(is).get(0);
Assert.assertEquals(ff.getName(), "MNEACN+Myriad_Pro");
// Assert.assertEquals(ff.getCharset().getEntries().get(0).getSID(), 391);
doc.close();
}
@Test
public void testTTCID() throws Exception {
PDDocument doc = PDDocument.load(new File(PDFBoxAdapterTestCase.TTCID1));
FOPPDFMultiByteFont mbfont = new FOPPDFMultiByteFont(getFont(doc, "C2_0"),
"ArialMT_Type0");
mbfont.addFont(getFont(doc, "C2_0"));
Assert.assertEquals(mbfont.mapChar('t'), 67);
PDDocument doc2 = PDDocument.load(new File(PDFBoxAdapterTestCase.TTCID2));
String name = mbfont.addFont(getFont(doc2, "C2_0"));
Assert.assertEquals(name, "ArialMT_Type0");
Assert.assertEquals(mbfont.getFontName(), "ArialMT_Type0");
byte[] is = IOUtils.toByteArray(mbfont.getInputStream());
Assert.assertEquals(is.length, 38640);
doc.close();
doc2.close();
}
@Test
public void testTTSubset() throws Exception {
PDDocument doc = PDDocument.load(new File(PDFBoxAdapterTestCase.TTSubset1));
FOPPDFSingleByteFont mbfont = new FOPPDFSingleByteFont(getFont(doc, "R9"),
"TimesNewRomanPSMT_TrueType");
mbfont.addFont(getFont(doc, "R9"));
// Assert.assertEquals(mbfont.mapChar('t'), 116);
PDDocument doc2 = PDDocument.load(new File(PDFBoxAdapterTestCase.TTSubset2));
String name = mbfont.addFont(getFont(doc2, "R9"));
Assert.assertEquals(name, "TimesNewRomanPSMT_TrueType");
Assert.assertEquals(mbfont.getFontName(), "TimesNewRomanPSMT_TrueType");
byte[] is = IOUtils.toByteArray(mbfont.getInputStream());
Assert.assertEquals(is.length, 41112);
doc.close();
doc2.close();
}
@Test
public void testType1Subset() throws Exception {
PDDocument doc = PDDocument.load(new File(PDFBoxAdapterTestCase.Type1Subset1));
FOPPDFSingleByteFont mbfont = new FOPPDFSingleByteFont(getFont(doc, "F15"), "");
mbfont.addFont(getFont(doc, "F15"));
PDDocument doc2 = PDDocument.load(new File(PDFBoxAdapterTestCase.Type1Subset2));
mbfont.addFont(getFont(doc2, "F15"));
Type1Font f = Type1Font.createWithPFB(mbfont.getInputStream());
Set<String> csDict = new TreeSet<String>(f.getCharStringsDict().keySet());
Assert.assertEquals(csDict.toString(), "[.notdef, a, d, e, hyphen, l, m, n, p, s, space, t, two, x]");
Assert.assertEquals(f.getSubrsArray().size(), 518);
Assert.assertEquals(f.getFamilyName(), "Verdana");
doc.close();
doc2.close();
}
@Test
public void testHadMappingOperations() throws IOException {
PDDocument pdf = PDDocument.load(new File(PDFBoxAdapterTestCase.TTCID1));
COSDictionary font = getFont(pdf, "C2_0");
font.removeItem(COSName.TO_UNICODE);
FOPPDFMultiByteFont multiByteFont = new FOPPDFMultiByteFont(font, null);
Assert.assertTrue(multiByteFont.hadMappingOperations());
pdf.close();
}
@Test
public void testMappingNotFound() throws IOException {
PDDocument pdf = PDDocument.load(new File(PDFBoxAdapterTestCase.TTCID1));
final COSDictionary fontDict = getFont(pdf, "C2_0");
MyFOPPDFMultiByteFont multiByteFont = new MyFOPPDFMultiByteFont(fontDict, null);
PDType0Font font = (PDType0Font) multiByteFont.getFontContainer().getFont();
GlyphTable glyphTable = ((PDCIDFontType2)font.getDescendantFont()).getTrueTypeFont().getGlyph();
glyphTable.setGlyphs(new GlyphData[glyphTable.getGlyphs().length - 1]);
String ex = "";
try {
multiByteFont.addFont(fontDict);
} catch (IOException e) {
ex = e.getMessage();
}
Assert.assertEquals(ex, "Mapping not found in glyphData");
pdf.close();
}
private static class MyFOPPDFMultiByteFont extends FOPPDFMultiByteFont {
COSDictionary fontData;
MyFOPPDFMultiByteFont(COSDictionary fontData, String name) throws IOException {
super(fontData, name);
this.fontData = fontData;
}
FontContainer getFontContainer() throws IOException {
return getFont(fontData);
}
}
}