blob: bf2799c70a9e4c3024cef37a1840fe94818a47fe [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;
// Java
import java.util.Collections;
import java.util.Set;
/**
* Class representing an /Encoding object.
*
* A small object expressing the base encoding name and
* the differences from the base encoding.
*
* The three base encodings are given by their name.
*
* Encodings are specified in section 5.5.5 of the PDF 1.4 spec.
*/
public class PDFEncoding extends PDFDictionary {
/** the name for the standard encoding scheme */
public static final String STANDARD_ENCODING = "StandardEncoding";
/** the name for the Mac Roman encoding scheme */
public static final String MAC_ROMAN_ENCODING = "MacRomanEncoding";
/** the name for the Mac Export encoding scheme */
public static final String MAC_EXPERT_ENCODING = "MacExpertEncoding";
/** the name for the WinAnsi encoding scheme */
public static final String WIN_ANSI_ENCODING = "WinAnsiEncoding";
/** the name for the PDF document encoding scheme */
public static final String PDF_DOC_ENCODING = "PDFDocEncoding";
/** the set of predefined encodings that can be assumed present in a PDF viewer */
private static final Set PREDEFINED_ENCODINGS;
static {
Set encodings = new java.util.HashSet();
encodings.add(STANDARD_ENCODING);
encodings.add(MAC_ROMAN_ENCODING);
encodings.add(MAC_EXPERT_ENCODING);
encodings.add(WIN_ANSI_ENCODING);
encodings.add(PDF_DOC_ENCODING);
PREDEFINED_ENCODINGS = Collections.unmodifiableSet(encodings);
}
/**
* Create a new /Encoding object.
*
* @param basename the name of the character encoding schema
*/
public PDFEncoding(String basename) {
super();
put("Type", new PDFName("Encoding"));
if (basename != null) {
put("BaseEncoding", new PDFName(basename));
}
}
/**
* Indicates whether a given encoding is one of the predefined encodings.
* @param name the encoding name (ex. "StandardEncoding")
* @return true if it is a predefined encoding
*/
public static boolean isPredefinedEncoding(String name) {
return PREDEFINED_ENCODINGS.contains(name);
}
/**
* Creates and returns a new DifferencesBuilder instance for constructing the Differences
* array.
* @return the DifferencesBuilder
*/
public DifferencesBuilder createDifferencesBuilder() {
return new DifferencesBuilder();
}
/**
* Sets the Differences value.
* @param differences the differences.
*/
public void setDifferences(PDFArray differences) {
put("Differences", differences);
}
/**
* Builder class for constructing the Differences array.
*/
public class DifferencesBuilder {
private PDFArray differences = new PDFArray();
private int currentCode = -1;
/**
* Start a new difference.
* @param code the starting code index inside the encoding
* @return this builder instance
*/
public DifferencesBuilder addDifference(int code) {
this.currentCode = code;
this.differences.add(new Integer(code));
return this;
}
/**
* Adds a character name to the current difference.
* @param name the character name
* @return this builder instance
*/
public DifferencesBuilder addName(String name) {
if (this.currentCode < 0) {
throw new IllegalStateException("addDifference(int) must be called first");
}
this.differences.add(new PDFName(name));
return this;
}
/**
* Indicates whether any differences have been recorded.
* @return true if there are differences.
*/
public boolean hasDifferences() {
return (this.differences.length() > 0);
}
/**
* Creates and returns the PDFArray representing the Differences entry.
* @return the Differences entry
*/
public PDFArray toPDFArray() {
return this.differences;
}
}
/*
* example (p. 214)
* 25 0 obj
* <<
* /Type /Encoding
* /Differences [39 /quotesingle 96 /grave 128
* /Adieresis /Aring /Ccedilla /Eacute /Ntilde
* /Odieresis /Udieresis /aacute /agrave]
* >>
* endobj
*/
}