1 26 27 package it.stefanochizzolini.clown.objects; 28 29 import it.stefanochizzolini.clown.bytes.Buffer; 30 import it.stefanochizzolini.clown.bytes.IBuffer; 31 import it.stefanochizzolini.clown.bytes.IOutputStream; 32 import it.stefanochizzolini.clown.bytes.filters.Filter; 33 import it.stefanochizzolini.clown.files.File; 34 import java.util.Iterator ; 35 36 39 public class PdfStream 40 extends PdfDataObject 41 { 42 private IBuffer body; 46 private PdfDictionary header; 47 49 public PdfStream( 51 ) 52 { 53 this( 54 new PdfDictionary(), 55 new Buffer() 56 ); 57 } 58 59 public PdfStream( 60 PdfDictionary header 61 ) 62 { 63 this( 64 header, 65 new Buffer() 66 ); 67 } 68 69 public PdfStream( 70 IBuffer body 71 ) 72 { 73 this( 74 new PdfDictionary(), 75 body 76 ); 77 } 78 79 public PdfStream( 80 PdfDictionary header, 81 IBuffer body 82 ) 83 { 84 this.header = header; 85 this.body = body; 86 } 87 89 @Override  92 public Object clone( 93 File context 94 ) 95 { 96 PdfStream clone = new PdfStream( 97 (PdfDictionary)header.clone(context), 98 body.clone() 99 ); 100 101 return clone; 102 } 103 104 107 public IBuffer getBody( 108 ) 109 { 110 115 return getBody(true); 116 } 117 118 122 public IBuffer getBody( 123 boolean decode 124 ) 125 { 126 if(decode) 127 { 128 132 PdfDirectObject filterObj = header.get(PdfName.Filter); 133 if(filterObj != null) 135 { 136 139 PdfDataObject filterDataObj = File.resolve(filterObj); 141 if(filterDataObj instanceof PdfName) {body.decode(Filter.get((PdfName)filterDataObj));} 143 else { 145 for( 146 Iterator <PdfDirectObject> iterator = ((PdfArray)filterDataObj).iterator(); 147 iterator.hasNext(); 148 filterObj = iterator.next() 149 ) 150 {body.decode(Filter.get((PdfName)File.resolve(filterObj)));} 151 } 152 153 header.put(PdfName.Filter,null); } 156 } 157 158 return body; 159 } 160 161 public PdfDictionary getHeader( 162 ) 163 {return header;} 164 166 @Override  168 int writeTo( 169 IOutputStream stream 170 ) 171 { 172 int size = 0; 173 boolean unencodedBody; 174 byte[] bodyData; 175 int bodyLength; 176 177 186 PdfDirectObject filterObj = header.get(PdfName.Filter); 187 if(filterObj == null) { 190 195 unencodedBody = true; 196 197 filterObj = PdfName.FlateDecode; bodyData = body.encode(Filter.get((PdfName)filterObj)); 201 bodyLength = bodyData.length; 203 header.put(PdfName.Filter,filterObj); 205 } 206 else { 208 unencodedBody = false; 209 210 bodyData = body.toByteArray(); 212 bodyLength = (int)body.getLength(); 214 } 215 header.put(PdfName.Length,new PdfLong(bodyLength)); 217 218 size += header.writeTo(stream); 219 220 if(unencodedBody) 222 { 223 ((PdfLong)header.get(PdfName.Length)).setValue(body.getLength()); 225 header.put(PdfName.Filter,null); 226 } 227 228 size += stream.write("\rstream\r"); 230 size += stream.write(bodyData); 231 size += stream.write("\rendstream"); 232 233 return size; 234 } 235 } | Popular Tags |