/* * Copyright 1999-2004,2006 The Apache Software Foundation. * * Licensed 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; import org.apache.fop.fonts.FontType; /** * Class representing a /Font object. *
* 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. *
* Fonts are specified on page 198 and onwards of the PDF 1.3 spec.
*/
public class PDFFont extends PDFObject {
/**
* the internal name for the font (eg "F1")
*/
protected String fontname;
/**
* the font's subtype
* (as defined by the constants FontType: TYPE0, TYPE1, MMTYPE1, TYPE3, TRUETYPE)
*/
protected FontType 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 null
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, FontType 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
* @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,
FontType subtype, String basefont,
Object encoding) {
if (subtype == FontType.TYPE0) {
return new PDFFontType0(fontname, basefont,
encoding);
} else if ((subtype == FontType.TYPE1)
|| (subtype == FontType.MMTYPE1)) {
return new PDFFontType1(fontname, basefont,
encoding);
} else if (subtype == FontType.TYPE3) {
//return new PDFFontType3(number, fontname, basefont, encoding);
return null; //NYI
} else if (subtype == FontType.TRUETYPE) {
return new PDFFontTrueType(fontname, basefont,
encoding);
} else {
return null; // should not happend
}
}
/**
* 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
* @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,
FontType subtype, String basefont,
Object encoding, int firstChar,
int lastChar, PDFArray widths,
PDFFontDescriptor descriptor) {
PDFFontNonBase14 font;
if (subtype == FontType.TYPE0) {
font = new PDFFontType0(fontname, basefont,
encoding);
font.setDescriptor(descriptor);
return font;
} else if ((subtype == FontType.TYPE1)
|| (subtype == FontType.MMTYPE1)) {
font = new PDFFontType1(fontname, basefont,
encoding);
font.setWidthMetrics(firstChar, lastChar, widths);
font.setDescriptor(descriptor);
return font;
} else if (subtype == FontType.TYPE3) {
return null; //NYI, should not happend
} else if (subtype == FontType.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(FontType fontType) {
if (fontType == FontType.TYPE0) {
return fontType.getName();
} else if (fontType == FontType.TYPE1) {
return fontType.getName();
} else if (fontType == FontType.MMTYPE1) {
return fontType.getName();
} else if (fontType == FontType.TYPE3) {
return fontType.getName();
} else if (fontType == FontType.TRUETYPE) {
return fontType.getName();
} else {
throw new IllegalArgumentException("Unsupported font type: " + fontType.getName());
}
}
/**
* Validates the PDF object prior to serialization.
*/
protected void validate() {
if (getDocumentSafely().getPDFAMode().isPDFA1LevelB()) {
if (this.getClass() == PDFFont.class) {
throw new PDFConformanceException("For PDF/A-1, 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.
*
* 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 } }