1 17 18 19 20 package org.apache.fop.pdf; 21 22 import java.io.IOException ; 23 import java.io.OutputStream ; 24 import java.util.List ; 25 import java.util.Map ; 26 27 import org.apache.commons.logging.Log; 29 import org.apache.commons.logging.LogFactory; 30 31 import org.apache.avalon.framework.configuration.Configuration; 33 import org.apache.avalon.framework.configuration.ConfigurationException; 34 35 39 public class PDFFilterList { 40 41 42 public static final String DEFAULT_FILTER = "default"; 43 44 public static final String CONTENT_FILTER = "content"; 45 46 public static final String IMAGE_FILTER = "image"; 47 48 public static final String JPEG_FILTER = "jpeg"; 49 50 public static final String TIFF_FILTER = "tiff"; 51 52 public static final String FONT_FILTER = "font"; 53 54 public static final String METADATA_FILTER = "metadata"; 55 56 private List filters = new java.util.ArrayList (); 57 58 private boolean ignoreASCIIFilters = false; 59 60 63 protected static Log logger = LogFactory.getLog("org.apache.fop.render"); 64 65 70 public PDFFilterList() { 71 } 73 74 79 public PDFFilterList(boolean ignoreASCIIFilters) { 80 this.ignoreASCIIFilters = ignoreASCIIFilters; 81 } 82 83 87 public boolean isInitialized() { 88 return this.filters.size() > 0; 89 } 90 91 99 public void addFilter(PDFFilter filter) { 100 if (filter != null) { 101 if (this.ignoreASCIIFilters && filter.isASCIIFilter()) { 102 return; } 104 filters.add(filter); 105 } 106 } 107 108 112 public void addFilter(String filterType) { 113 if (filterType == null) { 114 return; 115 } 116 if (filterType.equals("flate")) { 117 addFilter(new FlateFilter()); 118 } else if (filterType.equals("null")) { 119 addFilter(new NullFilter()); 120 } else if (filterType.equals("ascii-85")) { 121 if (this.ignoreASCIIFilters) { 122 return; } 124 addFilter(new ASCII85Filter()); 125 } else if (filterType.equals("ascii-hex")) { 126 if (this.ignoreASCIIFilters) { 127 return; } 129 addFilter(new ASCIIHexFilter()); 130 } else if (filterType.equals("")) { 131 return; 132 } else { 133 throw new IllegalArgumentException ( 134 "Unsupported filter type in stream-filter-list: " + filterType); 135 } 136 } 137 138 143 public void ensureFilterInPlace(PDFFilter pdfFilter) { 144 if (this.filters.size() == 0) { 145 addFilter(pdfFilter); 146 } else { 147 if (!(this.filters.get(0).equals(pdfFilter))) { 148 this.filters.add(0, pdfFilter); 149 } 150 } 151 } 152 153 158 public void addDefaultFilters(Map filters, String type) { 159 List filterset = null; 160 if (filters != null) { 161 filterset = (List )filters.get(type); 162 if (filterset == null) { 163 filterset = (List )filters.get(DEFAULT_FILTER); 164 } 165 } 166 if (filterset == null || filterset.size() == 0) { 167 if (METADATA_FILTER.equals(type)) { 168 addFilter(new NullFilter()); 170 } else if (JPEG_FILTER.equals(type)) { 171 addFilter(new NullFilter()); 173 } else if (TIFF_FILTER.equals(type)) { 174 addFilter(new NullFilter()); 176 } else { 177 addFilter(new FlateFilter()); 179 } 180 } else { 181 for (int i = 0; i < filterset.size(); i++) { 182 String v = (String )filterset.get(i); 183 addFilter(v); 184 } 185 } 186 } 187 188 196 protected String buildFilterDictEntries() { 197 if (filters != null && filters.size() > 0) { 198 List names = new java.util.ArrayList (); 199 List parms = new java.util.ArrayList (); 200 201 int nonNullParams = 0; 203 for (int count = 0; count < filters.size(); count++) { 204 PDFFilter filter = (PDFFilter)filters.get(count); 205 if (filter.getName().length() > 0) { 207 names.add(0, filter.getName()); 208 if (filter.getDecodeParms() != null) { 209 parms.add(0, filter.getDecodeParms()); 210 nonNullParams++; 211 } else { 212 parms.add(0, null); 213 } 214 } 215 } 216 217 return buildFilterEntries(names) 219 + (nonNullParams > 0 ? buildDecodeParms(parms) : ""); 220 } 221 return ""; 222 223 } 224 225 private String buildFilterEntries(List names) { 226 int filterCount = 0; 227 StringBuffer sb = new StringBuffer (64); 228 for (int i = 0; i < names.size(); i++) { 229 final String name = (String )names.get(i); 230 if (name.length() > 0) { 231 filterCount++; 232 sb.append(name); 233 sb.append(" "); 234 } 235 } 236 if (filterCount > 0) { 237 if (filterCount > 1) { 238 return "/Filter [ " + sb.toString() + "]"; 239 } else { 240 return "/Filter " + sb.toString(); 241 } 242 } else { 243 return ""; 244 } 245 } 246 247 private String buildDecodeParms(List parms) { 248 StringBuffer sb = new StringBuffer (); 249 boolean needParmsEntry = false; 250 sb.append("\n/DecodeParms "); 251 252 if (parms.size() > 1) { 253 sb.append("[ "); 254 } 255 for (int count = 0; count < parms.size(); count++) { 256 String s = (String )parms.get(count); 257 if (s != null) { 258 sb.append(s); 259 needParmsEntry = true; 260 } else { 261 sb.append("null"); 262 } 263 sb.append(" "); 264 } 265 if (parms.size() > 1) { 266 sb.append("]"); 267 } 268 if (needParmsEntry) { 269 return sb.toString(); 270 } else { 271 return ""; 272 } 273 } 274 275 276 283 public OutputStream applyFilters(OutputStream stream) throws IOException { 284 OutputStream out = stream; 285 if (filters != null) { 286 for (int count = filters.size() - 1; count >= 0; count--) { 287 PDFFilter filter = (PDFFilter)filters.get(count); 288 out = filter.applyFilter(out); 289 } 290 } 291 return out; 292 } 293 294 300 public static Map buildFilterMapFromConfiguration(Configuration cfg) 301 throws ConfigurationException { 302 Map filterMap = new java.util.HashMap (); 303 Configuration[] filterLists = cfg.getChildren("filterList"); 304 for (int i = 0; i < filterLists.length; i++) { 305 Configuration filters = filterLists[i]; 306 String type = filters.getAttribute("type", null); 307 Configuration[] filt = filters.getChildren("value"); 308 List filterList = new java.util.ArrayList (); 309 for (int j = 0; j < filt.length; j++) { 310 String name = filt[j].getValue(); 311 filterList.add(name); 312 } 313 314 if (type == null) { 315 type = PDFFilterList.DEFAULT_FILTER; 316 } 317 318 if (!filterList.isEmpty() && logger.isDebugEnabled()) { 319 StringBuffer debug = new StringBuffer ("Adding PDF filter"); 320 if (filterList.size() != 1) { 321 debug.append("s"); 322 } 323 debug.append(" for type ").append(type).append(": "); 324 for (int j = 0; j < filterList.size(); j++) { 325 if (j != 0) { 326 debug.append(", "); 327 } 328 debug.append(filterList.get(j)); 329 } 330 logger.debug(debug.toString()); 331 } 332 333 if (filterMap.get(type) != null) { 334 throw new ConfigurationException("A filterList of type '" 335 + type + "' has already been defined"); 336 } 337 filterMap.put(type, filterList); 338 } 339 return filterMap; 340 } 341 342 } 343 | Popular Tags |