001    package railo.runtime.text.pdf;
002    
003    import java.io.IOException;
004    import java.util.Set;
005    
006    import org.jpedal.PdfDecoder;
007    import org.jpedal.exception.PdfException;
008    
009    import railo.commons.io.IOUtil;
010    import railo.commons.io.res.Resource;
011    import railo.runtime.exp.ExpressionException;
012    import railo.runtime.exp.PageException;
013    import railo.runtime.img.Image;
014    import railo.runtime.op.Caster;
015    
016    public class PDF2ImageJPedal extends PDF2Image {
017            
018            
019            public void writeImages(byte[] input,Set pages,Resource outputDirectory, String prefix,String format, int scale,
020                             boolean overwrite, boolean goodQuality,boolean transparent) throws  PageException, IOException {
021                     PdfDecoder dec = createPdfDecoder(input);
022                     Resource res;
023                     int count = dec.getPageCount();
024                     
025                     for(int page=1;page<=count;page++) {
026                             if(pages!=null && !pages.contains(Integer.valueOf(page)))continue;
027                             //res=outputDirectory.getRealResource(prefix+"_page_"+page+"."+format);
028                             res=createDestinationResource(outputDirectory,prefix,page,format,overwrite);
029                             writeImage(dec,page,res,format,scale,overwrite,goodQuality, transparent);
030                     }
031    
032             }
033    
034    
035    
036            private static void writeImage(PdfDecoder dec, int page, Resource destination,String format, int scale,
037                            boolean overwrite, boolean goodQuality, boolean transparent) throws PageException, IOException {
038                    if(scale<1 || scale>100) 
039                            throw new ExpressionException("invalid scale definition ["+Caster.toString(scale)+"], value should be in range from 1 to 100");
040                    
041                    
042                    Image img=null;
043                    try {
044                            img = new Image(transparent?dec.getPageAsTransparentImage(page):dec.getPageAsImage(page));
045                    } catch (PdfException e) {
046                            throw Caster.toPageException(e);
047                    }
048                    if(scale!=100)
049                            img.resize(scale, goodQuality?"highestquality":"highperformance", 1);
050                    img.writeOut(destination,format, overwrite, 1f);
051            }
052    
053    
054            public Image toImage(byte[] input,int page) throws IOException, PageException {
055                     try {
056                            return new Image(createPdfDecoder(input).getPageAsImage(page));
057                    } catch (PdfException e) {
058                            throw Caster.toPageException(e);
059                    }
060            }
061    
062            private static PdfDecoder createPdfDecoder(Resource res) throws PageException,IOException {
063                    return createPdfDecoder(IOUtil.toBytes(res));
064            }
065             
066            private static PdfDecoder createPdfDecoder(byte[] input) throws PageException  {
067                     PdfDecoder decoder = new PdfDecoder(true);
068                     decoder.useHiResScreenDisplay(true);
069                     try {
070                            decoder.openPdfArray(input);
071                    } catch (PdfException e) {
072                            throw Caster.toPageException(e);
073                    }
074                     return decoder;
075            }
076    
077    }