- /*
- * 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();
- }
-
- }
-
|