package uk.co.mmscomputing.imageio.pdf;
import java.io.*;
import java.util.*;
public class PDFStream extends PDFObject{
protected PDFDictionary dict = null;
protected InputStream data = null;
public PDFStream(){
this(new PDFDictionary());
}
public PDFStream(PDFDictionary d){
dict = d;
}
public void setInputStream(byte[] v){ data=new ByteArrayInputStream(v);}
public void setInputStream(InputStream v){ data=v;}
public InputStream getInputStream(){ return data;}
public void put(String key,PDFObject obj){ dict.put(key,obj);}
public PDFObject get(String key){ return dict.get(key);}
public void setFilter(String filter){
put("Filter",new PDFName(filter));
}
public void setFilters(String[] filters){ // i.e. /Filter [/ASCII85Decode /DCTDecode]
PDFArray filter=new PDFArray();
for(int i=0;i<filters.length;i++){
filter.add(new PDFName(filters[i]));
}
put("Filter",filter);
}
public String[] getFilters(){ // i.e. /Filter [/ASCII85Decode /DCTDecode]
PDFObject filter = get("Filter");
if(filter instanceof PDFObject.PDFName){
String[] filters = new String[1];
filters[0] = ((PDFObject.PDFName)filter).getName();
return filters;
}else if(filter instanceof PDFArray){
PDFArray fa = (PDFArray)filter;
String[] filters = new String[fa.size()];
for(int i=0;i<filters.length;i++){
filters[i]=((PDFObject.PDFName)fa.elementAt(i)).getName();
}
return filters;
}
throw new IllegalArgumentException(getClass().getName()+".getFilters:\n\t'Filter' has unknown type");
}
public void read(PDFScanner s)throws IOException{
PDFObject lenobj = dict.getObject("Length");
int length = ((PDFInteger)lenobj).getValue();
setInputStream(s.scanStream(length));
s.scan();
if(s.symbol!=T_ENDSTREAM){
throw new IOException(getClass().getName()+".read:\n\tCannot find keyword <endstream>.\nHave symbol = "+s.symbol+" and string = "+s.str);
}
s.scan();
}
private byte[] codeNone(InputStream data)throws IOException{
ByteArrayOutputStream out = new ByteArrayOutputStream();
int b;
while((b=data.read())!=-1){
out.write(b);
}
return out.toByteArray();
}
public void write(PDFFile out)throws IOException{
if(data==null){return;}
byte[] buffer;
PDFFilter.PDFEncoder encoder;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PDFObject filter = get("Filter");
if(filter == null){
buffer = codeNone(data);
}else if(filter instanceof PDFName){
encoder = PDFFilter.getEncoder(baos,dict,(PDFName)filter);
buffer = new byte[4*1024];
int len;
while((len=data.read(buffer))!=-1){
encoder.write(buffer,0,len);
}
encoder.close();
buffer = baos.toByteArray();
}else if(filter instanceof PDFArray){
encoder = PDFFilter.getEncoder(baos,dict,(PDFArray)filter);
buffer = new byte[4*1024];
int len;
while((len=data.read(buffer))!=-1){
encoder.write(buffer,0,len);
}
encoder.close();
buffer = baos.toByteArray();
}else{
throw new IOException(getClass().getName()+".write:\n\tUnknown filter object.");
}
put("Length",new PDFInteger(buffer.length));
dict.write(out);
out.write("stream\r\n");
out.write(buffer);
out.writeln("\rendstream");
}
public String toString(){
String s=dict.toString();
s+="stream\r\n...\rendstream";
return s;
}
}