1 26 27 package it.stefanochizzolini.clown.tokens; 28 29 import it.stefanochizzolini.clown.bytes.IOutputStream; 30 import it.stefanochizzolini.clown.files.File; 31 import it.stefanochizzolini.clown.files.IndirectObjects; 32 import it.stefanochizzolini.clown.objects.PdfDictionary; 33 import it.stefanochizzolini.clown.objects.PdfIndirectObject; 34 import it.stefanochizzolini.clown.objects.PdfInteger; 35 import it.stefanochizzolini.clown.objects.PdfLong; 36 import it.stefanochizzolini.clown.objects.PdfName; 37 import it.stefanochizzolini.clown.objects.PdfReference; 38 import java.io.EOFException ; 39 import java.util.Map ; 40 41 44 public class Writer 45 { 46 private File file; 50 private IOutputStream stream; 51 53 58 public Writer( 59 IOutputStream stream, 60 File file 61 ) 62 { 63 this.stream = stream; 64 this.file = file; 65 } 66 68 public IOutputStream getStream( 70 ) 71 {return stream;} 72 73 76 public void writeStandard( 77 ) 78 { 79 StringBuilder xrefBuilder = new StringBuilder (); 80 int xrefSize = file.getIndirectObjects().size(); 81 int offset; 82 83 { 85 offset = stream.write( 86 "%PDF-1.6\r" 87 + "%âãÏÓ\r" ); 89 } 90 91 { 93 99 StringBuilder xrefInUseBlockBuilder = new StringBuilder (); 100 IndirectObjects indirectObjects = file.getIndirectObjects(); 101 PdfReference freeReference = indirectObjects.get(0).getReference(); for( 103 int index = 1; 104 index < xrefSize; 105 index++ 106 ) 107 { 108 PdfIndirectObject indirectObject = indirectObjects.get(index); 109 if(indirectObject.isInUse()) { 112 xrefInUseBlockBuilder.append( 115 indirectObject.getReference().getCrossReference(offset) 116 ); 117 offset += indirectObject.writeTo(stream); 119 } 120 else { 122 xrefBuilder.append( 124 freeReference.getCrossReference(index) 125 + xrefInUseBlockBuilder.toString() 126 ); 127 xrefInUseBlockBuilder.setLength(0); 129 freeReference = indirectObject.getReference(); 130 } 131 } 132 xrefBuilder.append( 134 freeReference.getCrossReference(0) 135 + xrefInUseBlockBuilder.toString() 136 ); 137 } 138 139 { 141 stream.write( 143 "xref\r" 144 + "0 " + xrefSize + "\r" 145 ); 146 stream.write(xrefBuilder.toString()); 148 } 149 150 { 152 stream.write("trailer\r"); 154 PdfDictionary trailer = file.getTrailer(); 157 trailer.put(PdfName.Size,new PdfInteger(xrefSize)); 158 trailer.writeTo(stream); 160 stream.write( 162 "\r" 163 + "startxref\r" 164 + offset + "\r" 165 + "%%EOF" 166 ); 167 } 168 } 169 170 173 public void writeIncremental( 174 ) 175 { 176 StringBuilder xrefBuilder = new StringBuilder (); 177 int xrefSize = file.getIndirectObjects().size(); 178 int offset; 179 Parser parser = file.getReader().getParser(); 180 181 offset = stream.write(parser.getStream()); 183 184 { 186 190 StringBuilder xrefSubBuilder = new StringBuilder (); int xrefSubCount = 0; int prevKey = 0; for( 195 Map.Entry <Integer ,PdfIndirectObject> indirectObjectEntry : file.getIndirectObjects().getModifiedObjects().entrySet() 196 ) 197 { 198 203 if(indirectObjectEntry.getKey() - prevKey == 1 || prevKey == 0) { 205 xrefSubCount++; 206 } 207 else { 209 xrefBuilder.append( 211 (prevKey - xrefSubCount + 1) + " " + xrefSubCount + "\r" 212 + xrefSubBuilder.toString() 213 ); 214 xrefSubBuilder.setLength(0); 216 xrefSubCount = 1; 217 } 218 219 prevKey = indirectObjectEntry.getKey(); 220 221 if(indirectObjectEntry.getValue().isInUse()) { 224 xrefSubBuilder.append( 226 indirectObjectEntry.getValue().getReference().getCrossReference(offset) 227 ); 228 offset += indirectObjectEntry.getValue().writeTo(stream); 230 } 231 else { 233 239 xrefSubBuilder.append( 240 indirectObjectEntry.getValue().getReference().getCrossReference(0) 241 ); 242 } 243 } 244 xrefBuilder.append( 246 (prevKey - xrefSubCount + 1) + " " + xrefSubCount + "\r" 247 + xrefSubBuilder.toString() 248 ); 249 } 250 251 { 253 stream.write("xref\r"); 255 stream.write(xrefBuilder.toString()); 257 } 258 259 try 261 { 262 stream.write("trailer\r"); 264 PdfDictionary trailer = file.getTrailer(); 267 trailer.put(PdfName.Size,new PdfInteger(xrefSize)); 268 trailer.put(PdfName.Prev,new PdfLong(parser.retrieveXRefOffset())); 269 trailer.writeTo(stream); 271 stream.write( 273 "\r" 274 + "startxref\r" 275 + offset + "\r" 276 + "%%EOF" 277 ); 278 } 279 catch(Exception e) 280 { 281 throw new RuntimeException (e); 283 } 284 } 285 } | Popular Tags |