1 26 27 package it.stefanochizzolini.clown.objects; 28 29 import it.stefanochizzolini.clown.bytes.IOutputStream; 30 import it.stefanochizzolini.clown.files.File; 31 import it.stefanochizzolini.clown.tokens.Parser; 32 import it.stefanochizzolini.clown.tokens.XRefEntry; 33 import it.stefanochizzolini.clown.tokens.XRefEntryUsageEnum; 34 35 38 public class PdfIndirectObject 39 extends PdfObject 40 implements IPdfIndirectObject 41 { 42 private final String UsageFree = "f"; 46 private final String UsageInUse = "n"; 47 50 private PdfDataObject dataObject; 53 private File file; 54 private boolean original; 55 private PdfReference reference; 56 private XRefEntry xrefEntry; 57 59 71 public PdfIndirectObject( 72 File file, 73 PdfDataObject dataObject, 74 XRefEntry xrefEntry 75 ) 76 { 77 this.file = file; 78 this.dataObject = dataObject; 79 this.xrefEntry = xrefEntry; 80 81 this.original = (xrefEntry.getOffset() != 0); 82 this.reference = new PdfReference( 83 this, 84 xrefEntry.getNumber(), 85 xrefEntry.getGeneration() 86 ); 87 } 88 90 public File getFile( 93 ) 94 {return file;} 95 96 @Override 97 public int hashCode( 98 ) 99 { 100 106 return reference.getID().hashCode() ^ file.hashCode(); 107 } 108 109 public boolean isInUse( 110 ) 111 {return (xrefEntry.getUsage() == XRefEntryUsageEnum.InUse);} 112 113 public boolean isOriginal( 114 ) 115 {return original;} 116 117 public void update( 118 ) 119 { 120 if(original) 121 { 122 127 file.getIndirectObjects().update(this); 128 } 129 } 130 131 @Override 133 public Object clone( 134 File context 135 ) 136 {return context.getIndirectObjects().addExternal(this);} 137 138 public void delete( 139 ) 140 { 141 if(file != null) 142 { 143 148 file.getIndirectObjects().remove(xrefEntry.getNumber()); 149 } 150 } 151 152 public PdfDataObject getDataObject( 153 ) 154 { 155 if(dataObject == null) 156 { 157 165 166 if(xrefEntry.getUsage() == XRefEntryUsageEnum.Free) 169 return null; 170 171 try 173 { 174 Parser parser = file.getReader().getParser(); 175 parser.seek(xrefEntry.getOffset()); 177 parser.moveNext(4); 179 dataObject = parser.parsePdfObject(); 181 } 182 catch(Exception e) 183 {throw new RuntimeException (e);} 184 } 185 186 return dataObject; 187 } 188 189 public PdfIndirectObject getIndirectObject( 190 ) 191 {return this;} 192 193 public PdfReference getReference( 194 ) 195 {return reference;} 196 199 204 public void dropFile( 205 ) 206 {file = null;} 207 208 212 public void dropOriginal( 213 ) 214 {original = false;} 215 216 String getUsage( 217 ) 218 { 219 switch(xrefEntry.getUsage()) 220 { 221 case Free: 222 return UsageFree; 223 case InUse: 224 return UsageInUse; 225 default: throw new RuntimeException ("Invalid xref usage value."); 227 } 228 } 229 230 234 @Override 235 public int writeTo( 236 IOutputStream stream 237 ) 238 { 239 int size = stream.write(reference.getID() + " obj\n"); 241 242 size += getDataObject().writeTo(stream); 244 245 size += stream.write("\nendobj\n"); 247 248 return size; 249 } 250 } | Popular Tags |