blob: 83dfadcb3a8b95e486f1054beb3bf4e0cf6e0a3b [file]
/*
* 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.
*/
/* $Id$ */
package org.apache.fop.pdf;
/**
* Class representing a /Font object.
* <p>
* A more complete object expressing the base font name and encoding of a
* font along with an internal name for the font used within
* streams of content.
* <p>
* Fonts are specified on page 198 and onwards of the PDF 1.3 spec.
*/
public class PDFFont extends PDFObject {
/* Copied from FOray PDFFont.java */
/** Font subtype indicating a composite font. */
public static final byte TYPE0 = 0;
/** Font subtype indicating a Type 1 simple font. */
public static final byte TYPE1 = 1;
/** Font subtype indicating a Multiple Master Type 1 simple font. */
public static final byte MMTYPE1 = 2;
/** Font subtype indicating a Type 3 simple font. */
public static final byte TYPE3 = 3;
/** Font subtype indicating a TrueType simple font. */
public static final byte TRUETYPE = 4;
/** Unknown font type. */
public static final byte OTHER = 5;
/** Font subtype names as output in the PDF. */
protected static final String[] TYPE_NAMES /* The order is important here. */
= {"Type0", "Type1", "MMType1", "Type3", "TrueType", "Other" };
/* End of copy from PDFFont.java */
/**
* the internal name for the font (eg "F1")
*/
protected String fontname;
/**
* the font's subtype
* (as defined by the constants in PDFFont: TYPE0, TYPE1, MMTYPE1, TYPE3, TRUETYPE)
*/
protected byte subtype;
/**
* the base font name (eg "Helvetica")
*/
protected String basefont;
/**
* the character encoding scheme used by the font.
* It can be a String for standard encodings, or
* a PDFEncoding for a more complex scheme, or
* a PDFStream containing a CMap in a Type0 font.
* If <code>null</code> then not written out in the PDF.
*/
protected Object encoding;
/**
* the Unicode mapping mechanism
*/
// protected PDFToUnicode mapping;
/**
* create the /Font object
*
* @param fontname the internal name for the font
* @param subtype the font's subtype
* @param basefont the base font name
* @param encoding the character encoding schema used by the font
*/
public PDFFont(String fontname, byte subtype,
String basefont,
Object encoding /* , PDFToUnicode mapping */) {
/* generic creation of PDF object */
super();
/* set fields using paramaters */
this.fontname = fontname;
this.subtype = subtype;
this.basefont = basefont;
this.encoding = encoding;
// this.mapping = mapping;
}
/**
* factory method with the basic parameters
*
* @param fontname the internal name for the font
* @param subtype the font's subtype (one of TYPE0, TYPE1, MMTYPE1, TYPE3 or TRUETYPE)
* @param basefont the base font name
* @param encoding the character encoding schema used by the font
* @return the generated PDFFont object
*/
public static PDFFont createFont(String fontname,
byte subtype, String basefont,
Object encoding) {
if (subtype == TYPE0) {
return new PDFFontType0(fontname, basefont,
encoding);
} else if ((subtype == TYPE1)
|| (subtype == MMTYPE1)) {
return new PDFFontType1(fontname, basefont, encoding);
} else if (subtype == TYPE3) {
// //return new PDFFontType3(number, fontname, basefont, encoding);
return null; //NYI
} else if (subtype == TRUETYPE) {
return new PDFFontTrueType(fontname, basefont, encoding);
} else {
return null; // should not happen
}
}
/**
* factory method with the extended parameters
* for Type1, MMType1 and TrueType
*
* @param fontname the internal name for the font
* @param subtype the font's subtype (one of TYPE0, TYPE1, MMTYPE1, TYPE3 or TRUETYPE)
* @param basefont the base font name
* @param encoding the character encoding schema used by the font
* @param firstChar the first character code in the font
* @param lastChar the last character code in the font
* @param widths an array of size (lastChar - firstChar +1)
* @param descriptor the descriptor for other font's metrics
* @return the generated PDFFont object
*/
public static PDFFont createFont(String fontname,
byte subtype, String basefont,
Object encoding, int firstChar,
int lastChar, PDFArray widths,
PDFFontDescriptor descriptor) {
PDFFontNonBase14 font;
if (subtype == TYPE0) {
font = new PDFFontType0(fontname, basefont,
encoding);
font.setDescriptor(descriptor);
return font;
} else if ((subtype == TYPE1)
|| (subtype == MMTYPE1)) {
font = new PDFFontType1(fontname, basefont,
encoding);
font.setWidthMetrics(firstChar, lastChar, widths);
font.setDescriptor(descriptor);
return font;
} else if (subtype == TYPE3) {
return null; //NYI, should not happend
} else if (subtype == TRUETYPE) {
font = new PDFFontTrueType(fontname, basefont,
encoding);
font.setWidthMetrics(firstChar, lastChar, widths);
font.setDescriptor(descriptor);
return font;
} else {
return null; // should not happend
}
}
/**
* get the internal name used for this font
* @return the internal name
*/
public String getName() {
return this.fontname;
}
/**
* Returns the PDF name for a certain font type.
* @param fontType font type
* @return String corresponding PDF name
*/
protected String getPDFNameForFontType(byte fontType) {
switch (fontType) {
case TYPE0:
case TYPE1:
case MMTYPE1:
case TYPE3:
case TRUETYPE: return TYPE_NAMES[fontType];
default:
throw new IllegalArgumentException("Unsupported font type");
}
}
/**
* Validates the PDF object prior to serialization.
*/
protected void validate() {
if (getDocumentSafely().getProfile().isFontEmbeddingRequired()) {
if (this.getClass() == PDFFont.class) {
throw new PDFConformanceException("For " + getDocumentSafely().getProfile()
+ ", all fonts, even the base 14"
+ " fonts, have to be embedded! Offending font: " + this.basefont);
}
}
}
/**
* @see org.apache.fop.pdf.PDFObject#toPDFString()
*/
public String toPDFString() {
validate();
StringBuffer p = new StringBuffer(128);
p.append(getObjectID());
p.append("<< /Type /Font\n/Subtype /"
+ getPDFNameForFontType(this.subtype)
+ "\n/Name /" + this.fontname
+ "\n/BaseFont /" + this.basefont);
if (encoding != null) {
p.append("\n/Encoding ");
if (encoding instanceof PDFEncoding) {
p.append(((PDFEncoding)this.encoding).referencePDF());
} else if (encoding instanceof PDFStream) {
p.append(((PDFStream)this.encoding).referencePDF());
} else {
p.append("/").append((String)encoding);
}
}
fillInPDF(p);
p.append(" >>\nendobj\n");
return p.toString();
}
/**
* This method is called to receive the specifics for the font's subtype.
* <p>
* The given buffer already contains the fields common to all font types.
*
* @param target the buffer to be completed with the type specific fields
*/
protected void fillInPDF(StringBuffer target) {
//nop
}
}