Package railo.runtime.text.pdf

Source Code of railo.runtime.text.pdf.PDF2ImagePDFRenderer

package railo.runtime.text.pdf;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Set;

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 com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;

public class PDF2ImagePDFRenderer extends PDF2Image {
 
  public PDF2ImagePDFRenderer(){
    PDFFile.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 IOException {
   
    File file = File.createTempFile("pdf2img", "pdf");
   
    try{
      copy(input,file);
      PDFFile pdffile = toPDFFile(file);
     
          // draw a single page to an image
      PDFPage page = pdffile.getPage(pageNumber);
         
          return toImage(page,(int)page.getBBox().getWidth(),(int)page.getBBox().getHeight(),false);
       
   
    }
    finally{
      deleteEL(file);
    }
  }

  private static Image toImage(PDFPage page, int width, int height,boolean transparent) {
    int w = (int)page.getBBox().getWidth();
    int h = (int)page.getBBox().getHeight();
    java.awt.Rectangle rect = new java.awt.Rectangle(0,0,w,h);
       
        BufferedImage bi = Image.toBufferedImage(page.getImage(
                width, height, //width & height
                rect, // clip rect
                null, // null for the ImageObserver
                !transparent, // fill background with white
                true  // block until drawing is done
                ));
       
        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 {
   

    File file = File.createTempFile("pdf2img", "pdf");
    try{
      copy(input,file);
      PDFFile pdf = toPDFFile(file);
   
      Resource res;
      int count = pdf.getNumPages();
      
      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(pdf,page,res,format,scale,overwrite,goodQuality, transparent);
      }
    }
    finally{
      deleteEL(file);
    }
  }
 
  private static void writeImage(PDFFile pdf, int pageNumber, Resource destination,String format, int scale,
      boolean overwrite, boolean goodQuality, boolean transparent) throws PageException, IOException {
   
    PDFPage page = pdf.getPage(pageNumber);
   
    if(scale<1) throw new ExpressionException("scale ["+scale+"] should be at least 1");
   
    int width = (int)page.getBBox().getWidth();
    int height = (int)page.getBBox().getHeight();
    if(scale!=100){
      double s=(scale)/100d;
      width=  (int)((width)*s);
      height=  (int)((height)*s);
     
     
    }
    Image img=toImage(page, width, height,transparent);
    img.writeOut(destination,format, overwrite, 1f);
  }

  private PDFFile toPDFFile(File file) throws IOException {
    RandomAccessFile raf = new RandomAccessFile(file, "r");
        FileChannel channel = raf.getChannel();
        ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
        return new PDFFile(buf);

  }

  private void deleteEL(File file) {
    try{
    if(!file.delete())file.deleteOnExit();
    }
    catch(Throwable t){}
  }

  private void copy(byte[] input, File file) throws IOException {
    ByteArrayInputStream bais = new ByteArrayInputStream(input);
    FileOutputStream fos = new FileOutputStream(file);
    IOUtil.copy(bais, fos, true,true);
   
  }

}
TOP

Related Classes of railo.runtime.text.pdf.PDF2ImagePDFRenderer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.