package uk.co.mmscomputing.imageio.pdf; import java.io.*; import java.util.*; public class PDFCrossReferenceEntry implements PDFConstants{ // <in-use entry> ::= <byte offset> <generation number> n // <free entry> ::= <object number of next free object> <generation number> f private boolean isInUse; private int offset; private int objectNumber; private int generationNumber; private PDFIndirectObject object; /* public PDFCrossReferenceEntry(){ object = null; } */ public PDFCrossReferenceEntry(int objno){ isInUse=true; offset=0; objectNumber=objno; generationNumber=0; object = null; } public PDFCrossReferenceEntry(int nextobjno,int nextgenno){ // not in use isInUse=false; offset=0; objectNumber=nextobjno; generationNumber=nextgenno; object = null; } public void setOffset(int v){offset=v;} public int getOffset(){return offset;} public int getObjectNumber(){ return objectNumber;} public int getGenerationNumber(){ return generationNumber;} public void setObject(PDFIndirectObject v){object=v;} public PDFIndirectObject getObject(){return object;} public PDFObject getDirectObject(){ // System.err.println("PDFCrossReferenceEntry = "+toString()); return object.getDirectObject(); } public void read(PDFScanner s)throws IOException{ s.scan(); if(s.symbol!=T_INTEGER){throw new IOException(getClass().getName()+".read:\n\tSubsection Entry: Byte offset.");} offset = s.intval; s.scan(); if(s.symbol!=T_INTEGER){throw new IOException(getClass().getName()+".read:\n\tSubsection Entry: Generation number.");} generationNumber = s.intval; s.scan(); if(s.symbol==T_N){ // in-use entry isInUse = true; }else if(s.symbol==T_F){ // free entry isInUse = false; }else{ throw new IOException(getClass().getName()+".read:\n\tSubsection Entry: Missing <n>|<f> keyword."); } } private void write(PDFFile out,int size,int n)throws IOException{ byte[] number = new byte[size]; int i = size-1; while(n>0){ if(i<0){ throw new IllegalArgumentException(getClass().getName()+".write:\n\tNumber too big!"); } number[i]=(byte)('0'+(n%10)); n/=10; i--; } while(i>=0){ number[i]='0'; i--; } out.write(number); out.write(' '); } public void write(PDFFile out)throws IOException{ if(isInUse){ write(out,10,offset); write(out,5,generationNumber); out.write('n'); }else{ write(out,10,objectNumber); write(out,5,generationNumber); out.write('f'); } out.write(' '); // end of line sequence ' ''\n' | ' ''\r' | '\r''\n' out.write('\n'); } public String toString(){ String s = ""; if(isInUse){ s += offset+" "; s += generationNumber+" n"; }else{ s += objectNumber+" "; s += generationNumber+" f"; } return s; } }