1 26 27 package it.stefanochizzolini.clown.tokens; 28 29 import it.stefanochizzolini.clown.bytes.IInputStream; 30 import it.stefanochizzolini.clown.files.File; 31 import it.stefanochizzolini.clown.objects.PdfDictionary; 32 import it.stefanochizzolini.clown.objects.PdfInteger; 33 import it.stefanochizzolini.clown.objects.PdfName; 34 import java.io.EOFException ; 35 36 39 public class Reader 40 { 41 private Parser parser; 45 47 52 public Reader( 53 IInputStream stream, 54 File file 55 ) 56 { 57 this.parser = new Parser(stream,file); 58 } 59 61 public int hashCode( 64 ) 65 {return parser.hashCode();} 66 67 public Parser getParser( 68 ) 69 {return parser;} 70 71 public PdfDictionary readTrailer( 72 ) throws FileFormatException 73 { 74 long xrefOffset = parser.retrieveXRefOffset(); 76 parser.seek(xrefOffset); parser.moveNext(); 78 if(!((String )parser.getToken()).equals("xref")) 79 throw new FileFormatException("'xref' keyword not found.",parser.getPosition()); 80 81 while(true) 83 { 84 parser.moveNext(); 85 if(parser.getTokenType() == TokenTypeEnum.Keyword) 86 break; 87 parser.moveNext(); 88 int count = (Integer )parser.getToken(); 89 parser.skip(count * 20); 90 } 91 if(!((String )parser.getToken()).equals("trailer")) 92 throw new FileFormatException("'trailer' keyword not found.",parser.getPosition()); 93 94 parser.moveNext(); 96 return (PdfDictionary)parser.parsePdfObject(); 97 } 98 99 103 public XRefEntry[] readXRefTable( 104 PdfDictionary trailer 105 ) throws FileFormatException 106 { 107 PdfInteger xrefTableSize = (PdfInteger)trailer.get(PdfName.Size); 110 XRefEntry[] xrefEntries = new XRefEntry[xrefTableSize.getValue()]; 112 113 parser.seek(parser.retrieveXRefOffset()); 116 readXRefSection(xrefEntries); 118 119 while(true) 121 { 122 PdfInteger prevXRefOffset = (PdfInteger)trailer.get(PdfName.Prev); 125 if(prevXRefOffset == null) 126 break; 127 parser.seek(prevXRefOffset.getValue()); 129 readXRefSection(xrefEntries); 131 132 parser.moveNext(); 135 trailer = (PdfDictionary)parser.parsePdfObject(); 137 } 138 139 return xrefEntries; 140 } 141 142 public String readVersion( 143 ) throws FileFormatException 144 { 145 return parser.retrieveVersion(); 146 } 147 149 protected void readXRefSection( 151 XRefEntry[] xrefEntries 152 ) throws FileFormatException 153 { 154 parser.moveNext(); 156 if(!((String )parser.getToken()).equals("xref")) 157 throw new FileFormatException("'xref' keyword not found.",parser.getPosition()); 158 159 while(true) 161 { 162 168 parser.moveNext(); 170 if((parser.getTokenType() == TokenTypeEnum.Keyword) 172 && ((String )parser.getToken()).equals("trailer")) 173 break; 174 if(parser.getTokenType() != TokenTypeEnum.Integer) 176 throw new FileFormatException("Neither object number of the first object in this xref subsection nor end of xref section found.",parser.getPosition()); 177 int startObjectNumber = (Integer )parser.getToken(); 179 180 parser.moveNext(); 182 if(parser.getTokenType() != TokenTypeEnum.Integer) 183 throw new FileFormatException("Number of entries in this xref subsection not found.",parser.getPosition()); 184 int endObjectNumber = (Integer )parser.getToken() + startObjectNumber; 186 187 for( 189 int index = startObjectNumber; 190 index < endObjectNumber; 191 index++ 192 ) 193 { 194 if(xrefEntries[index] == null) { 197 parser.moveNext(); 199 int offset = (Integer )parser.getToken(); 200 parser.moveNext(); 202 int generation = (Integer )parser.getToken(); 203 parser.moveNext(); 205 String usageToken = (String )parser.getToken(); 206 XRefEntryUsageEnum usage; 207 if(usageToken.equals("n")) 208 usage = XRefEntryUsageEnum.InUse; 209 else if(usageToken.equals("f")) 210 usage = XRefEntryUsageEnum.Free; 211 else 212 throw new FileFormatException("Invalid xref entry.",parser.getPosition()); 213 214 xrefEntries[index] = new XRefEntry( 216 index, 217 generation, 218 offset, 219 usage 220 ); 221 } 222 else { 224 parser.moveNext(3); 226 } 227 } 228 } 229 } 230 } | Popular Tags |