blob: 0945634dde366b2911f9ebf0968b7846444b5f4c [file] [log] [blame]
/*
* Copyright 1999-2004 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.FontInfo;
import org.apache.fop.fonts.Typeface;
import org.apache.fop.fonts.FontDescriptor;
// Java
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.HashMap;
import java.util.HashSet;
/**
* class representing a /Resources object.
*
* /Resources object contain a list of references to the fonts for the
* document
*/
public class PDFResources extends PDFObject {
/**
* /Font objects keyed by their internal name
*/
protected Map fonts = new HashMap();
/**
* Set of XObjects
*/
protected Set xObjects = new HashSet();
/**
* Set of patterns
*/
protected Set patterns = new HashSet();
/**
* Set of shadings
*/
protected Set shadings = new HashSet();
/**
* Set of ExtGStates
*/
protected Set gstates = new HashSet();
/**
* create a /Resources object.
*
* @param objnum the object's number
*/
public PDFResources(int objnum) {
/* generic creation of object */
super();
setObjectNumber(objnum);
}
/**
* add font object to resources list.
*
* @param font the PDFFont to add
*/
public void addFont(PDFFont font) {
this.fonts.put(font.getName(), font);
}
/**
* Add the fonts in the font info to this PDF document's Font Resources.
*
* @param doc PDF document to add fonts to
* @param fontInfo font info object to get font information from
*/
public void addFonts(PDFDocument doc, FontInfo fontInfo) {
Map fonts = fontInfo.getUsedFonts();
Iterator e = fonts.keySet().iterator();
while (e.hasNext()) {
String f = (String)e.next();
Typeface font = (Typeface)fonts.get(f);
FontDescriptor desc = null;
if (font instanceof FontDescriptor) {
desc = (FontDescriptor)font;
}
addFont(doc.getFactory().makeFont(
f, font.getFontName(), font.getEncoding(), font, desc));
}
}
/**
* Add a PDFGState to the resources.
*
* @param gs the PDFGState to add
*/
public void addGState(PDFGState gs) {
this.gstates.add(gs);
}
/**
* Add a Shading to the resources.
*
* @param theShading the shading to add
*/
public void addShading(PDFShading theShading) {
this.shadings.add(theShading);
}
/**
* Add the pattern to the resources.
*
* @param thePattern the pattern to add
*/
public void addPattern(PDFPattern thePattern) {
this.patterns.add(thePattern);
}
/**
* Add an XObject to the resources.
*
* @param xObject the XObject to add
*/
public void addXObject(PDFXObject xObject) {
this.xObjects.add(xObject);
}
/**
* represent the object in PDF
* This adds the references to all the objects in the current
* resource context.
*
* @return the PDF
* @see org.apache.fop.pdf.PDFObject#toPDFString()
*/
public String toPDFString() {
StringBuffer p = new StringBuffer(128);
p.append(getObjectID() + "<<\n");
if (!this.fonts.isEmpty()) {
p.append("/Font <<\n");
/* construct PDF dictionary of font object references */
Iterator fontIterator = this.fonts.keySet().iterator();
while (fontIterator.hasNext()) {
String fontName = (String)fontIterator.next();
p.append(" /" + fontName + " "
+ ((PDFFont)this.fonts.get(fontName)).referencePDF()
+ "\n");
}
p.append(">>\n");
}
PDFShading currentShading = null;
if (!this.shadings.isEmpty()) {
p.append("/Shading <<\n");
for (Iterator iter = shadings.iterator(); iter.hasNext();) {
currentShading = (PDFShading)iter.next();
p.append(" /" + currentShading.getName() + " "
+ currentShading.referencePDF() + " "); // \n ??????
}
p.append(">>\n");
}
// "free" the memory. Sorta.
currentShading = null;
PDFPattern currentPattern = null;
if (!this.patterns.isEmpty()) {
p.append("/Pattern <<\n");
for (Iterator iter = patterns.iterator(); iter.hasNext();) {
currentPattern = (PDFPattern)iter.next();
p.append(" /" + currentPattern.getName() + " "
+ currentPattern.referencePDF() + " ");
}
p.append(">>\n");
}
// "free" the memory. Sorta.
currentPattern = null;
p.append("/ProcSet [ /PDF /ImageB /ImageC /Text ]\n");
if (this.xObjects != null && !this.xObjects.isEmpty()) {
p = p.append("/XObject <<\n");
for (Iterator iter = xObjects.iterator(); iter.hasNext();) {
PDFXObject xobj = (PDFXObject)iter.next();
p = p.append(" /Im" + xobj.getXNumber() + " "
+ xobj.referencePDF()
+ "\n");
}
p = p.append(">>\n");
}
if (!this.gstates.isEmpty()) {
p = p.append("/ExtGState <<\n");
for (Iterator iter = gstates.iterator(); iter.hasNext();) {
PDFGState gs = (PDFGState)iter.next();
p = p.append(" /" + gs.getName() + " "
+ gs.referencePDF()
+ "\n");
}
p = p.append(">>\n");
}
p = p.append(">>\nendobj\n");
return p.toString();
}
}