/* * $Id: PDFFont.java,v 1.3 2007/08/26 19:00:11 gil1 Exp $ * * $Date: 2007/08/26 19:00:11 $ * * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package gnu.jpdf; import java.awt.Font; import java.io.IOException; import java.io.OutputStream; import java.io.Serializable; /** * This class defines a font within a PDF document. * * @author Peter T Mount,http://www.retep.org.uk/pdf/ * @author Eric Z. Beard, ericzbeard@hotmail.com * @author Gilbert DeLeeuw, gil1@users.sourceforge.net * @version $Revision: 1.3 $, $Date: 2007/08/26 19:00:11 $ */ public class PDFFont extends PDFObject implements Serializable { /* * NOTE: The original class is the work of Peter T. Mount, who released it * in the uk.org.retep.pdf package. It was modified by Eric Z. Beard as * follows: * The package name was changed to gnu.pdf. * The formatting was changed a little bit * It is still licensed under the LGPL. */ /** * The PDF document name of the font */ private String name; /** * The PDF type of the font, usually /Type1 */ private String type; /** * The font's real name */ private String font; /** * The name of the equivalent Java font */ private String javaFont; /** * The PDF Style, ie: BOLD, ITALIC, etc */ private int style; /** * This constructs a default PDFFont. In this case Helvetica */ protected PDFFont() { this("/F1","/Type1","Helvetica",Font.PLAIN); } /** * Constructs a PDFFont. This will attempt to map the font from a known * Java font name to that in PDF, defaulting to Helvetica if not possible. * * @param name The document name, ie /F1 * @param type The pdf type, ie /Type1 * @param font The font name, ie Helvetica * @param style The java.awt.Font style, ie: Font.PLAIN */ public PDFFont(String name,String type,String font,int style) { super("/Font"); this.name = name; this.type = type; this.style = style; String f = font.toLowerCase(); // default PDF Font name // this.font = base14[0][1]; // this.javaFont = base14[0][0]; this.font = font; this.javaFont = "/" + font; // attempt to translate the font name from Java to PDF for(int i=0;i<base14.length;i++) { if(base14[i][0].equals(f)) { this.javaFont = base14[i][0]; this.font = base14[i][1+style]; //System.out.println("Setting a font style to: " + this.font); break; } } } /** * This is the most common method to use. * @return the Font name within the PDF document. */ public String getName() { return name; } /** * @return the Font's PDF type */ public String getType() { return type; } /** * @return The PDF Font name */ public String getFont() { return font; } /** * @return the font style. * @see java.awt.Font */ public int getStyle() { return style; } /** * @param os OutputStream to send the object to * @exception IOException on error */ public void write(OutputStream os) throws IOException { // Write the object header writeStart(os); // now the objects body os.write("/Subtype ".getBytes()); os.write(type.getBytes()); os.write("\n/Name ".getBytes()); os.write(name.getBytes()); os.write("\n/BaseFont ".getBytes()); os.write(font.getBytes()); // The performance problem in Bug#106693 comments out the // encoding line, and removes the /WinAnsiEncoding. I'm going // to leave them in, as the Encoding fixes another problem. os.write("\n/Encoding ".getBytes()); os.write("/WinAnsiEncoding".getBytes()); //os.write(encoding.getBytes()); os.write("\n".getBytes()); // finish off with its footer writeEnd(os); } /** * This is used by the PDF and PDFPage classes to compare font names * * @param type The pdf type, ie /Type1 * @param font The font name, ie Helvetica * @param style The java.awt.Font style, ie: Font.PLAIN * @return true if this object is identical to this font's spec */ protected boolean equals(String type,String font,int style) { return this.type.equals(type) && (this.font.equalsIgnoreCase(font) || this.javaFont.equalsIgnoreCase(font)); // new styles not being picked up - ezb june 6 2001 // || this.javaFont.equalsIgnoreCase(font)); // Removed in fix for Bug#106693 //why? - ezb - can't find bug in bug tracker //&& this.style==style; } /** * This maps the standard JDK1.1 font names and styles to * the base 14 PDF fonts */ private static String[][] base14 = { // java name // NORMAL // BOLD // ITALIC // BOLD+ITALIC { "arial", "/Helvetica", "/Helvetica-Bold", "/Helvetica-Oblique", "/Helvetica-BoldOblique" }, { "sansserif", "/Helvetica", "/Helvetica-Bold", "/Helvetica-Oblique", "/Helvetica-BoldOblique" }, { "monospaced", "/Courier", "/Courier-Bold", "/Courier-Oblique", "/Courier-BoldOblique" }, { "timesroman", "/Times-Roman", "/Times-Bold", "/Times-Italic", "/Times-BoldItalic" }, { "courier", "/Courier", "/Courier-Bold", "/Courier-Oblique", "/Courier-BoldOblique" }, { "helvetica", "/Helvetica", "/Helvetica-Bold", "/Helvetica-Oblique", "/Helvetica-BoldOblique" }, { "dialog", "/Courier", "/Courier-Bold", "/Courier-Oblique", "/Courier-BoldOblique" }, { "dialoginput", "/Courier", "/Courier-Bold", "/Courier-Oblique", "/Courier-BoldOblique" }, }; }