/* * $Id: PDFFontDescriptor.java,v 1.5 2010-05-23 22:07:05 lujke Exp $ * * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, * Santa Clara, California 95054, U.S.A. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package com.sun.pdfview.font; import java.awt.geom.Rectangle2D; import java.io.IOException; import com.sun.pdfview.PDFFile; import com.sun.pdfview.PDFObject; /** * * @author jkaplan */ public class PDFFontDescriptor { /** All glyphs have the same width. */ public final static int FIXED_PITCH = 1 << (1-1); /** Glyphs have serifs. */ public final static int SERIF = 1 << (2-1); /** Font contains glyphs outside the Adobe standard Latin. */ public final static int SYMBOLIC = 1 << (3-1); /** Glyphs resemble cursive handwriting. */ public final static int SCRIPT = 1 << (4-1); /** Font uses the Adobe standard Latic character set. */ public final static int NONSYMBOLIC = 1 << (6-1); /** Glyphs have dominant vertical strokes that are slanted. */ public final static int ITALIC = 1 << (7-1); /** Font contains no lowercase letters. */ public final static int ALLCAP = 1 << (17-1); /** Font contains both uppercase and lowercase letters.. */ public final static int SMALLCAP = 1 << (18-1); /** Determines whether bold glyphs shall be painted with * extra pixels even at very small text sizes. */ public final static int FORCEBOLD = 1 << (19-1); /** Holds value of property ascent. */ private int ascent; /** Holds value of property capHeight. */ private int capHeight; /** Holds value of property descent. */ private int descent; /** Holds value of property flags. */ private int flags; /** Holds the optional FontFamily (PDF 1.5) */ private String fontFamily; /** Holds value of property fontName. */ private String fontName; /** Holds the optional FontStretch (PDF 1.5) */ private String fontStretch; /** Holds the optional FontWeight (PDF 1.5) */ private int fontWeight; /** Holds value of property italicAngle. */ private int italicAngle; /** Holds value of property stemV. */ private int stemV; /** Holds value of property avgWidth. */ private int avgWidth = 0; /** Holds value of property fontFile. */ private PDFObject fontFile; /** Holds value of property fontFile2. */ private PDFObject fontFile2; /** Holds value of property fontFile3. */ private PDFObject fontFile3; /** Holds value of property leading. */ private int leading = 0; /** Holds value of property maxWidth. */ private int maxWidth = 0; /** Holds value of property misingWidth. */ private int missingWidth = 0; /** Holds value of property stemH. */ private int stemH = 0; /** Holds value of property xHeight. */ private int xHeight = 0; /** Holds value of property charSet. */ private PDFObject charSet; /** Holds value of property fontBBox. */ private Rectangle2D fontBBox; /** Creates a new instance of PDFFontDescriptor */ public PDFFontDescriptor(String basefont) { setFontName(basefont); // [[MW TODO: find basefont info and fill in the rest of the // descriptor?]] } /** Creates a new instance of PDFFontDescriptor */ public PDFFontDescriptor(PDFObject obj) throws IOException { // required parameters setAscent(obj.getDictRef("Ascent").getIntValue()); setCapHeight(obj.getDictRef("CapHeight").getIntValue()); setDescent(obj.getDictRef("Descent").getIntValue()); setFlags(obj.getDictRef("Flags").getIntValue()); setFontName(obj.getDictRef("FontName").getStringValue()); setItalicAngle(obj.getDictRef("ItalicAngle").getIntValue()); setStemV(obj.getDictRef("StemV").getIntValue()); // font bounding box setFontBBox(PDFFile.parseNormalisedRectangle(obj.getDictRef("FontBBox"))); // optional parameters if (obj.getDictionary().containsKey("AvgWidth")) { setAvgWidth(obj.getDictRef("AvgWidth").getIntValue()); } if (obj.getDictionary().containsKey("FontFile")) { setFontFile(obj.getDictRef("FontFile")); } if (obj.getDictionary().containsKey("FontFile2")) { setFontFile2(obj.getDictRef("FontFile2")); } if (obj.getDictionary().containsKey("FontFile3")) { setFontFile3(obj.getDictRef("FontFile3")); } if (obj.getDictionary().containsKey("Leading")) { setLeading(obj.getDictRef("Leading").getIntValue()); } if (obj.getDictionary().containsKey("MaxWidth")) { setMaxWidth(obj.getDictRef("MaxWidth").getIntValue()); } if (obj.getDictionary().containsKey("MissingWidth")) { setMissingWidth(obj.getDictRef("MissingWidth").getIntValue()); } if (obj.getDictionary().containsKey("StemH")) { setStemH(obj.getDictRef("StemH").getIntValue()); } if (obj.getDictionary().containsKey("XHeight")) { setXHeight(obj.getDictRef("XHeight").getIntValue()); } if (obj.getDictionary().containsKey("CharSet")) { setCharSet(obj.getDictRef("CharSet")); } if (obj.getDictionary().containsKey("FontFamily")) { setFontFamily(obj.getDictRef("FontFamily").getStringValue()); } if (obj.getDictionary().containsKey("FontWeight")) { setFontWeight(obj.getDictRef("FontWeight").getIntValue()); } if (obj.getDictionary().containsKey("FontStretch")) { setFontStretch(obj.getDictRef("FontStretch").getStringValue()); } } /** Getter for property ascent. * @return Value of property ascent. * */ public int getAscent() { return this.ascent; } /** Setter for property ascent. * @param ascent New value of property ascent. * */ public void setAscent(int ascent) { this.ascent = ascent; } /** Getter for property capHeight. * @return Value of property capHeight. * */ public int getCapHeight() { return this.capHeight; } /** Setter for property capHeight. * @param capHeight New value of property capHeight. * */ public void setCapHeight(int capHeight) { this.capHeight = capHeight; } /** Getter for property descent. * @return Value of property descent. * */ public int getDescent() { return this.descent; } /** Setter for property descent. * @param descent New value of property descent. * */ public void setDescent(int descent) { this.descent = descent; } /** Getter for property flags. * @return Value of property flags. * */ public int getFlags() { return this.flags; } /** Setter for property flags. * @param flags New value of property flags. * */ public void setFlags(int flags) { this.flags = flags; } /** Getter for property fontFamily. Option (PDF 1.5) * @return Value of the property fontFamily */ public String getFontFamily() { return this.fontFamily; } /** Setter for property fontFamily. * @param fontFamily New value of property fontFamily. * */ public void setFontFamily(String fontFamily) { this.fontFamily = fontFamily; } /** Getter for property fontName. * @return Value of property fontName. * */ public String getFontName() { return this.fontName; } /** Setter for property fontName. * @param fontName New value of property fontName. * */ public void setFontName(String fontName) { this.fontName = fontName; } /** Getter for property fontStretch. Option (PDF 1.5) * * @return Value of the property fontStretch */ public String getFontStretch() { return this.fontStretch; } /** Setter for property fontStretch. Possible values are: * UltraCondensed, ExtraCondensed, Condensed, SemiCondensed, * Normal, SemiExpanded, Expanded, ExtraExpanded or UltraExpanded * We do not check at this time. * * @param fontStretch New value of property fontStretch. * */ public void setFontStretch(String fontStretch) { this.fontStretch = fontStretch; } /** Getter for property fontWeight. Option (PDF 1.5) * * @return Value of the property fontWeight */ public int getFontWeight() { return this.fontWeight; } /** Setter for property fontWeight. Possible values are: * 100, 200, 300, 400, 500, 600, 700, 800, 900 * We do not check at this time. * * @param fontWeight New value of property fontWeight. * */ public void setFontWeight(int fontWeight) { this.fontWeight = fontWeight; } /** Getter for property italicAngle. * @return Value of property italicAngle. * */ public int getItalicAngle() { return this.italicAngle; } /** Setter for property italicAngle. * @param italicAngle New value of property italicAngle. * */ public void setItalicAngle(int italicAngle) { this.italicAngle = italicAngle; } /** Getter for property stemV. * @return Value of property stemV. * */ public int getStemV() { return this.stemV; } /** Setter for property stemV. * @param stemV New value of property stemV. * */ public void setStemV(int stemV) { this.stemV = stemV; } /** Getter for property avgWidth. * @return Value of property avgWidth. * */ public int getAvgWidth() { return this.avgWidth; } /** Setter for property avgWidth. * @param avgWidth New value of property avgWidth. * */ public void setAvgWidth(int avgWidth) { this.avgWidth = avgWidth; } /** Getter for property fontFile. * @return Value of property fontFile. * */ public PDFObject getFontFile() { return this.fontFile; } /** Setter for property fontFile. * @param fontFile New value of property fontFile. * */ public void setFontFile(PDFObject fontFile) { this.fontFile = fontFile; } /** Getter for property fontFile2. * @return Value of property fontFile2. * */ public PDFObject getFontFile2() { return this.fontFile2; } /** Setter for property fontFile2. * @param fontFile2 New value of property fontFile2. * */ public void setFontFile2(PDFObject fontFile2) { this.fontFile2 = fontFile2; } /** Getter for property fontFile3. * @return Value of property fontFile3. * */ public PDFObject getFontFile3() { return this.fontFile3; } /** Setter for property fontFile3. * @param fontFile3 New value of property fontFile3. * */ public void setFontFile3(PDFObject fontFile3) { this.fontFile3 = fontFile3; } /** Getter for property leading. * @return Value of property leading. * */ public int getLeading() { return this.leading; } /** Setter for property leading. * @param leading New value of property leading. * */ public void setLeading(int leading) { this.leading = leading; } /** Getter for property maxWidth. * @return Value of property maxWidth. * */ public int getMaxWidth() { return this.maxWidth; } /** Setter for property maxWidth. * @param maxWidth New value of property maxWidth. * */ public void setMaxWidth(int maxWidth) { this.maxWidth = maxWidth; } /** Getter for property misingWidth. * @return Value of property misingWidth. * */ public int getMissingWidth() { return this.missingWidth; } /** Setter for property misingWidth. * @param missingWidth New value of property misingWidth. */ public void setMissingWidth(int missingWidth) { this.missingWidth = missingWidth; } /** Getter for property stemH. * @return Value of property stemH. * */ public int getStemH() { return this.stemH; } /** Setter for property stemH. * @param stemH New value of property stemH. * */ public void setStemH(int stemH) { this.stemH = stemH; } /** Getter for property xHeight. * @return Value of property xHeight. * */ public int getXHeight() { return this.xHeight; } /** Setter for property xHeight. * @param xHeight New value of property xHeight. * */ public void setXHeight(int xHeight) { this.xHeight = xHeight; } /** Getter for property charSet. * @return Value of property charSet. * */ public PDFObject getCharSet() { return this.charSet; } /** Setter for property charSet. * @param charSet New value of property charSet. * */ public void setCharSet(PDFObject charSet) { this.charSet = charSet; } /** Getter for property fontBBox. * @return Value of property fontBBox. * */ public Rectangle2D getFontBBox() { return this.fontBBox; } /** Setter for property fontBBox. * @param fontBBox New value of property fontBBox. * */ public void setFontBBox(Rectangle2D fontBBox) { this.fontBBox = fontBBox; } }