package uk.co.mmscomputing.imageio.pdf; import java.io.*; import java.util.*; public class PDFDictionary extends PDFObject{ private Vector list = new Vector(); public void put(String key,PDFObject obj){ if(obj instanceof PDFIndirectObject){ obj=new PDFIndirectReference((PDFIndirectObject)obj); } Enumeration e = list.elements(); while(e.hasMoreElements()){ PDFDictionaryEntry entry=(PDFDictionaryEntry)e.nextElement(); if(key.equals(entry.getKey())){ entry.obj=obj;return; } } list.add(new PDFDictionaryEntry(key,obj)); } public PDFObject get(String key){ Enumeration e = list.elements(); while(e.hasMoreElements()){ PDFDictionaryEntry entry=(PDFDictionaryEntry)e.nextElement(); if(key.equals(entry.getKey())){ return entry.getValue(); } } return null; } public PDFObject getObject(String key){ PDFObject obj = get(key); while(obj instanceof PDFIndirectReference){ obj = ((PDFIndirectReference)obj).getIndirectObject().getDirectObject(); } return obj; } public boolean checkNameEntry(String name, String value){ PDFObject obj = get(name); if(obj==null){return false;} if(!(obj instanceof PDFObject.PDFName)){return false;} return ((PDFObject.PDFName)obj).getName().equals(value); } public void read(PDFScanner s)throws IOException{ if(s.symbol==T_DICTIONARY_START){ // should have just scanned << T_DICTIONARY_START PDFObject key,obj; s.scan(); while(s.symbol!=T_DICTIONARY_END){ key = readObject(s); // System.err.println("key = "+key); if(!(key instanceof PDFName)){ throw new IOException(getClass().getName()+".read\n\tDictionary key must be of type NAME.\nSYMBOL = "+s.symbol+" "+key); } obj = readObject(s); if(obj==null){ throw new IOException(getClass().getName()+".read\n\tDictionary obj is missing.");} put(((PDFName)key).getName(),obj); // System.err.println("obj = "+obj); } if(s.symbol!=T_DICTIONARY_END){ throw new IOException(getClass().getName()+".read\n\tDictionary: Missing start >> ."); } }else{ throw new IOException(getClass().getName()+".read\n\tDictionary: Missing start << ."); } } public void write(PDFFile out)throws IOException{ out.writeln("<<"); Enumeration e = list.elements(); while(e.hasMoreElements()){ ((PDFDictionaryEntry)e.nextElement()).write(out); } out.writeln(">>"); } public String toString(){ String s="<<\n"; Enumeration e = list.elements(); while(e.hasMoreElements()){ s+=e.nextElement(); } s+=">>\n"; return s; } static public class PDFDictionaryEntry{ private PDFName key; private PDFObject obj; public PDFDictionaryEntry(String k,PDFObject o){ key=new PDFName(k);obj=o; } public String getKey(){ return key.getName();} public PDFObject getValue(){ return obj;} /* public void read(PDFScanner s)throws IOException{ key = readObject(s); if(!(key instanceof PDFName)){ throw new IllegalArgumentException(getClass().getName()+".read\n\tDictionary key must be of type NAME."); } obj = readObject(s); if(obj==null){ throw new IllegalArgumentException(getClass().getName()+".read\n\tDictionary obj is missing."); } } */ public void write(PDFFile out)throws IOException{ key.write(out); obj.write(out); if(!(obj instanceof PDFDictionary)){out.write("\n");} } public String toString(){ return key.toString()+obj.toString()+((obj instanceof PDFDictionary)?"":"\n"); } } }