package railo.runtime.text.pdf; import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Set; import org.icepdf.core.pobjects.Catalog; import org.icepdf.core.pobjects.Document; import org.icepdf.core.pobjects.PDimension; import org.icepdf.core.pobjects.PRectangle; import org.icepdf.core.pobjects.Page; import org.icepdf.core.util.GraphicsRenderingHints; 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 PDF2ImageICEpdf extends PDF2Image { public PDF2ImageICEpdf(){ Document.class.getName();// this is needed, that the class throws a error when the PDFRenderer.jar is not in the enviroment } @Override public Image toImage(byte[] input, int pageNumber) throws PageException { return toImage(input, pageNumber, 100,false); } public Image toImage(byte[] input, int pageNumber, int scale, boolean transparent) throws PageException { Document document = toDocument(input); BufferedImage bi=toBufferedImage(document,pageNumber,scale/100f,transparent); document.dispose(); return new Image(bi); } @Override public void writeImages(byte[] input, Set pages, Resource outputDirectory, String prefix, String format, int scale, boolean overwrite, boolean goodQuality, boolean transparent) throws PageException, IOException { if(scale<1) throw new ExpressionException("invalid scale definition ["+Caster.toString(scale)+"], value should be in range from 1 to n"); Document document = toDocument(input); try{ Resource res; int count = document.getNumberOfPages(); for(int page=1;page<=count;page++) { if(pages!=null && !pages.contains(Integer.valueOf(page)))continue; res=createDestinationResource(outputDirectory,prefix,page,format,overwrite); //res=outputDirectory.getRealResource(prefix+"_page_"+page+"."+format); writeImage(document,page,res,format,scale,overwrite,goodQuality, transparent); } } finally{ } document.dispose(); } private static void writeImage(Document document, int page, Resource destination,String format, int scale, boolean overwrite, boolean goodQuality, boolean transparent) throws PageException, IOException { BufferedImage bi=toBufferedImage(document,page,scale/100f,transparent); Image img = new Image(bi); img.writeOut(destination,format, overwrite, goodQuality?1f:0.5f); } private Document toDocument(byte[] input) throws PageException { Document document = new Document(); try { document.setByteArray(input, 0, input.length, null); } catch (Throwable t) { throw Caster.toPageException(t); } return document; } private static BufferedImage toBufferedImage(Document document, int pageNumber,float scale,boolean transparent) { System.getProperties().put("org.icepdf.core.screen.background", "VALUE_DRAW_NO_BACKGROUND"); Catalog cat = document.getCatalog(); Page page = cat.getPageTree().getPage(pageNumber-1, document); PDimension sz = page.getSize(Page.BOUNDARY_CROPBOX, 0f, scale); int pageWidth = (int) sz.getWidth(); int pageHeight = (int) sz.getHeight(); BufferedImage image = new BufferedImage(pageWidth, pageHeight, transparent?BufferedImage.TYPE_INT_ARGB:BufferedImage.TYPE_INT_RGB); Graphics g = image.createGraphics(); if (!transparent) { PRectangle pageBoundary = page.getPageBoundary(Page.BOUNDARY_CROPBOX); float x = 0 - pageBoundary.x; float y = 0 - (pageBoundary.y - pageBoundary.height); g.setColor(Color.WHITE); g.fillRect((int) (0 - x), (int) (0 - y), (int) pageBoundary.width, (int) pageBoundary.height); } page.paint(g, GraphicsRenderingHints.SCREEN, Page.BOUNDARY_CROPBOX, 0f, scale); g.dispose(); cat.getPageTree().releasePage(page, document); return image; } }