blob: 46374d8692c7fe4ba38496add5406897aa02f6a9 [file] [log] [blame]
/*
* 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;
import org.apache.fop.fonts.CIDFontType;
// based on work by Takayuki Takeuchi
/**
* Class representing a "character identifier" font (p 210 and onwards).
*/
public class PDFCIDFont extends PDFObject {
private String basefont;
private CIDFontType cidtype;
private Integer dw;
private PDFWArray w;
private int[] dw2;
private PDFWArray w2;
private PDFCIDSystemInfo systemInfo;
private PDFCIDFontDescriptor descriptor;
private PDFCMap cmap;
/**
* /CIDToGIDMap (only for CIDFontType2, see p 212)
* can be either "Identity" (default) or a PDFStream
*/
private PDFStream cidMap;
/**
* Create the /Font object
* @param basefont Name of the basefont
* @param cidtype CID type
* @param dw default width
* @param w array of character widths
* @param registry name of the issuer
* @param ordering Unique name of the font
* @param supplement Supplement number
* @param descriptor CID font descriptor
*/
public PDFCIDFont( // CSOK: ParameterNumber
String basefont, CIDFontType cidtype, int dw,
int[] w, String registry, String ordering,
int supplement, PDFCIDFontDescriptor descriptor) {
this(basefont, cidtype, dw,
new PDFWArray(w),
new PDFCIDSystemInfo(registry, ordering, supplement),
descriptor);
}
/**
* Create the /Font object
* @param basefont Name of the basefont
* @param cidtype CID type
* @param dw default width
* @param w array of character widths
* @param systemInfo CID system info
* @param descriptor CID font descriptor
*/
public PDFCIDFont(String basefont, CIDFontType cidtype, int dw,
int[] w, PDFCIDSystemInfo systemInfo,
PDFCIDFontDescriptor descriptor) {
this(basefont, cidtype, dw,
new PDFWArray(w),
systemInfo,
descriptor);
}
/**
* Create the /Font object
* @param basefont Name of the basefont
* @param cidtype CID type
* @param dw default width
* @param w array of character widths
* @param systemInfo CID system info
* @param descriptor CID font descriptor
*/
public PDFCIDFont(String basefont, CIDFontType cidtype, int dw,
PDFWArray w, PDFCIDSystemInfo systemInfo,
PDFCIDFontDescriptor descriptor) {
super();
this.basefont = basefont;
this.cidtype = cidtype;
this.dw = new Integer(dw);
this.w = w;
this.dw2 = null;
this.w2 = null;
this.systemInfo = systemInfo;
this.descriptor = descriptor;
this.cidMap = null;
this.cmap = null;
}
/**
* Set the /DW attribute
* @param dw the default width
*/
public void setDW(int dw) {
this.dw = new Integer(dw);
}
/**
* Set the /W array
* @param w the width array
*/
public void setW(PDFWArray w) {
this.w = w;
}
/**
* Set the (two elements) /DW2 array
* @param dw2 the default metrics for vertical writing
*/
public void setDW2(int[] dw2) {
this.dw2 = dw2;
}
/**
* Set the two elements of the /DW2 array
* @param posY position vector
* @param displacementY displacement vector
*/
public void setDW2(int posY, int displacementY) {
this.dw2 = new int[] {
posY, displacementY
};
}
/**
* Set the CMap used as /ToUnicode cmap
* @param cmap character map
*/
public void setCMAP(PDFCMap cmap) {
this.cmap = cmap;
}
/**
* Set the /W2 array
* @param w2 array of metrics for vertical writing
*/
public void setW2(PDFWArray w2) {
this.w2 = w2;
}
/**
* Set the /CIDToGIDMap (to be used only for CIDFontType2)
* @param map mapping information
*/
public void setCIDMap(PDFStream map) {
this.cidMap = map;
}
/**
* Set the /CIDToGIDMap (to be used only for CIDFontType2) to "Identity"
*/
public void setCIDMapIdentity() {
this.cidMap = null; // not an error here, simply use the default
}
/**
* Returns the PDF name for a certain CID font type.
* @param cidFontType CID font type
* @return corresponding PDF name
*/
protected String getPDFNameForCIDFontType(CIDFontType cidFontType) {
if (cidFontType == CIDFontType.CIDTYPE0) {
return cidFontType.getName();
} else if (cidFontType == CIDFontType.CIDTYPE2) {
return cidFontType.getName();
} else {
throw new IllegalArgumentException("Unsupported CID font type: "
+ cidFontType.getName());
}
}
/**
* {@inheritDoc}
*/
public String toPDFString() {
StringBuffer p = new StringBuffer(128);
p.append("<< /Type /Font");
p.append("\n/BaseFont /");
p.append(this.basefont);
p.append(" \n/CIDToGIDMap ");
if (cidMap != null) {
p.append(cidMap.referencePDF());
} else {
p.append("/Identity");
//This is the default. We still write it because PDF/A requires it.
}
p.append(" \n/Subtype /");
p.append(getPDFNameForCIDFontType(this.cidtype));
p.append("\n");
p.append(systemInfo.toPDFString());
p.append("\n/FontDescriptor ");
p.append(this.descriptor.referencePDF());
if (cmap != null) {
p.append("\n/ToUnicode ");
p.append(cmap.referencePDF());
}
if (dw != null) {
p.append("\n/DW ");
p.append(this.dw);
}
if (w != null) {
p.append("\n/W ");
p.append(w.toPDFString());
}
if (dw2 != null) {
p.append("\n/DW2 ["); // always two values, see p 211
p.append(this.dw2[0]);
p.append(this.dw2[1]);
p.append("]");
}
if (w2 != null) {
p.append("\n/W2 ");
p.append(w2.toPDFString());
}
p.append("\n>>");
return p.toString();
}
}