Java tutorial
/* * 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.pdfbox; import java.io.IOException; import java.io.InputStream; import java.util.Collections; import java.util.List; import org.apache.commons.io.IOUtils; import org.apache.fontbox.cmap.CMap; import org.apache.fontbox.cmap.CMapParser; import org.apache.fontbox.util.BoundingBox; import org.apache.pdfbox.cos.COSArray; import org.apache.pdfbox.cos.COSBase; import org.apache.pdfbox.cos.COSDictionary; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.cos.COSStream; import org.apache.pdfbox.pdmodel.common.COSArrayList; import org.apache.pdfbox.pdmodel.font.PDCIDFont; import org.apache.pdfbox.pdmodel.font.PDFont; import org.apache.pdfbox.pdmodel.font.PDFontFactory; import org.apache.pdfbox.pdmodel.font.PDSimpleFont; import org.apache.pdfbox.pdmodel.font.PDType0Font; import org.apache.pdfbox.pdmodel.font.encoding.BuiltInEncoding; import org.apache.pdfbox.pdmodel.font.encoding.DictionaryEncoding; import org.apache.pdfbox.pdmodel.font.encoding.Encoding; public class FontContainer { private COSDictionary dict; private List<Integer> widths; PDFont font; FontContainer(COSDictionary fontData) throws IOException { dict = fontData; font = PDFontFactory.createFont(fontData); } int getFirstChar() { return dict.getInt(COSName.FIRST_CHAR); } int getLastChar() { return dict.getInt(COSName.LAST_CHAR); } CMap getToUnicodeCMap() throws IOException { COSBase base = dict.getDictionaryObject(COSName.TO_UNICODE); if (font instanceof PDType0Font && base == null) { PDCIDFont cidFont = ((PDType0Font) font).getDescendantFont(); base = cidFont.getCOSObject().getDictionaryObject(COSName.TO_UNICODE); } if (base instanceof COSName) { // predefined CMap String name = ((COSName) base).getName(); CMapParser parser = new CMapParser(); return parser.parsePredefined(name); } else if (base instanceof COSStream) { // embedded CMap InputStream input = null; try { input = ((COSStream) base).getUnfilteredStream(); CMapParser parser = new CMapParser(); return parser.parse(input); } finally { IOUtils.closeQuietly(input); } } else { // throw new IOException("Expected Name or Stream"); } return null; } COSBase getToUnicode() { return dict.getDictionaryObject(COSName.TO_UNICODE); } List<Integer> getWidths() { if (widths == null) { COSArray array = (COSArray) dict.getDictionaryObject(COSName.WIDTHS); if (array != null) { widths = COSArrayList.convertIntegerCOSArrayToList(array); } else { widths = Collections.emptyList(); } } return widths; } Encoding getEncoding() { if (font instanceof PDSimpleFont) { if (((PDSimpleFont) font).getEncoding() instanceof DictionaryEncoding) { return new DictionaryEncoding((COSDictionary) ((PDSimpleFont) font).getEncoding().getCOSObject(), true, null); } return ((PDSimpleFont) font).getEncoding(); } return null; } String getBaseEncodingName() { Encoding encoding = getEncoding(); if (encoding != null && !(encoding instanceof BuiltInEncoding)) { COSBase cosObject = encoding.getCOSObject(); if (cosObject != null) { if (cosObject instanceof COSDictionary) { COSBase item = ((COSDictionary) cosObject).getItem(COSName.BASE_ENCODING); if (item != null) { return ((COSName) item).getName(); } } else if (cosObject instanceof COSName) { return ((COSName) cosObject).getName(); } else { throw new RuntimeException(cosObject.toString() + " not supported"); } } } return null; } float[] getBoundingBox() throws IOException { BoundingBox bb = font.getBoundingBox(); return new float[] { bb.getLowerLeftX(), bb.getLowerLeftY(), bb.getUpperRightX(), bb.getUpperRightY() }; } }