You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by je...@apache.org on 2003/03/27 11:23:37 UTC
cvs commit: xml-fop/src/java/org/apache/fop/pdf PDFFilterList.java
jeremias 2003/03/27 02:23:37
Added: src/java/org/apache/fop/pdf PDFFilterList.java
Log:
This class represents a list of PDF filters to be applied when serializing the output of a PDF object.
It also contains a method to build the filter lists from an Avalon Configuration object.
Revision Changes Path
1.1 xml-fop/src/java/org/apache/fop/pdf/PDFFilterList.java
Index: PDFFilterList.java
===================================================================
/*
* $Id$
* ============================================================================
* The Apache Software License, Version 1.1
* ============================================================================
*
* Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modifica-
* tion, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The end-user documentation included with the redistribution, if any, must
* include the following acknowledgment: "This product includes software
* developed by the Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself, if
* and wherever such third-party acknowledgments normally appear.
*
* 4. The names "FOP" and "Apache Software Foundation" must not be used to
* endorse or promote products derived from this software without prior
* written permission. For written permission, please contact
* apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache", nor may
* "Apache" appear in their name, without prior written permission of the
* Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
* DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ============================================================================
*
* This software consists of voluntary contributions made by many individuals
* on behalf of the Apache Software Foundation and was originally created by
* James Tauber <jt...@jtauber.com>. For more information on the Apache
* Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.fop.pdf;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
/**
* This class represents a list of PDF filters to be applied when serializing
* the output of a PDF object.
*/
public class PDFFilterList {
/** Key for the default filter */
public static final String DEFAULT_FILTER = "default";
/** Key for the filter used for normal content*/
public static final String CONTENT_FILTER = "content";
/** Key for the filter used for images */
public static final String IMAGE_FILTER = "image";
/** Key for the filter used for JPEG images */
public static final String JPEG_FILTER = "jpeg";
/** Key for the filter used for fonts */
public static final String FONT_FILTER = "font";
private List filters = new java.util.ArrayList();
private boolean ignoreASCIIFilters = false;
/**
* Default constructor.
* <p>
* The flag for ignoring ASCII filters defaults to false.
*/
public PDFFilterList() {
//nop
}
/**
* Use this descriptor if you want to have ASCII filters (such as ASCIIHex
* and ASCII85) ignored, for example, when encryption is active.
* @param ignoreASCIIFilters true if ASCII filters should be ignored
*/
public PDFFilterList(boolean ignoreASCIIFilters) {
this.ignoreASCIIFilters = ignoreASCIIFilters;
}
/**
* Indicates whether the filter list is already initialized.
* @return true if more there are filters present
*/
public boolean isInitialized() {
return this.filters.size() > 0;
}
/**
* Add a filter for compression of the stream. Filters are
* applied in the order they are added. This should always be a
* new instance of the particular filter of choice. The applied
* flag in the filter is marked true after it has been applied to the
* data.
* @param filter filter to add
*/
public void addFilter(PDFFilter filter) {
if (filter != null) {
if (this.ignoreASCIIFilters && filter.isASCIIFilter()) {
return; //ignore ASCII filter
}
filters.add(filter);
}
}
/**
* Add a filter for compression of the stream by name.
* @param filterType name of the filter to add
*/
public void addFilter(String filterType) {
if (filterType == null) {
return;
}
if (filterType.equals("flate")) {
addFilter(new FlateFilter());
} else if (filterType.equals("ascii-85")) {
if (this.ignoreASCIIFilters) {
return; //ignore ASCII filter
}
addFilter(new ASCII85Filter());
} else if (filterType.equals("ascii-hex")) {
if (this.ignoreASCIIFilters) {
return; //ignore ASCII filter
}
addFilter(new ASCIIHexFilter());
} else if (filterType.equals("")) {
return;
} else {
throw new IllegalArgumentException(
"Unsupported filter type in stream-filter-list: " + filterType);
}
}
/**
* Checks the filter list for the DCT filter and adds it in the correct
* place if necessary.
*/
public void ensureDCTFilterInPlace() {
if (this.filters.size() == 0) {
addFilter(new DCTFilter());
} else {
if (!(this.filters.get(0) instanceof DCTFilter)) {
this.filters.add(0, new DCTFilter());
}
}
}
/**
* Adds the default filters to this stream.
* @param filters Map of filters
* @param type which filter list to modify
*/
public void addDefaultFilters(Map filters, String type) {
List filterset = null;
if (filters != null) {
filterset = (List)filters.get(type);
if (filterset == null) {
filterset = (List)filters.get(DEFAULT_FILTER);
}
}
if (filterset == null || filterset.size() == 0) {
// built-in default to flate
//addFilter(new FlateFilter());
} else {
for (int i = 0; i < filterset.size(); i++) {
String v = (String)filterset.get(i);
addFilter(v);
}
}
}
/**
* Apply the filters to the data
* in the order given and return the /Filter and /DecodeParms
* entries for the stream dictionary. If the filters have already
* been applied to the data (either externally, or internally)
* then the dictionary entries are built and returned.
* @return a String representing the filter list
*/
protected String buildFilterDictEntries() {
if (filters != null && filters.size() > 0) {
List names = new java.util.ArrayList();
List parms = new java.util.ArrayList();
// run the filters
for (int count = 0; count < filters.size(); count++) {
PDFFilter filter = (PDFFilter)filters.get(count);
// place the names in our local vector in reverse order
names.add(0, filter.getName());
parms.add(0, filter.getDecodeParms());
}
// now build up the filter entries for the dictionary
return buildFilterEntries(names) + buildDecodeParms(parms);
}
return "";
}
private String buildFilterEntries(List names) {
boolean needFilterEntry = false;
StringBuffer sb = new StringBuffer(64);
sb.append("/Filter [ ");
for (int i = 0; i < names.size(); i++) {
final String name = (String)names.get(i);
if (name.length() > 0) {
needFilterEntry = true;
sb.append(name);
sb.append(" ");
}
}
if (needFilterEntry) {
sb.append("]");
return sb.toString();
} else {
return "";
}
}
private String buildDecodeParms(List parms) {
StringBuffer sb = new StringBuffer();
boolean needParmsEntry = false;
sb.append("/DecodeParms ");
if (parms.size() > 1) {
sb.append("[ ");
}
for (int count = 0; count < parms.size(); count++) {
String s = (String)parms.get(count);
if (s != null) {
sb.append(s);
needParmsEntry = true;
} else {
sb.append("null");
}
sb.append(" ");
}
if (parms.size() > 1) {
sb.append("]");
}
if (needParmsEntry) {
return sb.toString();
} else {
return "";
}
}
/**
* Applies all registered filters as necessary. The method returns an
* OutputStream which will receive the filtered contents.
* @param stream raw data output stream
* @return OutputStream filtered output stream
* @throws IOException In case of an I/O problem
*/
public OutputStream applyFilters(OutputStream stream) throws IOException {
OutputStream out = stream;
if (filters != null) {
for (int count = filters.size() - 1; count >= 0; count--) {
PDFFilter filter = (PDFFilter)filters.get(count);
out = filter.applyFilter(out);
}
}
return out;
}
/**
* Builds a filter map from an Avalon Configuration object.
* @param cfg the Configuration object
* @return Map the newly built filter map
* @throws ConfigurationException if a filter list is defined twice
*/
public static Map buildFilterMapFromConfiguration(Configuration cfg)
throws ConfigurationException {
Map filterMap = new java.util.HashMap();
Configuration[] filterLists = cfg.getChildren("filterList");
for (int i = 0; i < filterLists.length; i++) {
Configuration filters = filterLists[i];
String type = filters.getAttribute("type", null);
Configuration[] filt = filters.getChildren("value");
List filterList = new java.util.ArrayList();
for (int j = 0; j < filt.length; j++) {
String name = filt[j].getValue();
filterList.add(name);
}
if (type == null) {
type = PDFFilterList.DEFAULT_FILTER;
}
if (filterMap.get(type) != null) {
throw new ConfigurationException("A filterList of type '"
+ type + "' has already been defined");
}
filterMap.put(type, filterList);
}
return filterMap;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: fop-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: fop-cvs-help@xml.apache.org