1 4 5 package com.etymon.pjx.stream; 6 7 import java.io.*; 8 import java.util.*; 9 import com.etymon.pjx.*; 10 11 16 public class PdfDecodeStream { 17 18 protected static final PdfName PDFNAME_FILTER = new PdfName("Filter"); 19 protected static final PdfName PDFNAME_FLATEDECODE = new PdfName("FlateDecode"); 20 21 24 protected PdfManager _m; 25 26 29 protected PdfFlateFilter _flateFilter; 30 31 36 public PdfDecodeStream(PdfManager manager) { 37 _m = manager; 38 _flateFilter = new PdfFlateFilter(manager); 39 } 40 41 58 public PdfStream decode(PdfStream stream) throws IOException, PdfFormatException, PdfDecoderException { 59 synchronized (this) { 60 synchronized (_m) { 61 62 PdfManager m = _m; 63 64 List filters = getFilterList(m, stream.getDictionary().getMap()); 66 if (filters == null) { 67 return stream; 68 } 69 70 PdfStream filtered = stream; 73 for (Iterator t = filters.iterator(); t.hasNext(); ) { 74 75 Object obj = t.next(); 77 if ( !(obj instanceof PdfName) ) { 78 throw new PdfFormatException("Stream filter is not a name object."); 79 } 80 PdfName filter = (PdfName)obj; 81 82 if (filter.equals(_flateFilter.getName())) { 83 filtered = _flateFilter.decode(filtered); 84 } else { 85 throw new PdfDecoderNotSupportedException( 86 "Stream filter decoder \"" + 87 filter.getString() + "\" not supported."); 88 } 89 90 } 91 92 return filtered; 94 95 } 96 } 97 } 98 99 107 protected static void modifyFilterList(List filters, Map streamDict) throws PdfFormatException { 108 109 filters.remove(0); 111 112 if (filters.size() == 0) { 114 streamDict.remove(PDFNAME_FILTER); 115 } else { 116 streamDict.put(PDFNAME_FILTER, filters); 117 } 118 119 } 120 121 129 protected static List getFilterList(PdfManager manager, Map streamDict) throws IOException, PdfFormatException { 130 131 Object obj = streamDict.get(PDFNAME_FILTER); 132 if (PdfNull.isNull(obj)) { 133 return null; 134 } 135 if ( !(obj instanceof PdfObject) ) { 136 throw new PdfFormatException("Filter name is not a PDF object."); 137 } 138 obj = manager.getObjectIndirect((PdfObject)obj); 139 if (PdfNull.isNull(obj)) { 140 return null; 141 } 142 if ( ( !(obj instanceof PdfName) ) && 143 ( !(obj instanceof PdfArray) ) ) { 144 throw new PdfFormatException("Filter name is not a name or array."); 145 } 146 List filters; 147 if (obj instanceof PdfArray) { 148 filters = new ArrayList( ((PdfArray)obj).getList() ); 149 } else { 150 filters = new ArrayList(); 151 filters.add( (PdfName)obj ); 152 } 153 return filters; 154 155 } 156 157 } 158 | Popular Tags |