package railo.runtime.text.pdf;
import java.io.IOException;
import java.util.Set;
import org.jpedal.PdfDecoder;
import org.jpedal.exception.PdfException;
import railo.commons.io.IOUtil;
import railo.commons.io.res.Resource;
import railo.runtime.exp.ExpressionException;
import railo.runtime.exp.PageException;
import railo.runtime.img.Image;
import railo.runtime.op.Caster;
public class PDF2ImageJPedal extends PDF2Image {
public void writeImages(byte[] input,Set pages,Resource outputDirectory, String prefix,String format, int scale,
boolean overwrite, boolean goodQuality,boolean transparent) throws PageException, IOException {
PdfDecoder dec = createPdfDecoder(input);
Resource res;
int count = dec.getPageCount();
for(int page=1;page<=count;page++) {
if(pages!=null && !pages.contains(Integer.valueOf(page)))continue;
//res=outputDirectory.getRealResource(prefix+"_page_"+page+"."+format);
res=createDestinationResource(outputDirectory,prefix,page,format,overwrite);
writeImage(dec,page,res,format,scale,overwrite,goodQuality, transparent);
}
}
private static void writeImage(PdfDecoder dec, int page, Resource destination,String format, int scale,
boolean overwrite, boolean goodQuality, boolean transparent) throws PageException, IOException {
if(scale<1 || scale>100)
throw new ExpressionException("invalid scale definition ["+Caster.toString(scale)+"], value should be in range from 1 to 100");
Image img=null;
try {
img = new Image(transparent?dec.getPageAsTransparentImage(page):dec.getPageAsImage(page));
} catch (PdfException e) {
throw Caster.toPageException(e);
}
if(scale!=100)
img.resize(scale, goodQuality?"highestquality":"highperformance", 1);
img.writeOut(destination,format, overwrite, 1f);
}
public Image toImage(byte[] input,int page) throws IOException, PageException {
try {
return new Image(createPdfDecoder(input).getPageAsImage(page));
} catch (PdfException e) {
throw Caster.toPageException(e);
}
}
private static PdfDecoder createPdfDecoder(Resource res) throws PageException,IOException {
return createPdfDecoder(IOUtil.toBytes(res));
}
private static PdfDecoder createPdfDecoder(byte[] input) throws PageException {
PdfDecoder decoder = new PdfDecoder(true);
decoder.useHiResScreenDisplay(true);
try {
decoder.openPdfArray(input);
} catch (PdfException e) {
throw Caster.toPageException(e);
}
return decoder;
}
}