public PDFObject dereference() throws IOException {
        if (type == INDIRECT) {
            PDFObject obj = null;

            if (cache != null) {
                obj = (PDFObject) cache.get();
            }

            if (obj == null || obj.value == null) {
                if (owner == null) {
                    System.out.println("Bad seed (owner==null)!  Object=" + this);
                }

                obj = owner.dereference((PDFXref)value, getDecrypter());

                cache = new SoftReference<PDFObject>(obj);
            }

            return obj;
        } else {
            // not indirect, no need to dereference
            return this;
        }
    }