/* * $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 */ @Override 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 */ @Override public void write(OutputStream os) throws IOException { // Write the object header writeStart(os); // now the objects body os.write("/Subtype ".getBytes("UTF-8")); os.write(type.getBytes("UTF-8")); os.write("\n/Name ".getBytes("UTF-8")); os.write(name.getBytes("UTF-8")); os.write("\n/BaseFont ".getBytes("UTF-8")); os.write(font.getBytes("UTF-8")); // 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("UTF-8")); os.write("/WinAnsiEncoding".getBytes("UTF-8")); //os.write(encoding.getBytes("UTF-8")); os.write("\n".getBytes("UTF-8")); // 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"},}; }