package uk.co.mmscomputing.imageio.pdf; import java.io.*; // no line in a pdf file may be longer than 255 chars // comment: from % until end of line; exception PDFString abstract public class PDFObject implements PDFConstants{ public void write(PDFFile out)throws IOException{ out.write(toString()); } // abstract public void read(PDFScanner in)throws IOException; public void read(PDFScanner in)throws IOException{ System.err.println("\n\nNOT IMPLEMENTED YET\n\n"); new Exception().printStackTrace(); } static public PDFObject readObject(PDFScanner s)throws IOException{ PDFObject obj = null; switch(s.symbol){ case T_STRING: obj = new PDFString(s.str); s.scan(); break; case T_NAME: obj = new PDFName(s.str); s.scan(); break; case T_TRUE: obj = new PDFBoolean(true); s.scan(); break; case T_FALSE: obj = new PDFBoolean(false); s.scan(); break; case T_NULL: obj = new PDFNull(); s.scan(); break; case T_INTEGER: obj = new PDFInteger(s.intval); s.scan(); break; case T_REAL: obj = new PDFReal(s.realval); s.scan(); break; case T_R: obj = new PDFIndirectReference(s.getIndirectObject(s.objectNumber,s.generationNumber)); s.scan(); break; case T_ARRAY_START:{ obj = new PDFArray(); obj.read(s); s.scan(); return obj; } case T_ARRAY_END: return null; case T_DICTIONARY_START:{ PDFDictionary dict = new PDFDictionary(); dict.read(s); s.scan(); if(s.symbol==T_STREAM){ if(dict.checkNameEntry("Type","XObject")){ return PDFXObject.readXObject(s,dict); } obj=new PDFStream(dict); obj.read(s); return obj; } return dict; } case T_DICTIONARY_END: return null; default: System.err.println("symbol = "+s.symbol); break; } return obj; } static public class PDFNull extends PDFObject{ public String toString(){ return "null";} } static public class PDFBoolean extends PDFObject{ private boolean value=true; public PDFBoolean(boolean v){ value=v; } public void setValue(boolean v){value=v;} public boolean getValue(){ return value;} public String toString(){ return (value)?"true ":"false ";} } static public class PDFInteger extends PDFObject{ private int value=0; public PDFInteger(int v){ value=v; } public void setValue(int v){value=v;} public int getValue(){ return value;} public String toString(){ return ""+value+" ";} } static public class PDFReal extends PDFObject{ private double value=0; public PDFReal(double v){ value=v; } public void setValue(double v){value=v;} public double getValue(){ return value;} public String toString(){ return ""+value+" ";} } static public class PDFString extends PDFObject{ private String value=""; public PDFString(String v){ value=v; } public void setValue(String v){value=v;} public String getValue(){ return value;} public String toString(){ String s="("; byte[] chars=value.getBytes(); for(int i=0;i<chars.length;i++){ // [2] Tab 4.1 char c=(char)chars[i]; switch(c){ case '\n': s+="\\n";break; case '\r': s+="\\r";break; case '\t': s+="\\t";break; case '\b': s+="\\b";break; case '\f': s+="\\f";break; case '(' : s+="\\(";break; case ')' : s+="\\)";break; case '\\': s+="\\\\";break; default: s+=c;break; } // to do: \ddd for non ascii characters } s+=") "; return s; } } static public class PDFHexString extends PDFObject{ private String value=""; public PDFHexString(String v){ value=v; } public void setValue(String v){ if((v.length()%2)==0){ value=v; }else{ value=v+"0"; } } public String getValue(){ return value;} public String toString(){ String s="<"; byte[] chars=value.getBytes(); for(int i=0;i<chars.length;i++){ byte c=chars[i]; if(('0'<=c)&&(c<='9')){ s+=c; }else if(('A'<=c)&&(c<='F')){ s+=c; }else if(('a'<=c)&&(c<='f')){ s+=c; } } s+="> "; return s; } } static public class PDFName extends PDFObject{ private String name=""; public PDFName(String name){ set(name); } public void set(String n){ name=""; byte[] chars=n.getBytes(); for(int i=0;i<chars.length;i++){ char c=(char)chars[i]; switch(c){ case '\n': case '\r': case '%': case '(':case ')': case '<':case '>': case '[':case ']': case '{':case '}': System.err.println(getClass().getName()+".set:\n\tInvalid character "+n); throw new IllegalArgumentException(getClass().getName()+".set\n\tInvalid character "+c); default: name+=c;break; } } } public String getName(){ return name;} public String toString(){ return "/"+name+" ";} public int hashCode(){ return name.hashCode();} public boolean equals(Object obj){ return obj.equals(name);} } // DecodeParams // ASCIIHexDecode, ASCII85Decode, LZWDecode, RunLengthDecode, CCITTFaxDecode, DCTDecode } // [2] PostScript Language Reference Manual, Second Edition